易雾君
Published on 2024-12-08 / 51 Visits
0
0

NAS党福音:近乎零成本优雅地实现家庭网络异地组网(三)

本篇来讲讲一个完整接入案例。假定你的 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

b70aea9a-e06b-40c8-a2a6-1b6d3e1e9769.png

如果你等了很久也没能获取到证书,请使用如下命令重启 traefik

docker compose restart traefik

当你获取到证书时,应该就能通过外网访问到headscale的后台管理页面,https://hs.evling.tech/web

5635b2ac-9790-4851-962f-377791302344.png

获取token,执行如下命令

docker exec -it headscale-server headscale apikeys create

将获取的到的api key 贴到headscale后台的设置栏,并点击保存按钮。

1c17a948-71c1-4b1c-9038-1bf037ec95be.png

来到用户页面创建两个命令空间分别为 users 和 guest,规划是将边界的节点划分到guest命名空间下,个人的设备划分到users用户空间下,便于后期作访问控制。

38b50862-a239-4b37-a934-973fbb4fcdaf.png

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取出来备用。

d8fa49ad-21c5-4b5f-897f-b19d87e21162.png

重新打开一个ssh会话,执行如下添加设备命令,该节点属于边界节点,放到guest,后期会给予最小访问权限

docker exec -it headscale-server headscale nodes register --user guest --key mkey:45cefcbd1ca2cac40b26c87d0621e555c55bbb0fd91f7fc37bf613ee6fcdbb5f

b60af1d1-5026-475c-8224-7b180716fee0.png

成功注册,在后台设备页面查看,我们会发现一个在线的条目如下:

68c0e5d3-2377-4c8e-8367-46ff0d005cbf.png

至此,我们完成了家庭核心枢纽节点的注册,并将其声明为一个出口节点,可全局接管其他设备流量代理其上外网。

当然,你有让其他设备代理联网的需求,需要将出口网关配置伪装转换,大部分路由器默认基于出入接口,无需配置,视情况而定。

此节点你还需要开启转发能力,和防火墙转发放行。路由转发功能确保/etc/sysctl.conf下如下两行取消注释

e6d38f62-9cfa-440f-b124-f672a115abda.png

sysctl -p

修改nftables的转发策略为accept,iptables同理,自行搜索

6400ede5-521a-4d91-a5d4-f3ba9466261a.png

执行命令立即生效

nft -f /etc/nftables.conf

在headscale服务端开启其他节点声明的路由信息,先罗列下,默认都是没有开启的。

docker exec -it headscale-server headscale route list

c78c8c11-5f79-4cb9-a05f-02f6cefbc041.png

按需逐一进行开启

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客户端,打开运行,选择右上方的设置按钮。

116807ff-7945-4a64-b589-d695f7c0084f.jpeg

接着选择Accounts

8747f460-087a-4ccd-a55f-25b8768beac0.jpeg

点击右上方的三个小点,选择“Use an alternate server”

152960ef-b9f2-458c-917b-266149211a45.jpeg

紧接着输入的你的headscale服务地址,我这里是https://hs.evling.tech

8b60310f-2978-4a61-ac58-db0ae4d10a36.jpeg

点击添加账户后,随即会弹框,复制下mkey备用

51fa285d-7312-4552-bee7-e7ff8afb681b.jpeg

将获取到的mkey使用如下命令在服务端将该手机加入users命名空间。

docker exec -it headscale-server headscale nodes register --user users --key mkey:d82baaf67924130cf327642c0f4d55d80cb713e107dfcf93c8ea4359f9ca760d

最后可查看到添加成功。

712c82d6-36ee-4709-bfc4-d04e6217045c.jpeg

通过点击“EXIT NODE”,可选择对应线路,上边已经添加了一个家庭宽带线路,可供选择

1325d4bd-baac-4bd9-a81e-07e5f8082806.jpeg

至此,已完成了手机的接入。


Comment