先说一下整体的环境和安装方式

  • pve虚拟机专门开了一个lxc容器,用于安装tailscale,并利用此容器转发流量到局域网内的其他机器上,实现外部访问内网所有机器
  • 由于tailscale本身的中转服务器derp没有中国的节点,最近的节点是位于东京的,所以此处选择自己搭建一个中继节点

PVE LXC安装tailscale

此处的lxc模板使用的是Debian 11(bullseye)

  1. 创建一个非特权的CT容器, 模板选择Debian 11(bullseye),其他配置都使用默认配置(网络那儿最好选择DHCP,让路由器自动分配一个IP)

  2. 安装完成后, 先不要启动,需要修改一些配置

  3. 在pve宿主机中,获取信息, 执行命令和返回结果如下, 记录 10, 200 这两个数字, 后面需要用到

    1
    2
    root@pve:~# ls -al /dev/net/tun
    crw-rw-rw- 1 root root 10, 200 Jun 30 23:08 /dev/net/tun
  4. 在pve宿主机中,修改 /etc/pve/lxc/CTID.conf文件, 新增如下两行:其中10和200需要和第

    1
    2
    lxc.cgroup2.devices.allow: c 10:200 rwm
    lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
  5. 上述配置完成后, 启动容器,并安装tailscale, 安装文档:https://tailscale.com/kb/1038/install-debian-bullseye, 安装完成后先不要启动tailscale

  6. 开启lxc的转发功能,进入lxc容器, 修改/etc/sysctl.conf配置文件(一般是有的,将注释去掉就行),修改为如下两行:

    1
    2
    net.ipv4.ip_forward=1
    net.ipv6.conf.all.forwarding=1
  7. 修改完成后, 使其生效, 执行命令:sysctl -p /etc/sysctl.conf

  8. 启动tailscale, 因为此处是要使用此容器作为转发, 所以需要加上advertise-routes参数, 假设tailscale容器的IP为10.0.0.23, 要转发的网络段为 10.0.0.0/24, 则使用如下命令启动:

    1
    2
    # 此处使用的authKey来启动, 也可以不使用这个,具体方法参见tailscale文档
    tailscale up --authkey=xxxxx --accept-routes --advertise-routes=10.0.0.0/24
  9. 上一步使用的authKey是在tailscale的web管理端生成的,具体位置见下图:
    Snipaste_2024-01-19_10-03-02.png

    1. 当tailsale成功连接之后, 登录web端,在对应设备上点击 Edit route setting, 在弹出框中将subnet routes勾选上,并保存, 至此, 其他设备当连接上tailscale之后,就可以直接通过10.0.0.X的IP直接访问和lxc容器属于同一网段的其他设备。
      Snipaste_2024-01-19_10-08-43.png

lxc设置tailscale开启自启

以下操作都是在lxc容器内部进行的。

此处使用systemd来进行开启自启。在/etc/systemd/system下新建一个配置文件: tailscale.service, 文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
   [Unit]
Description=AutoStart tailscale
After=tailscale.service
Requires=tailscale.service

[Service]
Type=oneshot
ExecStart=/usr/bin/tailscale up --authkey=你的authKey --accept-routes --advertise-routes=你的转发范围
ExecStop=/usr/bin/tailscale down
RemainAfterExit=yes
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后执行如下命令:

1
2
systemctl enable tailscale.service
systemctl start tailscale.service

使用自定义中继服务器Derp

前提条件:

  • 公网VPS:配置不用太高,阿里云的最低配置就行
    • VPS开通端口8082和3478:我此处指定了derp的端口为8082, 你也可以指定其他端口
  • 域名
    • 域名对应的https证书: 我此处使用的是阿里云的免费证书

derp安装

此处为了方便,使用docker部署derp。

在和docker-compose.yml文件的相同目录下,创建certs目录, 并将证书文件放入此目录中。

docker-compose.yml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3.9"
services:
derper:
image: fredliang/derper
container_name: derper
volumes:
- ./config/certs:/app/certs
ports:
- 8082:8082
- 3478:3478/udp
environment:
- DERP_DOMAIN=你的域名
- DERP_CERT_MODE=manual
- DERP_ADDR=:8082 # 自定义的端口,也可以换成其他
- DERP_HTTP_PORT=-1

然后启动,docker-compose up -d

tailscale配置

登录tailscale的web控制台, 在Access Controls选项卡下,编辑配置文件, 在配置文件加上如下一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 自定义的中继derp
"derpMap": {
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "随便填一个有标识性的即可",
"RegionName": "随便填一个有标识性的即可",
"Nodes": [
{
"Name": "随便填一个有标识性的即可",
"RegionID": 900,
"HostName": "你的域名",
"StunPort": 3478,
"DerpPort": 8082, //之前配的端口
},
],
},
},

具体加的位置如图所示:

Snipaste_2024-01-19_10-29-46.png

验证:随便在一个已经连接上tailscale的机器上, 执行 tailscale netcheck,看到的中继列表里如果有你刚加的, 那就说明成功了。