侧边栏壁纸
博主头像
小续的成长时光 博主等级

行动起来,活在当下

  • 累计撰写 21 篇文章
  • 累计创建 14 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Windows使用wsl部署使用tailscale客户端

小续
2024-09-20 / 1 评论 / 3 点赞 / 184 阅读 / 0 字 / 正在检测是否收录...

一、概述

为什么需要绕一大圈通过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
3

评论区