Skip to content

Commit 44937b5

Browse files
Maisem Alimaisem
authored andcommitted
tsnet: add Dial method to allow dialing out to the tailnet.
Signed-off-by: Maisem Ali <maisem@tailscale.com>
1 parent 535b925 commit 44937b5

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

tsnet/tsnet.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ type Server struct {
6363

6464
mu sync.Mutex
6565
listeners map[listenKey]*listener
66+
dialer *tsdial.Dialer
67+
}
68+
69+
// Dial connects to the address on the tailnet.
70+
func (s *Server) Dial(ctx context.Context, network, address string) (net.Conn, error) {
71+
if err := s.init(); err != nil {
72+
return nil, err
73+
}
74+
return s.dialer.UserDial(ctx, network, address)
6675
}
6776

6877
func (s *Server) doInit() {
@@ -71,6 +80,11 @@ func (s *Server) doInit() {
7180
}
7281
}
7382

83+
func (s *Server) init() error {
84+
s.initOnce.Do(s.doInit)
85+
return s.initErr
86+
}
87+
7488
func (s *Server) start() error {
7589
if v, _ := strconv.ParseBool(os.Getenv("TAILSCALE_USE_WIP_CODE")); !v {
7690
return errors.New("code disabled without environment variable TAILSCALE_USE_WIP_CODE set true")
@@ -117,11 +131,11 @@ func (s *Server) start() error {
117131
return err
118132
}
119133

120-
dialer := new(tsdial.Dialer) // mutated below (before used)
134+
s.dialer = new(tsdial.Dialer) // mutated below (before used)
121135
eng, err := wgengine.NewUserspaceEngine(logf, wgengine.Config{
122136
ListenPort: 0,
123137
LinkMonitor: linkMon,
124-
Dialer: dialer,
138+
Dialer: s.dialer,
125139
})
126140
if err != nil {
127141
return err
@@ -132,7 +146,7 @@ func (s *Server) start() error {
132146
return fmt.Errorf("%T is not a wgengine.InternalsGetter", eng)
133147
}
134148

135-
ns, err := netstack.Create(logf, tunDev, eng, magicConn, dialer)
149+
ns, err := netstack.Create(logf, tunDev, eng, magicConn, s.dialer)
136150
if err != nil {
137151
return fmt.Errorf("netstack.Create: %w", err)
138152
}
@@ -141,11 +155,11 @@ func (s *Server) start() error {
141155
if err := ns.Start(); err != nil {
142156
return fmt.Errorf("failed to start netstack: %w", err)
143157
}
144-
dialer.UseNetstackForIP = func(ip netaddr.IP) bool {
158+
s.dialer.UseNetstackForIP = func(ip netaddr.IP) bool {
145159
_, ok := eng.PeerForIP(ip)
146160
return ok
147161
}
148-
dialer.NetstackDialTCP = func(ctx context.Context, dst netaddr.IPPort) (net.Conn, error) {
162+
s.dialer.NetstackDialTCP = func(ctx context.Context, dst netaddr.IPPort) (net.Conn, error) {
149163
return ns.DialContextTCP(ctx, dst)
150164
}
151165

@@ -156,7 +170,7 @@ func (s *Server) start() error {
156170
}
157171
logid := "tslib-TODO"
158172

159-
lb, err := ipnlocal.NewLocalBackend(logf, logid, store, dialer, eng)
173+
lb, err := ipnlocal.NewLocalBackend(logf, logid, store, s.dialer, eng)
160174
if err != nil {
161175
return fmt.Errorf("NewLocalBackend: %v", err)
162176
}
@@ -217,15 +231,15 @@ func (s *Server) forwardTCP(c net.Conn, port uint16) {
217231
}
218232
}
219233

234+
// Listen announces only on the Tailscale network.
220235
func (s *Server) Listen(network, addr string) (net.Listener, error) {
221236
host, port, err := net.SplitHostPort(addr)
222237
if err != nil {
223238
return nil, fmt.Errorf("tsnet: %w", err)
224239
}
225240

226-
s.initOnce.Do(s.doInit)
227-
if s.initErr != nil {
228-
return nil, s.initErr
241+
if err := s.init(); err != nil {
242+
return nil, err
229243
}
230244

231245
key := listenKey{network, host, port}

0 commit comments

Comments
 (0)