Fix: should prehandle metadata before resolve
This commit is contained in:
parent
72c0af9739
commit
dcf97ff5b4
@ -75,6 +75,10 @@ func (m *Metadata) SourceAddress() string {
|
|||||||
return net.JoinHostPort(m.SrcIP.String(), m.SrcPort)
|
return net.JoinHostPort(m.SrcIP.String(), m.SrcPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Metadata) Resolved() bool {
|
||||||
|
return m.DstIP != nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Metadata) UDPAddr() *net.UDPAddr {
|
func (m *Metadata) UDPAddr() *net.UDPAddr {
|
||||||
if m.NetWork != UDP || m.DstIP == nil {
|
if m.NetWork != UDP || m.DstIP == nil {
|
||||||
return nil
|
return nil
|
||||||
|
@ -132,8 +132,8 @@ func (t *Tunnel) needLookupIP(metadata *C.Metadata) bool {
|
|||||||
return dns.DefaultResolver != nil && (dns.DefaultResolver.IsMapping() || dns.DefaultResolver.FakeIPEnabled()) && metadata.Host == "" && metadata.DstIP != nil
|
return dns.DefaultResolver != nil && (dns.DefaultResolver.IsMapping() || dns.DefaultResolver.FakeIPEnabled()) && metadata.Host == "" && metadata.DstIP != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Tunnel) resolveMetadata(metadata *C.Metadata) (C.Proxy, C.Rule, error) {
|
func (t *Tunnel) preHandleMetadata(metadata *C.Metadata) error {
|
||||||
// handle host equal IP string
|
// handle IP string on host
|
||||||
if ip := net.ParseIP(metadata.Host); ip != nil {
|
if ip := net.ParseIP(metadata.Host); ip != nil {
|
||||||
metadata.DstIP = ip
|
metadata.DstIP = ip
|
||||||
}
|
}
|
||||||
@ -147,9 +147,15 @@ func (t *Tunnel) resolveMetadata(metadata *C.Metadata) (C.Proxy, C.Rule, error)
|
|||||||
if dns.DefaultResolver.FakeIPEnabled() {
|
if dns.DefaultResolver.FakeIPEnabled() {
|
||||||
metadata.DstIP = nil
|
metadata.DstIP = nil
|
||||||
}
|
}
|
||||||
|
} else if dns.DefaultResolver.IsFakeIP(metadata.DstIP) {
|
||||||
|
return fmt.Errorf("fake DNS record %s missing", metadata.DstIP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tunnel) resolveMetadata(metadata *C.Metadata) (C.Proxy, C.Rule, error) {
|
||||||
var proxy C.Proxy
|
var proxy C.Proxy
|
||||||
var rule C.Rule
|
var rule C.Rule
|
||||||
switch t.mode {
|
switch t.mode {
|
||||||
@ -175,7 +181,15 @@ func (t *Tunnel) handleUDPConn(packet *inbound.PacketAdapter) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if metadata.DstIP == nil {
|
if err := t.preHandleMetadata(metadata); err != nil {
|
||||||
|
log.Debugln("[Metadata PreHandle] error: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
key := packet.LocalAddr().String()
|
||||||
|
pc := t.natTable.Get(key)
|
||||||
|
if pc != nil {
|
||||||
|
if !metadata.Resolved() {
|
||||||
ip, err := t.resolveIP(metadata.Host)
|
ip, err := t.resolveIP(metadata.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnln("[UDP] Resolve %s failed: %s, %#v", metadata.Host, err.Error(), metadata)
|
log.Warnln("[UDP] Resolve %s failed: %s, %#v", metadata.Host, err.Error(), metadata)
|
||||||
@ -184,12 +198,7 @@ func (t *Tunnel) handleUDPConn(packet *inbound.PacketAdapter) {
|
|||||||
metadata.DstIP = ip
|
metadata.DstIP = ip
|
||||||
}
|
}
|
||||||
|
|
||||||
key := packet.LocalAddr().String()
|
t.handleUDPToRemote(packet, pc, metadata.UDPAddr())
|
||||||
|
|
||||||
pc := t.natTable.Get(key)
|
|
||||||
addr := metadata.UDPAddr()
|
|
||||||
if pc != nil {
|
|
||||||
t.handleUDPToRemote(packet, pc, addr)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +245,14 @@ func (t *Tunnel) handleUDPConn(packet *inbound.PacketAdapter) {
|
|||||||
wg.Wait()
|
wg.Wait()
|
||||||
pc := t.natTable.Get(key)
|
pc := t.natTable.Get(key)
|
||||||
if pc != nil {
|
if pc != nil {
|
||||||
t.handleUDPToRemote(packet, pc, addr)
|
if !metadata.Resolved() {
|
||||||
|
ip, err := dns.ResolveIP(metadata.Host)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
metadata.DstIP = ip
|
||||||
|
}
|
||||||
|
t.handleUDPToRemote(packet, pc, metadata.UDPAddr())
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@ -250,6 +266,11 @@ func (t *Tunnel) handleTCPConn(localConn C.ServerAdapter) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := t.preHandleMetadata(metadata); err != nil {
|
||||||
|
log.Debugln("[Metadata PreHandle] error: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
proxy, rule, err := t.resolveMetadata(metadata)
|
proxy, rule, err := t.resolveMetadata(metadata)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnln("Parse metadata failed: %v", err)
|
log.Warnln("Parse metadata failed: %v", err)
|
||||||
|
Reference in New Issue
Block a user