本篇来讲讲一个完整接入案例。假定你的 headscale 服务地址为:https://hs.evling.tech
快速构建项目,测试机器系统为 debian12 ,假定你的主域名为evling.tech,邮箱地址[email protected],邮箱用于tls证书签发,如下命令对应改为你自己的即可。
git clone https://github.com/evling2020/hsmaker.git
cd hsmaker
sed -i s/example.com/evling.tech/g .env
sed -i s/CERT_EMAIL=.*/[email protected]/ .env
chmod 0600 certs/acme.json
将按照第一篇的方法获取到的cloudflare token替换掉 secrets/cf_api_token 里的内容。随即开启你的异地组网之旅。
docker compose up -d
稍等一段时间,初始化traefik需要申请tls证书,用如下命令查看情况
docker logs -f headscale-traefik --tail 100
也可以用如下命令查看证书字段是否为空,如下有内容输出,则表示证书还未获取成功。
cat certs/acme.json |grep null
如果你等了很久也没能获取到证书,请使用如下命令重启 traefik
docker compose restart traefik
当你获取到证书时,应该就能通过外网访问到headscale的后台管理页面,https://hs.evling.tech/web
获取token,执行如下命令
docker exec -it headscale-server headscale apikeys create
将获取的到的api key 贴到headscale后台的设置栏,并点击保存按钮。
来到用户页面创建两个命令空间分别为 users 和 guest,规划是将边界的节点划分到guest命名空间下,个人的设备划分到users用户空间下,便于后期作访问控制。
linux docker 接入
上一篇其实就已经有一个linux客户端的接入实例了,在本系列中充当边界路由器,连接外部终端和家庭内网的核心枢纽,同时它还配合derp完成客户端验证,防止derp被白嫖,就拿它接入举例。
# 进入客户端容器
docker exec -it headscale-client /bin/sh
# 执行接入指令
tailscale up --accept-dns=false --accept-routes --login-server=https://hs.evling.tech --advertise-exit-node --advertise-routes=10.32.0.0/16,10.8.0.0/16,172.16.0.0/16 --netfilter-mode=off
--accept-dns=false:该节点本身在家庭内网,dns解析就不用tailscale接管了。
--advertise-routes:路由声明,假定家里的网段有如下几个供给外部终端访问 10.32.0.0/16,10.8.0.0/16,172.16.0.0/16
--advertise-exit-node:出口网关设定,该节点需具备出口节点属性,方便我在公共场合wifi安全用网,全局加密流量回家再出网。
--netfilter-mode=off:防火墙设置,禁止节点控制防火墙软件,它默认会作源地址转换
执行完命令后,会出现如下阻塞页面,把mkey取出来备用。
重新打开一个ssh会话,执行如下添加设备命令,该节点属于边界节点,放到guest,后期会给予最小访问权限
docker exec -it headscale-server headscale nodes register --user guest --key mkey:45cefcbd1ca2cac40b26c87d0621e555c55bbb0fd91f7fc37bf613ee6fcdbb5f
成功注册,在后台设备页面查看,我们会发现一个在线的条目如下:
至此,我们完成了家庭核心枢纽节点的注册,并将其声明为一个出口节点,可全局接管其他设备流量代理其上外网。
当然,你有让其他设备代理联网的需求,需要将出口网关配置伪装转换,大部分路由器默认基于出入接口,无需配置,视情况而定。
此节点你还需要开启转发能力,和防火墙转发放行。路由转发功能确保/etc/sysctl.conf下如下两行取消注释
sysctl -p
修改nftables的转发策略为accept,iptables同理,自行搜索
执行命令立即生效
nft -f /etc/nftables.conf
在headscale服务端开启其他节点声明的路由信息,先罗列下,默认都是没有开启的。
docker exec -it headscale-server headscale route list
按需逐一进行开启
docker exec -it headscale-server headscale route enable -r 1
docker exec -it headscale-server headscale route enable -r 2
docker exec -it headscale-server headscale route enable -r 3
docker exec -it headscale-server headscale route enable -r 4
docker exec -it headscale-server headscale route enable -r 5
手机接入
手机安装好tailscale客户端,打开运行,选择右上方的设置按钮。
接着选择Accounts
点击右上方的三个小点,选择“Use an alternate server”
紧接着输入的你的headscale服务地址,我这里是https://hs.evling.tech
点击添加账户后,随即会弹框,复制下mkey备用
将获取到的mkey使用如下命令在服务端将该手机加入users命名空间。
docker exec -it headscale-server headscale nodes register --user users --key mkey:d82baaf67924130cf327642c0f4d55d80cb713e107dfcf93c8ea4359f9ca760d
最后可查看到添加成功。
通过点击“EXIT NODE”,可选择对应线路,上边已经添加了一个家庭宽带线路,可供选择
至此,已完成了手机的接入。