diff --git a/tunnel/adapter/server.go b/tunnel/adapter/server.go index ee29137..de4f4cd 100644 --- a/tunnel/adapter/server.go +++ b/tunnel/adapter/server.go @@ -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{ diff --git a/tunnel/tproxy/server.go b/tunnel/tproxy/server.go index b20c22a..a2ec62b 100644 --- a/tunnel/tproxy/server.go +++ b/tunnel/tproxy/server.go @@ -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) } diff --git a/tunnel/tproxy/udp.go b/tunnel/tproxy/udp.go index a0b193c..d8ff51d 100644 --- a/tunnel/tproxy/udp.go +++ b/tunnel/tproxy/udp.go @@ -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)