@@ -37,6 +37,11 @@ type RoutineSpawner interface {
37
37
SpawnRoutine (vt * VirtualTun )
38
38
}
39
39
40
+ type addressPort struct {
41
+ address string
42
+ port uint16
43
+ }
44
+
40
45
// LookupAddr lookups a hostname.
41
46
// DNS traffic may or may not be routed depending on VirtualTun's setting
42
47
func (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
47
52
}
48
53
}
49
54
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.
73
56
// DNS traffic may or may not be routed depending on VirtualTun's setting
74
57
func (d VirtualTun ) ResolveAddrWithContext (ctx context.Context , name string ) (* netip.Addr , error ) {
75
58
addrs , err := d .LookupAddr (ctx , name )
@@ -101,7 +84,7 @@ func (d VirtualTun) ResolveAddrWithContext(ctx context.Context, name string) (*n
101
84
return & addr , nil
102
85
}
103
86
104
- // ResolveAddrPort resolves a hostname and returns an IP.
87
+ // Resolve resolves a hostname and returns an IP.
105
88
// DNS traffic may or may not be routed depending on VirtualTun's setting
106
89
func (d VirtualTun ) Resolve (ctx context.Context , name string ) (context.Context , net.IP , error ) {
107
90
addr , err := d .ResolveAddrWithContext (ctx , name )
@@ -112,6 +95,30 @@ func (d VirtualTun) Resolve(ctx context.Context, name string) (context.Context,
112
95
return ctx , addr .AsSlice (), nil
113
96
}
114
97
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
+
115
122
// Spawns a socks5 server.
116
123
func (config * Socks5Config ) SpawnRoutine (vt * VirtualTun ) {
117
124
conf := & socks5.Config {Dial : vt .tnet .DialContext , Resolver : vt }
@@ -150,8 +157,16 @@ func connForward(bufSize int, from io.ReadWriteCloser, to io.ReadWriteCloser) {
150
157
}
151
158
152
159
// 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 )
155
170
if err != nil {
156
171
errorLogger .Printf ("TCP Client Tunnel to %s: %s\n " , target , err .Error ())
157
172
return
@@ -163,11 +178,10 @@ func tcpClientForward(tnet *netstack.Net, target *net.TCPAddr, conn net.Conn) {
163
178
164
179
// Spawns a local TCP server which acts as a proxy to the specified target
165
180
func (conf * TCPClientTunnelConfig ) SpawnRoutine (vt * VirtualTun ) {
166
- raddr , err := vt . ResolveAddrPort (conf .Target )
181
+ raddr , err := parseAddressPort (conf .Target )
167
182
if err != nil {
168
183
log .Fatal (err )
169
184
}
170
- tcpAddr := TCPAddrFromAddrPort (* raddr )
171
185
172
186
server , err := net .ListenTCP ("tcp" , conf .BindAddress )
173
187
if err != nil {
@@ -179,13 +193,21 @@ func (conf *TCPClientTunnelConfig) SpawnRoutine(vt *VirtualTun) {
179
193
if err != nil {
180
194
log .Fatal (err )
181
195
}
182
- go tcpClientForward (vt . tnet , tcpAddr , conn )
196
+ go tcpClientForward (vt , raddr , conn )
183
197
}
184
198
}
185
199
186
200
// 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 )
189
211
if err != nil {
190
212
errorLogger .Printf ("TCP Server Tunnel to %s: %s\n " , target , err .Error ())
191
213
return
@@ -197,11 +219,10 @@ func tcpServerForward(target *net.TCPAddr, conn net.Conn) {
197
219
198
220
// Spawns a TCP server on wireguard which acts as a proxy to the specified target
199
221
func (conf * TCPServerTunnelConfig ) SpawnRoutine (vt * VirtualTun ) {
200
- raddr , err := vt . ResolveAddrPort (conf .Target )
222
+ raddr , err := parseAddressPort (conf .Target )
201
223
if err != nil {
202
224
log .Fatal (err )
203
225
}
204
- tcpAddr := TCPAddrFromAddrPort (* raddr )
205
226
206
227
addr := & net.TCPAddr {Port : conf .ListenPort }
207
228
server , err := vt .tnet .ListenTCP (addr )
@@ -214,6 +235,6 @@ func (conf *TCPServerTunnelConfig) SpawnRoutine(vt *VirtualTun) {
214
235
if err != nil {
215
236
log .Fatal (err )
216
237
}
217
- go tcpServerForward (tcpAddr , conn )
238
+ go tcpServerForward (vt , raddr , conn )
218
239
}
219
240
}
0 commit comments