tailscale和自建derp

2023-03-26 Views tailscale zerotier p2p

#tailscale #zerotier #vpn

更新日志

2023年3月26日:自建derp

前言

曾使用过 zerotier、tailscale、wireguard 以及它们的一些衍生产品,如 netmaker 和 headscale,用于搭建内网传统工具。

wireguard:这是一种最原始的方式,需要一台拥有公网 IP 的机器。

netmaker:在 2021 年或 2022 年第一次使用它,但它好像有很多问题,GitHub 上有一堆 issues,遇到各种莫名其妙的问题。

headscale:我和 netmarker 一起尝试使用,需要一些爬坑,而且客户端需要修改,例如 Windows 需要修改注册表,相对来说比较麻烦。

zerotier:目前作为备选工具在使用,安装部署最为便捷,openwrt 上有现成的设施。但总体感觉是,它的首次连接速度太慢了,P2P 打洞也比较弱。对于个人来说,首次连接速度太慢影响很大,例如在公司,通常使用手机热点通过 zerotier 连接家里的设备,每次打开热点都需要稍等一小会儿才能连接成功。而且,带手机上个洗手间回来,热点又断了,还得重新等待连接。

tailscale:目前作为主力工具在使用。当手机热点有公网 IP 时,P2P 打洞成功率非常高,连接速度也特别快,客户端不需要像headscale那样进行额外的修改。

docker部署

客户端运行在openwrt软路由上,用于在外对家里设备的访问,运行命令:

docker run -d --restart=always --name=tailscaled -v /dev/net/tun:/dev/net/tun --network=host --cap-add=NET_ADMIN --cap-add=NET_RAW --env TS_ROUTES=192.168.50.0/24 --env TS_STATE_DIR=/var/lib/tailscale tailscale/tailscale:v1.34.2

其中需要传入TS_STATE_DIR环境变量,因为在docker中,默认是以临时节点(Ephemeral nodes)的方式运行,关闭后会重新生成节点的ip信息,并且上一次的登录信息失效。故需要提供一个位置来保存节点的信息

PS:
当前时间节点,使用docker部署的最新版本V1.36.2有重新生成ip的问题,回滚到V1.34.2则正常,不知到时环境的问题还是bug

自建derp

最近挪了个地方,所在的网络无法进行P2P打洞,因此需要使用中继服务。而tailscale的derp服务都在国外,导致延迟很高。因此决定自己搭建一个derp服务来提高连接速度和稳定性。

部署

version: "3"
services:
  derper:
    image: fredliang/derper
    container_name: derper
    restart: always
    volumes:
      - ./cert:/cert
    environment:
      - DERP_DOMAIN=xx.yyy.com # 替换成自己的域名即可
      - DERP_CERT_DIR=/cert
    ports:
      - 3478:3478/udp
      - 443:443

部署成功后直接访问域名,应该有如下信息

添加配置

为了让tailscale使用搭建的derp服务,需要在tailscale的web页面的Access Controls中添加如下内容:

"derpMap": {
		"OmitDefaultRegions": false,
		"Regions": {
			"900": {
				"RegionID":   900,
				"RegionCode": "my-derp",
				"Nodes": [
					{
						"Name":     "1",
						"RegionID": 900,
						"HostName": "xx.yyy.com", //自己的域名
						"STUNPort": 3478, // 整数,stun 端口
						"DERPPort": 443, // 整数,自定义的 derper 端口
					},
				],
			},
		},
	},

重启下客户端,看看是不是通过relay方式连接上了my-derp中继。检查命令如下:

tailscale netcheck
tailscale status

注意: 连接上并不意味着一定能够使用,最好通过ping其他节点观察延迟是否有明显降低。我自己的环境延迟大概从800ms降低到了200ms,提升还是很大的。

如果ping不通,需要注意以下两个问题:

  1. 端口是否开放。
  2. docker容器日志是否正常,我曾遇到过证书的问题。