【主要转载】自托管 Tailscale Derp 服务器

2024-08-19 - 404 Views - 0 Goods - Nothing

【主要转载】自托管 Tailscale Derp 服务器

介绍

欢迎来到我的帖子,今天我将向您展示如何使用我自己构建的 docker 容器部署您自己的 Tailscale DERP 服务器!

对于此演示和演练,我将在 www.binarylane.com.au 托管的 1vcpu 1GB 内存 VPS 上使用 Ubuntu 22.04。我强烈推荐 BinaryLane,因为他们提供快速可靠的 VPS 解决方案,甚至是专用服务器!

先决条件

为什么要自行托管自己的 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 证书,请打开您喜欢的浏览器并转到,

https://derp01.example.com

将 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 容器中运行。我希望您喜欢这个演练!

感谢您的阅读。

链接

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

转载请注明原文链接:首页 -> 日常 -> 【主要转载】自托管 Tailscale Derp 服务器
  • 微信打赏

AnHui.HuaiNan

我很感谢那些爱过我的人.