一、概述
为什么需要绕一大圈通过wsl来部署tailscale呢?还是得从需求来说。
我的需求是通过tailscale连接公司VPN和家里的自建VPN,两者都是通过tailscale部署的,如果单纯通过tailscale的Windows客户端,是无法实现同时连接两个不同的tailscale网络的。所以有了这样一个比较特殊的实践案例,记录一下。
二、配置步骤
1、wsl中安装部署tailscale
xkj@DESKTOP-R4LBQKJ:/data/docker/tailscale$ cat docker-compose.yml
version: "3"
services:
tailscale:
container_name: tailscaled
hostname: tailscale
image: harbor.ctnrs.com/app/tailscale
restart: always
network_mode: host
privileged: true
volumes:
- "./pd:/var/lib" # State data will be stored in this directory
- "/dev/net/tun:/dev/net/tun" # Required for tailscale to work
- "/var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket"
- "/lib/modules:/lib/modules"
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
cap_add: # Required for tailscale to work
- net_admin
- sys_module
command: tailscaled -no-logs-no-support --tun=tailscale0 -state=/var/lib/tailscale0.state
tailscale1:
container_name: tailscaled-home
hostname: tailscale
image: harbor.ctnrs.com/app/tailscale
restart: always
network_mode: host
privileged: true
volumes:
- "./home:/var/lib" # State data will be stored in this directory
- "/dev/net/tun:/dev/net/tun" # Required for tailscale to work
- "/var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket"
- "/lib/modules:/lib/modules"
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
cap_add: # Required for tailscale to work
- net_admin
- sys_module
command: tailscaled -no-logs-no-support --tun=tailscale1 -state=/var/lib/tailscale1.state
2、wsl机器中配置nat
root@DESKTOP-R4LBQKJ:~# iptables -t nat -A POSTROUTING -d 192.168.2.0/24 -j SNAT --to-source 100.99.0.8
root@DESKTOP-R4LBQKJ:~# iptables -t nat -A POSTROUTING -d 100.99.0.0/16 -j SNAT --to-source 100.99.0.8
root@DESKTOP-R4LBQKJ:~# iptables -t nat -A POSTROUTING -d 100.64.0.0/16 -j SNAT --to-source 100.64.0.164
root@DESKTOP-R4LBQKJ:~# iptables -A FORWARD -j ACCEPT
root@DESKTOP-R4LBQKJ:~# iptables-save > /etc/sysconfig/iptables
root@DESKTOP-R4LBQKJ:~# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.8.10 (nf_tables) on Wed Sep 18 14:09:08 2024
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [486:25560]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Wed Sep 18 14:09:08 2024
# Generated by iptables-save v1.8.10 (nf_tables) on Wed Sep 18 14:09:08 2024
*nat
:PREROUTING ACCEPT [843:84001]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [2375:250875]
:POSTROUTING ACCEPT [2360:248663]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -o tailscale1 -j MASQUERADE
-A POSTROUTING -d 192.168.2.0/24 -j SNAT --to-source 100.99.0.8
-A POSTROUTING -d 100.99.0.0/16 -j SNAT --to-source 100.99.0.8
-A POSTROUTING -d 100.64.0.0/16 -j SNAT --to-source 100.64.0.164
-A DOCKER -i docker0 -j RETURN
COMMIT
# Completed on Wed Sep 18 14:09:08 2024
3、windows cmd配置路由
PS C:\Users\11386> route add 100.99.0.0 mask 255.255.0.0 172.24.148.82 METRIC 10 -p
操作完成!
PS C:\Users\11386> route add 192.168.2.0 mask 255.255.255.0 172.24.148.82 METRIC 10 -p
操作完成!
PS C:\Users\11386> route add 100.64.0.0 mask 255.255.0.0 172.24.148.82 METRIC 10 -p
操作完成!
以上步骤操作完成后,就可以通过Windows本机同时访问两个内网了。这个解决方案的本质是在wsl中使用docker部署tailscale客户端,实现同时连接两个tailscale内网的功能。在Windows指定路由,将内网的访问请求指给wsl,然后在wsl中使用nat技术将对应网络的请求代理给不同的tailscale网络。
另外,由于wsl默认是打开终端时才会启动的,关闭终端会自动将wsl机器stop掉,所以还需要设置wsl开机自启动和后台运行。这里给出一个简单的方法
4、设置wsl开机自启动
- WIN+R 运行
shell:startup打开启动目录 - 在此目录中创建文件
wsl-startup.vbs - 在
wsl-startup.vbs中填充如下内容,Ubuntu-24.04需替换为你使用的发行版名称。
set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl -d Ubuntu-24.04", 0
这样当你系统启动,登录系统后,Windows会开启 WSL 实例,它会永久等待输入,不会关闭。所以当你下次再使用WSL命令时,就不会遇到需要重新唤醒 WSL 的耗时。
如果你担心后台挂着WSL对系统资源占用过高,可以通过配置 .wslconfig 文件来限制 WSL 的资源占用。 WSL 会默认占用50%内存,最大8GB。使用所有CPU线程。我一般会限制到4GB,2线程。
配置方法如下:
notepad %USERPROFILE%\.wslconfig
[wsl2]
memory=4GB
processors=2
评论区