mirror of
https://github.com/p4gefau1t/trojan-go.git
synced 2024-04-21 12:21:34 +00:00
fix tproxy ipv6 udp relaying
This commit is contained in:
@@ -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{
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user