fix tproxy ipv6 udp relaying

This commit is contained in:
Page Fault
2021-01-05 03:16:41 +00:00
parent 2ecaed056a
commit 8d5d06bd63
3 changed files with 6 additions and 1 deletions
+2
View File
@@ -100,10 +100,12 @@ func NewServer(ctx context.Context, _ tunnel.Server) (*Server, error) {
addr := tunnel.NewAddressFromHostPort("tcp", cfg.LocalHost, cfg.LocalPort)
tcpListener, err := net.Listen("tcp", addr.String())
if err != nil {
cancel()
return nil, common.NewError("adapter failed to create tcp listener").Base(err)
}
udpListener, err := net.ListenPacket("udp", addr.String())
if err != nil {
cancel()
return nil, common.NewError("adapter failed to create tcp listener").Base(err)
}
server := &Server{
+3
View File
@@ -197,6 +197,7 @@ func NewServer(ctx context.Context, _ tunnel.Server) (*Server, error) {
listenAddr := tunnel.NewAddressFromHostPort("tcp", cfg.LocalHost, cfg.LocalPort)
ip, err := listenAddr.ResolveIP()
if err != nil {
cancel()
return nil, common.NewError("invalid tproxy local address").Base(err)
}
tcpListener, err := ListenTCP("tcp", &net.TCPAddr{
@@ -204,6 +205,7 @@ func NewServer(ctx context.Context, _ tunnel.Server) (*Server, error) {
Port: cfg.LocalPort,
})
if err != nil {
cancel()
return nil, common.NewError("tproxy failed to listen tcp").Base(err)
}
@@ -212,6 +214,7 @@ func NewServer(ctx context.Context, _ tunnel.Server) (*Server, error) {
Port: cfg.LocalPort,
})
if err != nil {
cancel()
return nil, common.NewError("tproxy failed to listen udp").Base(err)
}
+1 -1
View File
@@ -60,7 +60,7 @@ func ReadFromUDP(conn *net.UDPConn, b []byte) (int, *net.UDPAddr, *net.UDPAddr,
var originalDst *net.UDPAddr
for _, msg := range msgs {
if msg.Header.Level == syscall.SOL_IP && msg.Header.Type == syscall.IP_RECVORIGDSTADDR {
if (msg.Header.Level == syscall.SOL_IP || msg.Header.Level == syscall.SOL_IPV6) && msg.Header.Type == syscall.IP_RECVORIGDSTADDR {
originalDstRaw := &syscall.RawSockaddrInet4{}
if err = binary.Read(bytes.NewReader(msg.Data), binary.LittleEndian, originalDstRaw); err != nil {
return 0, nil, nil, fmt.Errorf("reading original destination address: %s", err)