@@ -63,6 +63,15 @@ type Server struct {
63
63
64
64
mu sync.Mutex
65
65
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 )
66
75
}
67
76
68
77
func (s * Server ) doInit () {
@@ -71,6 +80,11 @@ func (s *Server) doInit() {
71
80
}
72
81
}
73
82
83
+ func (s * Server ) init () error {
84
+ s .initOnce .Do (s .doInit )
85
+ return s .initErr
86
+ }
87
+
74
88
func (s * Server ) start () error {
75
89
if v , _ := strconv .ParseBool (os .Getenv ("TAILSCALE_USE_WIP_CODE" )); ! v {
76
90
return errors .New ("code disabled without environment variable TAILSCALE_USE_WIP_CODE set true" )
@@ -117,11 +131,11 @@ func (s *Server) start() error {
117
131
return err
118
132
}
119
133
120
- dialer : = new (tsdial.Dialer ) // mutated below (before used)
134
+ s . dialer = new (tsdial.Dialer ) // mutated below (before used)
121
135
eng , err := wgengine .NewUserspaceEngine (logf , wgengine.Config {
122
136
ListenPort : 0 ,
123
137
LinkMonitor : linkMon ,
124
- Dialer : dialer ,
138
+ Dialer : s . dialer ,
125
139
})
126
140
if err != nil {
127
141
return err
@@ -132,7 +146,7 @@ func (s *Server) start() error {
132
146
return fmt .Errorf ("%T is not a wgengine.InternalsGetter" , eng )
133
147
}
134
148
135
- ns , err := netstack .Create (logf , tunDev , eng , magicConn , dialer )
149
+ ns , err := netstack .Create (logf , tunDev , eng , magicConn , s . dialer )
136
150
if err != nil {
137
151
return fmt .Errorf ("netstack.Create: %w" , err )
138
152
}
@@ -141,11 +155,11 @@ func (s *Server) start() error {
141
155
if err := ns .Start (); err != nil {
142
156
return fmt .Errorf ("failed to start netstack: %w" , err )
143
157
}
144
- dialer .UseNetstackForIP = func (ip netaddr.IP ) bool {
158
+ s . dialer .UseNetstackForIP = func (ip netaddr.IP ) bool {
145
159
_ , ok := eng .PeerForIP (ip )
146
160
return ok
147
161
}
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 ) {
149
163
return ns .DialContextTCP (ctx , dst )
150
164
}
151
165
@@ -156,7 +170,7 @@ func (s *Server) start() error {
156
170
}
157
171
logid := "tslib-TODO"
158
172
159
- lb , err := ipnlocal .NewLocalBackend (logf , logid , store , dialer , eng )
173
+ lb , err := ipnlocal .NewLocalBackend (logf , logid , store , s . dialer , eng )
160
174
if err != nil {
161
175
return fmt .Errorf ("NewLocalBackend: %v" , err )
162
176
}
@@ -217,15 +231,15 @@ func (s *Server) forwardTCP(c net.Conn, port uint16) {
217
231
}
218
232
}
219
233
234
+ // Listen announces only on the Tailscale network.
220
235
func (s * Server ) Listen (network , addr string ) (net.Listener , error ) {
221
236
host , port , err := net .SplitHostPort (addr )
222
237
if err != nil {
223
238
return nil , fmt .Errorf ("tsnet: %w" , err )
224
239
}
225
240
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
229
243
}
230
244
231
245
key := listenKey {network , host , port }
0 commit comments