|
|
|
@ -137,9 +137,9 @@ func main() {
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if runtime.GOOS == "darwin" && os.Getuid() != 0 {
|
|
|
|
|
if runtime.GOOS == "darwin" && os.Getuid() != 0 && useTUN() {
|
|
|
|
|
log.SetFlags(0)
|
|
|
|
|
log.Fatalf("tailscaled requires root; use sudo tailscaled")
|
|
|
|
|
log.Fatalf("tailscaled requires root; use sudo tailscaled (or use --tun=userspace-networking)")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if args.socketpath == "" && runtime.GOOS != "windows" {
|
|
|
|
@ -215,11 +215,11 @@ func run() error {
|
|
|
|
|
ListenPort: args.port,
|
|
|
|
|
LinkMonitor: linkMon,
|
|
|
|
|
}
|
|
|
|
|
if args.tunname == "userspace-networking" {
|
|
|
|
|
if useTUN() {
|
|
|
|
|
conf.TUNName = args.tunname
|
|
|
|
|
} else {
|
|
|
|
|
conf.TUN = tstun.NewFakeTUN()
|
|
|
|
|
conf.RouterGen = router.NewFake
|
|
|
|
|
} else {
|
|
|
|
|
conf.TUNName = args.tunname
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
e, err := wgengine.NewUserspaceEngine(logf, conf)
|
|
|
|
@ -229,7 +229,7 @@ func run() error {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var ns *netstack.Impl
|
|
|
|
|
if args.tunname == "userspace-networking" {
|
|
|
|
|
if useNetstack() {
|
|
|
|
|
tunDev, magicConn := e.(wgengine.InternalsGetter).GetInternals()
|
|
|
|
|
ns, err = netstack.Create(logf, tunDev, e, magicConn)
|
|
|
|
|
if err != nil {
|
|
|
|
@ -244,7 +244,7 @@ func run() error {
|
|
|
|
|
srv := &socks5.Server{
|
|
|
|
|
Logf: logger.WithPrefix(logf, "socks5: "),
|
|
|
|
|
}
|
|
|
|
|
if args.tunname == "userspace-networking" {
|
|
|
|
|
if useNetstack() {
|
|
|
|
|
srv.Dialer = func(ctx context.Context, network, addr string) (net.Conn, error) {
|
|
|
|
|
return ns.DialContextTCP(ctx, addr)
|
|
|
|
|
}
|
|
|
|
@ -329,3 +329,6 @@ func runDebugServer(mux *http.ServeMux, addr string) {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func useTUN() bool { return args.tunname != "userspace-networking" }
|
|
|
|
|
func useNetstack() bool { return !useTUN() }
|
|
|
|
|