本帖最后由 bigold2 于 2025-3-11 23:32 编辑
背景:
软件研发背景,全干打杂工程师,多少有点专业背景
由于使用帐号限制,基于阿里云 99 ecs 自建 Headscale。
两个局域网,目前均为移动家宽 1Gbps 下行,上行 100 Mbps 左右吧。
局域网1 (Xiaomi BE 6500 Pro, CIDR:192.168.31.0/24): HPE Microserver gen10+ v2 搭建的 ESXI 中黑群晖有基于 MP + Jellyfin 的影音库。
局域网2 (Xiaomi BE 7000,CIDR:192.168.1.0/24): 一堆终端设备如下:
1. 我跟媳妇自用的苹果全家桶的 Infuse
2. Sony 电视上的Jellyfin 客户端,专门给爸妈看剧的 Nvidia Shield TV (刷机Google TV) Jellyfin 客户端
3. 爸妈小米手机上的 Synology Photos
4. 闲置 Mac mini,运行有 HA
由于各个设备都需要单独安装 Tailscale 终端,随着设备休眠重启,后台进程,连接状况并不是很稳定,尤其是老年人操作成本太高。所以想在路由器上直接运行 tailscale ,使得本地网络中的终端设备可以无感访问黑群中的服务。
局域网2中原本路由器为 AX6000,但由于本人折腾的东西过多,且之前在官方固件基础上搭建过一些上方服务,导致路由器稳定性受影响较大,不太乐意折腾软路由。。。(ax6000的固件缺少 kmod-tun,去年折腾挺久未果)
申请预算后采购了BE7000,琢磨着用 docker 来运行(当然由于docker自身的特性,还是需要 tun 模块的,不过BE 6500pro 与 7000 当前最新官方固件已经自带)
操作步骤:
1. 设备就绪
准备U盘或者移动硬盘,安装docker,参考路由器管理界面操作指南即可,安装完毕启动 Docker
固件版本:1.1.16
Docker 版本: 20.10.17
2. ssh 破解
需要破解ssh,直接在shell中通过命令行启动容器; (simpledocker 的UI界面只给了简单的参数配置,而我们需要绑定 tun 设备等等)
由于大部分 ssh 破解操作都需要降级路由器固件版本,而官方提供的工具只有windows版本。直接使用了下面这位大佬的开源脚本 xmir-patcher,还是需要一点开发基础的,毕竟大蟒蛇(python)的版本和依赖管理真的是深恶痛绝。
禁用官方docker 的安全插件; 参考 https://blog.dollcode.cn/xiaomibe7000-dockerup 进行操作
- # 查看文件
- cat /etc/config/mi_docker
- # 编辑文件
- vi /etc/config/mi_docker
- # 把文件中这一行 list authorization_plugins ‘opa-docker-authz’
- # 将引号中的内容删掉,只保留引号就可以了
- list authorization_plugins ''
复制代码
注意:修改后通过路由器后台跳转 simpledocker 管理界面的按钮会被禁用,所以自行记下其访问端口 http://192.168.1.1:9001
3.启动容器
1. 拉镜像比较伤感,我是本地docker 配有代理,拉取镜像后 docker save -o tailscale.tar tailscale/tailscale 保存,再从simpledocker 镜像中上传 2. 使用官方服务的,下面命令中登录相关自行修改
- # 1. docker 相关可执行文件在 /mnt/usb-xxxx/mi_docker/docker-binaries 目录下,嫌麻烦每次登录后可以执行一下 , 我不需要固化
- export PATH="/mnt/usb-3d99946d/mi_docker/docker-binaries:$PATH"
- # 2. 创建持久化volume
- docker volume create tailscale
- # 3. 启动容器
- docker run -d \
- --name tailscale \
- --hostname router-be7000 \
- --cap-add NET_ADMIN \
- --device /dev/net/tun:/dev/net/tun \
- --network host \
- -e TS_AUTHKEY=xxx \
- -e TS_USERSPACE=false \
- -e TS_AUTH_ONCE=true \
- -e TS_STATE_DIR=/var/lib/tailscale \
- -e TS_EXTRA_ARGS="--login-server=https://hs.xxx.cc --accept-routes" \
- -v tailscale:/var/lib/tailscale \
- --restart unless-stopped \
- tailscale/tailscale:latest
复制代码
启动成功后可以执行在路由器宿主机环境内验证访问 tailscale 的某个主机 ip 和 其公布的子网设备ip,日志中会有因为 iptables 版本较低的报错,不过不影响基本功能的使用。
- health(warnable=router): error: adding [-i tailscale0 -j MARK --set-mark 0x40000/0xff0000] in v4/filter/ts-forward: running [/sbin/iptables -t filter -A ts-forward -i tailscale0 -j MARK --set-mark 0x40000/0xff0000 --wait]: exit status 1: iptables: Invalid argument. Run `dmesg' for more information.
复制代码
4. 转发规则配置
- # 确认一下宿主机中网络相关的配置
- root@XiaoQiang:~# ip route
- default via 10.61.128.1 dev pppoe-wan proto static
- 10.61.128.1 dev pppoe-wan proto kernel scope link src 10.61.164.86
- 172.17.0.0/16 dev br-docker proto kernel scope link src 172.17.0.1
- 192.168.1.0/24 dev br-lan proto kernel scope link src 192.168.1.1
- 192.168.32.0/24 dev br-miot proto kernel scope link src 192.168.32.1
- root@XiaoQiang:~# ip route show table 52
- 100.64.0.1 dev tailscale0
- 100.100.100.100 dev tailscale0
- 192.168.31.0/24 dev tailscale0
- # 允许本地网络访问 Tailscale 网络
- iptables -I FORWARD -i br-lan -o tailscale0 -j ACCEPT
- # 启用 NAT,伪装本地网络到 Tailscale 的流量
- iptables -t nat -I POSTROUTING -o tailscale0 -j MASQUERADE
复制代码
大功告成。
补充:
重启后docker 并未自动启动,参考 这篇帖子
自定义启动脚本中添加
- #!/bin/sh
- install() {
- # Add script to system autostart docker
- uci set firewall.startup_script=include
- uci set firewall.startup_script.type='script'
- uci set firewall.startup_script.path="/data/startup_script.sh"
- uci set firewall.startup_script.enabled='1'
- uci commit firewall
- echo -e "\033[32m startup_script complete. \033[0m"
- }
- uninstall() {
- # Remove scripts from system autostart
- uci delete firewall.startup_script
- uci commit firewall
- echo -e "\033[33m startup_script has been removed. \033[0m"
- }
- startup_script() {
- # Put your custom script here.
- echo "Starting custom scripts..."
- sed -i '/valid_mountpath() {/a return 0' /etc/init.d/mi_docker
- sleep 20
- /etc/init.d/mi_docker start
- iptables -I FORWARD -i br-lan -o tailscale0 -j ACCEPT
- iptables -t nat -I POSTROUTING -o tailscale0 -j MASQUERADE
- }
- main() {
- [ -z "$1" ] && startup_script && return
- case "$1" in
- install)
- install
- ;;
- uninstall)
- uninstall
- ;;
- *)
- echo -e "\033[31m Unknown parameter: $1 \033[0m"
- return 1
- ;;
- esac
- }
- main "$@"
复制代码
|