@@ -37,6 +37,11 @@ type RoutineSpawner interface {
3737 SpawnRoutine (vt * VirtualTun )
3838}
3939
40+ type addressPort struct {
41+ address string
42+ port uint16
43+ }
44+
4045// LookupAddr lookups a hostname.
4146// DNS traffic may or may not be routed depending on VirtualTun's setting
4247func (d VirtualTun ) LookupAddr (ctx context.Context , name string ) ([]string , error ) {
@@ -47,29 +52,7 @@ func (d VirtualTun) LookupAddr(ctx context.Context, name string) ([]string, erro
4752 }
4853}
4954
50- // ResolveAddrPort resolves a hostname and returns an AddrPort.
51- // DNS traffic may or may not be routed depending on VirtualTun's setting
52- func (d VirtualTun ) ResolveAddrPort (saddr string ) (* netip.AddrPort , error ) {
53- name , sport , err := net .SplitHostPort (saddr )
54- if err != nil {
55- return nil , err
56- }
57-
58- addr , err := d .ResolveAddrWithContext (context .Background (), name )
59- if err != nil {
60- return nil , err
61- }
62-
63- port , err := strconv .Atoi (sport )
64- if err != nil || port < 0 || port > 65535 {
65- return nil , & net.OpError {Op : "dial" , Err : errors .New ("port must be numeric" )}
66- }
67-
68- addrPort := netip .AddrPortFrom (* addr , uint16 (port ))
69- return & addrPort , nil
70- }
71-
72- // ResolveAddrPort resolves a hostname and returns an AddrPort.
55+ // ResolveAddrPortWithContext resolves a hostname and returns an AddrPort.
7356// DNS traffic may or may not be routed depending on VirtualTun's setting
7457func (d VirtualTun ) ResolveAddrWithContext (ctx context.Context , name string ) (* netip.Addr , error ) {
7558 addrs , err := d .LookupAddr (ctx , name )
@@ -101,7 +84,7 @@ func (d VirtualTun) ResolveAddrWithContext(ctx context.Context, name string) (*n
10184 return & addr , nil
10285}
10386
104- // ResolveAddrPort resolves a hostname and returns an IP.
87+ // Resolve resolves a hostname and returns an IP.
10588// DNS traffic may or may not be routed depending on VirtualTun's setting
10689func (d VirtualTun ) Resolve (ctx context.Context , name string ) (context.Context , net.IP , error ) {
10790 addr , err := d .ResolveAddrWithContext (ctx , name )
@@ -112,6 +95,30 @@ func (d VirtualTun) Resolve(ctx context.Context, name string) (context.Context,
11295 return ctx , addr .AsSlice (), nil
11396}
11497
98+ func parseAddressPort (endpoint string ) (* addressPort , error ) {
99+ name , sport , err := net .SplitHostPort (endpoint )
100+ if err != nil {
101+ return nil , err
102+ }
103+
104+ port , err := strconv .Atoi (sport )
105+ if err != nil || port < 0 || port > 65535 {
106+ return nil , & net.OpError {Op : "dial" , Err : errors .New ("port must be numeric" )}
107+ }
108+
109+ return & addressPort {address : name , port : uint16 (port )}, nil
110+ }
111+
112+ func (d VirtualTun ) resolveToAddrPort (endpoint * addressPort ) (* netip.AddrPort , error ) {
113+ addr , err := d .ResolveAddrWithContext (context .Background (), endpoint .address )
114+ if err != nil {
115+ return nil , err
116+ }
117+
118+ addrPort := netip .AddrPortFrom (* addr , endpoint .port )
119+ return & addrPort , nil
120+ }
121+
115122// Spawns a socks5 server.
116123func (config * Socks5Config ) SpawnRoutine (vt * VirtualTun ) {
117124 conf := & socks5.Config {Dial : vt .tnet .DialContext , Resolver : vt }
@@ -150,8 +157,16 @@ func connForward(bufSize int, from io.ReadWriteCloser, to io.ReadWriteCloser) {
150157}
151158
152159// tcpClientForward starts a new connection via wireguard and forward traffic from `conn`
153- func tcpClientForward (tnet * netstack.Net , target * net.TCPAddr , conn net.Conn ) {
154- sconn , err := tnet .DialTCP (target )
160+ func tcpClientForward (vt * VirtualTun , raddr * addressPort , conn net.Conn ) {
161+ target , err := vt .resolveToAddrPort (raddr )
162+ if err != nil {
163+ errorLogger .Printf ("TCP Server Tunnel to %s: %s\n " , target , err .Error ())
164+ return
165+ }
166+
167+ tcpAddr := TCPAddrFromAddrPort (* target )
168+
169+ sconn , err := vt .tnet .DialTCP (tcpAddr )
155170 if err != nil {
156171 errorLogger .Printf ("TCP Client Tunnel to %s: %s\n " , target , err .Error ())
157172 return
@@ -163,11 +178,10 @@ func tcpClientForward(tnet *netstack.Net, target *net.TCPAddr, conn net.Conn) {
163178
164179// Spawns a local TCP server which acts as a proxy to the specified target
165180func (conf * TCPClientTunnelConfig ) SpawnRoutine (vt * VirtualTun ) {
166- raddr , err := vt . ResolveAddrPort (conf .Target )
181+ raddr , err := parseAddressPort (conf .Target )
167182 if err != nil {
168183 log .Fatal (err )
169184 }
170- tcpAddr := TCPAddrFromAddrPort (* raddr )
171185
172186 server , err := net .ListenTCP ("tcp" , conf .BindAddress )
173187 if err != nil {
@@ -179,13 +193,21 @@ func (conf *TCPClientTunnelConfig) SpawnRoutine(vt *VirtualTun) {
179193 if err != nil {
180194 log .Fatal (err )
181195 }
182- go tcpClientForward (vt . tnet , tcpAddr , conn )
196+ go tcpClientForward (vt , raddr , conn )
183197 }
184198}
185199
186200// tcpServerForward starts a new connection locally and forward traffic from `conn`
187- func tcpServerForward (target * net.TCPAddr , conn net.Conn ) {
188- sconn , err := net .DialTCP ("tcp" , nil , target )
201+ func tcpServerForward (vt * VirtualTun , raddr * addressPort , conn net.Conn ) {
202+ target , err := vt .resolveToAddrPort (raddr )
203+ if err != nil {
204+ errorLogger .Printf ("TCP Server Tunnel to %s: %s\n " , target , err .Error ())
205+ return
206+ }
207+
208+ tcpAddr := TCPAddrFromAddrPort (* target )
209+
210+ sconn , err := net .DialTCP ("tcp" , nil , tcpAddr )
189211 if err != nil {
190212 errorLogger .Printf ("TCP Server Tunnel to %s: %s\n " , target , err .Error ())
191213 return
@@ -197,11 +219,10 @@ func tcpServerForward(target *net.TCPAddr, conn net.Conn) {
197219
198220// Spawns a TCP server on wireguard which acts as a proxy to the specified target
199221func (conf * TCPServerTunnelConfig ) SpawnRoutine (vt * VirtualTun ) {
200- raddr , err := vt . ResolveAddrPort (conf .Target )
222+ raddr , err := parseAddressPort (conf .Target )
201223 if err != nil {
202224 log .Fatal (err )
203225 }
204- tcpAddr := TCPAddrFromAddrPort (* raddr )
205226
206227 addr := & net.TCPAddr {Port : conf .ListenPort }
207228 server , err := vt .tnet .ListenTCP (addr )
@@ -214,6 +235,6 @@ func (conf *TCPServerTunnelConfig) SpawnRoutine(vt *VirtualTun) {
214235 if err != nil {
215236 log .Fatal (err )
216237 }
217- go tcpServerForward (tcpAddr , conn )
238+ go tcpServerForward (vt , raddr , conn )
218239 }
219240}
0 commit comments