Skip to content

Commit f637b0f

Browse files
committed
resolve host for every new connection in static tunnels
1 parent 06d425b commit f637b0f

File tree

2 files changed

+56
-37
lines changed

2 files changed

+56
-37
lines changed

cmd/wireproxy/main.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,9 @@ func main() {
4545
exePath := executablePath()
4646
unveilOrPanic("/", "r")
4747
unveilOrPanic(exePath, "x")
48-
if err := protect.UnveilBlock(); err != nil {
49-
log.Fatal(err)
50-
}
5148

5249
// only allow standard stdio operation, file reading, networking, and exec
50+
// also remove unveil permission to lock unveil
5351
pledgeOrPanic("stdio rpath inet dns proc exec")
5452

5553
isDaemonProcess := len(os.Args) > 1 && os.Args[1] == daemonProcess

routine.go

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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
4247
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
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
7457
func (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
10689
func (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.
116123
func (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
165180
func (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
199221
func (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

Comments
 (0)