Fix: TPROXY fakeip (#572)
This commit is contained in:
@ -35,8 +35,7 @@ func NewRedirUDPProxy(addr string) (*RedirUDPListener, error) {
|
||||
oob := make([]byte, 1024)
|
||||
for {
|
||||
buf := pool.BufPool.Get().([]byte)
|
||||
|
||||
n, oobn, _, remoteAddr, err := c.ReadMsgUDP(buf, oob)
|
||||
n, oobn, _, lAddr, err := c.ReadMsgUDP(buf, oob)
|
||||
if err != nil {
|
||||
pool.BufPool.Put(buf[:cap(buf)])
|
||||
if rl.closed {
|
||||
@ -45,11 +44,11 @@ func NewRedirUDPProxy(addr string) (*RedirUDPListener, error) {
|
||||
continue
|
||||
}
|
||||
|
||||
origDst, err := getOrigDst(oob, oobn)
|
||||
rAddr, err := getOrigDst(oob, oobn)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
handleRedirUDP(l, buf[:n], remoteAddr, origDst)
|
||||
handleRedirUDP(l, buf[:n], lAddr, rAddr)
|
||||
}
|
||||
}()
|
||||
|
||||
@ -65,13 +64,11 @@ func (l *RedirUDPListener) Address() string {
|
||||
return l.address
|
||||
}
|
||||
|
||||
func handleRedirUDP(pc net.PacketConn, buf []byte, addr *net.UDPAddr, origDst *net.UDPAddr) {
|
||||
target := socks5.ParseAddrToSocksAddr(origDst)
|
||||
|
||||
func handleRedirUDP(pc net.PacketConn, buf []byte, lAddr *net.UDPAddr, rAddr *net.UDPAddr) {
|
||||
target := socks5.ParseAddrToSocksAddr(rAddr)
|
||||
packet := &fakeConn{
|
||||
PacketConn: pc,
|
||||
origDst: origDst,
|
||||
rAddr: addr,
|
||||
lAddr: lAddr,
|
||||
buf: buf,
|
||||
}
|
||||
tunnel.AddPacket(adapters.NewPacket(target, packet, C.REDIR))
|
||||
|
@ -8,18 +8,17 @@ import (
|
||||
|
||||
type fakeConn struct {
|
||||
net.PacketConn
|
||||
origDst net.Addr
|
||||
rAddr net.Addr
|
||||
buf []byte
|
||||
lAddr *net.UDPAddr
|
||||
buf []byte
|
||||
}
|
||||
|
||||
func (c *fakeConn) Data() []byte {
|
||||
return c.buf
|
||||
}
|
||||
|
||||
// WriteBack opens a new socket binding `origDst` to wirte UDP packet back
|
||||
// WriteBack opens a new socket binding `addr` to wirte UDP packet back
|
||||
func (c *fakeConn) WriteBack(b []byte, addr net.Addr) (n int, err error) {
|
||||
tc, err := dialUDP("udp", c.origDst.(*net.UDPAddr), c.rAddr.(*net.UDPAddr))
|
||||
tc, err := dialUDP("udp", addr.(*net.UDPAddr), c.lAddr)
|
||||
if err != nil {
|
||||
n = 0
|
||||
return
|
||||
@ -31,7 +30,7 @@ func (c *fakeConn) WriteBack(b []byte, addr net.Addr) (n int, err error) {
|
||||
|
||||
// LocalAddr returns the source IP/Port of UDP Packet
|
||||
func (c *fakeConn) LocalAddr() net.Addr {
|
||||
return c.rAddr
|
||||
return c.lAddr
|
||||
}
|
||||
|
||||
func (c *fakeConn) Close() error {
|
||||
|
Reference in New Issue
Block a user