mirror of
https://github.com/go-i2p/go-i2ptunnel.git
synced 2025-12-20 15:15:52 -05:00
Fix UDP handler in SOCKS
This commit is contained in:
@@ -1,15 +1,19 @@
|
|||||||
package socks
|
package socks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"github.com/go-i2p/go-forward/config"
|
"github.com/go-i2p/go-forward/config"
|
||||||
"github.com/go-i2p/go-forward/packet"
|
"github.com/go-i2p/go-forward/packet"
|
||||||
"github.com/go-i2p/go-forward/stream"
|
"github.com/go-i2p/go-forward/stream"
|
||||||
|
"github.com/go-i2p/i2pkeys"
|
||||||
"github.com/txthinking/socks5"
|
"github.com/txthinking/socks5"
|
||||||
)
|
)
|
||||||
|
|
||||||
var socksHandler socks5.Handler = &SOCKS{}
|
var socksHandler socks5.Handler = &SOCKS{}
|
||||||
|
var forwardConfig = config.DefaultConfig()
|
||||||
|
|
||||||
// TCPHandle implements socks5.Handler.
|
// TCPHandle implements socks5.Handler.
|
||||||
func (s *SOCKS) TCPHandle(_ *socks5.Server, conn *net.TCPConn, req *socks5.Request) error {
|
func (s *SOCKS) TCPHandle(_ *socks5.Server, conn *net.TCPConn, req *socks5.Request) error {
|
||||||
@@ -20,28 +24,38 @@ func (s *SOCKS) TCPHandle(_ *socks5.Server, conn *net.TCPConn, req *socks5.Reque
|
|||||||
}
|
}
|
||||||
defer i2pConn.Close()
|
defer i2pConn.Close()
|
||||||
|
|
||||||
// Forward data between TCP and I2P connections
|
ctx := context.Background()
|
||||||
err = stream.Forward(nil, conn, i2pConn, config.DefaultConfig())
|
err = stream.Forward(ctx, conn, i2pConn, forwardConfig)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDPHandle implements socks5.Handler.
|
// UDPHandle implements socks5.Handler.
|
||||||
func (s *SOCKS) UDPHandle(_ *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram) error {
|
func (s *SOCKS) UDPHandle(_ *socks5.Server, addr *net.UDPAddr, data *socks5.Datagram) error {
|
||||||
// Connect to destination through I2P
|
// Connect to destination through I2P
|
||||||
i2pConn, err := s.Garlic.DialRemote("udp", d.Address())
|
i2pConn, err := s.Garlic.DialRemote("udp", data.Address())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer i2pConn.Close()
|
defer i2pConn.Close()
|
||||||
|
|
||||||
// Create UDP connection back to client
|
remoteAddr, err := i2pkeys.Lookup(data.Address())
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to lookup remote address: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send initial datagram
|
||||||
|
if _, err := i2pConn.WriteTo(data.Data, remoteAddr); err != nil {
|
||||||
|
return fmt.Errorf("failed to write initial datagram: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up UDP connection for replies
|
||||||
conn, err := net.DialUDP("udp", nil, addr)
|
conn, err := net.DialUDP("udp", nil, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
// Forward packets between UDP and I2P connections
|
// Forward subsequent packets
|
||||||
err = packet.Forward(nil, conn, i2pConn, config.DefaultConfig())
|
ctx := context.Background()
|
||||||
return err
|
return packet.Forward(ctx, conn, i2pConn, forwardConfig)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ func (s *SOCKS) Start() error {
|
|||||||
s.Server = server
|
s.Server = server
|
||||||
s.I2PTunnelStatus = i2ptunnel.I2PTunnelStatusStarting
|
s.I2PTunnelStatus = i2ptunnel.I2PTunnelStatusStarting
|
||||||
s.Server.Handle = s
|
s.Server.Handle = s
|
||||||
|
s.I2PTunnelStatus = i2ptunnel.I2PTunnelStatusRunning
|
||||||
s.Server.ListenAndServe(s)
|
s.Server.ListenAndServe(s)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user