介绍
欢迎来到我的帖子,今天我将向您展示如何使用我自己构建的 docker 容器部署您自己的 Tailscale DERP 服务器!
对于此演示和演练,我将在 www.binarylane.com.au 托管的 1vcpu 1GB 内存 VPS 上使用 Ubuntu 22.04。我强烈推荐 BinaryLane,因为他们提供快速可靠的 VPS 解决方案,甚至是专用服务器!
先决条件
- Linux 服务器
- Docker(Docker 安装文档)
- Git
- https://github.com/tijjjy/Tailscale-DERP-Docker
- 端口 80,443 TCP 打开
- 端口 3478 UDP 打开
- DERP域名的DNS记录
- iptables, iptables-持久性
- Tailscale 帐户(创建 Tailscale 帐户)
为什么要自行托管自己的 DERP 服务器?
您可能想要运行自己的 Tailscale DERP 服务器的原因有很多,包括但不限于:
- 使用 Tailscale 的组织可能对网络流量的去向有要求。
- 学习新技能以及 DERP 的工作原理。
- 出于隐私原因,您可能希望完全控制基础设施。
安装要求
首先,让我们更新系统,在 Ubuntu 上可以使用以下命令完成。
sudo apt update
sudo apt upgrade -y
安装升级后,最好重新启动服务器以重新加载到最新的 linux 内核中。
sudo reboot
一旦您的服务器完全更新并完成重启,我们就可以安装 Docker 和 Git
sudo apt install docker docker-compose git -y
如果您在安装 docker 时遇到问题,可以在官方 docker 文档中找到您正在使用的 linux 发行版的说明。https://docs.docker.com/engine/install
设置防火墙
现在要安装防火墙,我个人使用 iptables,但这可以使用任何防火墙来完成。
如果未安装 iptables,请运行以下命令。
sudo apt install iptables iptables-persistent -y
打开 ipv4ruleset.rules。
nano /opt/ipv4ruleset.rules
粘贴以下规则集。
重要:将 REPLACEWITHYOURIPHERE 更改为您的家庭 IP 地址或您希望允许 SSH 访问的 IP 地址。复制并粘贴该行以允许其他 IP 地址访问 SSH。
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
#SSH ACCESS
-A INPUT -p tcp -s REPLACEWITHYOURIPHERE/32 --dport 22 -m state --state NEW -j ACCEPT
#DERP SERVER PORTS
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 3478 -m state --state NEW -j ACCEPT
#Allow established connections and DROP everything else
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j DROP
#Create docker chains incase they are not already there
-N DOCKER-USER
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
COMMIT
保存对 ipv4ruleset.rules 的更改,然后运行接下来的 2 个命令以应用规则集并保存到系统启动时使用的规则集。
iptables-restore < /opt/ipv4ruleset.rules
netfilter-persistent save
如果您的服务器具有 IPV6 连接,请按照后续步骤操作,否则请跳到我们重新启动 docker 守护进程的位置。
打开 ipv6ruleset.rules。
nano /opt/ipv6ruleset.rules
粘贴以下规则集。
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -s fe80::/64 -j ACCEPT
#DERP SERVER PORTS
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 3478 -m state --state NEW -j ACCEPT
#Allow established connections and DROP everything else
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j DROP
#Create docker chains incase they are not already there
-N DOCKER-USER
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
COMMIT
同样,让我们保存对 ipv6ruleset.rules 的更改,并运行接下来的 2 个命令以应用规则集并保存到系统启动时使用的规则集。
ip6tables-restore < /opt/ipv6ruleset.rules
netfilter-persistent save
要检查是否已应用所有规则,您可以运行以下两个命令来检查 IPV4 和 IPV6 规则。
iptables -nL
ip6tables -nL
现在,我们已经保护了您的服务器,仅允许对您指定的 IP 地址进行 SSH 访问,并允许与所需的 DERP 服务器端口建立新的连接。作为备份,最好确保您可以通过托管服务提供商的KVM进行连接,以防IP更改或被锁定。
此外,我们需要重新启动 docker 守护进程,以允许它重新创建 docker 运行所需的任何内部 iptables 规则。
sudo systemctl restart docker
设置 DNS 记录
在配置和启动 DERP 服务器之前,我们需要创建一个指向我们服务器的 DNS 记录,以便我们可以从 letsencrypt 请求证书,该域也用于客户端的 Tailscale ACL。
登录到您的域注册商,并为您要使用的域创建一个 A 记录,例如指向服务器 IP 地址的 derp01.example.com。
例如
- derp01.example.com
- A 记录
- 1.1.1.1 (当然使用您自己的服务器IP地址)
此外,DNS 记录步骤会为服务器 IPV6 地址添加一条记录。
设置后,通过运行以下命令确认域解析为 IP 地址,
dig derp01.example.com
或
nslookup derp01.example.com
任一命令都应返回服务器的 IP 地址。
生成 Tailscale 身份验证令牌
为了将我们的 DERP 容器验证到我们的尾网,我们需要提供一个初始身份验证令牌来将容器连接到我们的尾网,这可以通过转到 https://login.tailscale.com/admin/settings/keys 来完成。
登录 Tailscale 帐户后,您将看到“身份验证密钥”部分,其中包含“生成身份验证密钥...”按钮,如下所示。
继续并单击“生成身份验证密钥...”,它将打开一个提示,提示其他密钥选项,只需保留所有默认值,然后单击底部的蓝色按钮“生成密钥”。
将输出的密钥复制并记在安全的地方,我们将在接下来的几个步骤中使用它。
克隆 Repo 并设置 DERP 配置
太好了,现在我们有一个更新的服务器,安装了所有要求。让我们继续克隆包含 DERP 容器文件的存储库。
cd /opt
git clone https://github.com/tijjjy/Tailscale-DERP-Docker
cd Tailscale-DERP-Docker
ls -lah
现在,我们已经拥有了配置、构建和运行 DERP 服务器容器所需的所有文件。
我们需要编辑的只是 .env 文件,因为这是我们设置要使用的域和 Tailscale 身份验证密钥的地方。
nano .env
或
vim .env
现在我们需要替换两个变量,
- TAILSCALE_DERP_HOSTNAME
- TAILSCALE_AUTH_KEY
对于 TAILSCALE_DERP_HOSTNAME 变量,请将默认值替换为您在 DNS 记录中设置的域。
对于 TAILSCALE_AUTH_KEY 变量,请将默认值替换为您之前创建并记下的 Tailscale Auth Token。
如果操作正确,您的 .env 文件将类似于以下屏幕截图。
构建 DERP 容器
太棒了,我们快到了,现在我们需要做的就是构建 docker 容器,这可以像这样完成,
docker build . -t tailscale-derp-docker:1.0
运行 DERP 容器
现在我们已经构建了我们的容器,让我们继续使用 docker compose 运行它。
docker-compose up -d
我们可以监控容器日志,
docker logs -f tailscale-derp
要测试是否一切运行良好,并且 DERP 服务器是否具有 letsencrypt 证书,请打开您喜欢的浏览器并转到,
将 example.com 替换为您为 DERP 服务器设置的域。如果一切正常,您将不会出现 TLS/SSl 错误,并看到如下所示的默认页面,
禁用密钥过期并设置 Tailscale ACL
为了避免在当前密钥过期时不断为 DERP 服务器生成新的身份验证密钥的需要,我会在您的 Tailnet 中禁用新创建的机器的密钥过期。如下图所示,转到您的计算机,单击 3 个点,然后单击“禁用密钥过期”以禁用密钥过期。
按照 Tailscale 文档中关于如何设置仅使用您的 DERP 服务器,我们可以继续在 ACL 中设置以下内容。下面的代码片段需要放在您的其他 ACL 规则下,例如,我的代码段位于 SSH ACL 规则部分下方。如果您在设置 ACl 时遇到问题,可以在此处找到官方的 Tailscale 文档 -> Tailscale DERP ACL DOCS
请记住将 ACL 中的“HostName”部分更改为您为 DERP 服务器设置的域。
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "derp01",
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"HostName": "derp01.example.com",
},
],
},
},
},
测试我们的 DERP 服务器
剩下的就是测试我们的 DERP 服务器,我们可以使用内置的 tailscale ping 命令来 ping 我们的尾网上的机器,并确认它的流量是如何路由的。
tailscale ping machinename
当您运行该命令时,如果您看到“via DERP(derp01)”,那么恭喜您,您现在正在使用自己的 DERP 服务器进行中继通信!
出于隐私原因,我已将 IP 和 derp 服务器名称留空。
结束
好了,您现在拥有自己的 Tailscale DERP 服务器,该服务器在一个最小的小型 docker 容器中运行。我希望您喜欢这个演练!
感谢您的阅读。
链接
- 尾秤 https://tailscale.com
- BinaryLane https://www.binarylane.com.au
- Github https://github.com/tijjjy
- Github 仓库 https://github.com/tijjjy/Tailscale-DERP-Docker
version: '3'
services:
tailscale-derp:
container_name: tailscale-derp
image: tailscale-derp-docker:1.0
hostname: ${TAILSCALE_DERP_HOSTNAME}
volumes:
- /lib/modules:/lib/modules:ro
- $PWD/certs:/root/derper/${TAILSCALE_DERP_HOSTNAME}
- $PWD/config:/var/lib/tailscale
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TAILSCALE_DERP_HOSTNAME=${TAILSCALE_DERP_HOSTNAME}
- TAILSCALE_DERP_VERIFY_CLIENTS=${TAILSCALE_DERP_VERIFY_CLIENTS}
- TAILSCALE_DERP_CERTMODE=${TAILSCALE_DERP_CERTMODE}
- TAILSCALE_AUTH_KEY=${TAILSCALE_AUTH_KEY}
ports:
- 127.0.0.1:444:80/tcp
#这里我指向内部环路,避免和主服务的80端口冲突,然后反向代理这个,443直接出另一个端口就可以了,申请证书的时候未验证,后续该是正常的
- 4499:443/tcp
- 3478:3478/udp
#Uncomment only if you aren't running tailscaled on the host system otherwise it will error
#- 41641:41641/udp
restart: unless-stopped
devices:
- /dev/net/tun:/dev/net/tun
Comments | Nothing