手把手配置 ZeroTier 内网穿透与 iptables 转发,含自动识别网段的一键脚本。
📚 目录
1. 场景目标与网络信息 🧭
✅ 目标
通过 ZeroTier 实现从外网(ZeroTier 另一端节点)访问家里局域网设备,例如:
- NAS / FNOS
- 局域网共享
- 路由器管理页面
- 摄像头/打印机/服务器等
即:外网访问局域网网段 192.168.100.0/24
✅ 示例环境参数(可按你的实际替换)
| 项目 | 示例值 |
|---|
| 局域网网段 | 192.168.100.0/24 |
| 网关机局域网 IP | 192.168.100.240 |
| 网关机 LAN 网卡 | ens34 |
| ZeroTier 网段 | 10.121.15.0/24 |
| 网关机 ZeroTier IP | 10.121.15.79 |
| 网关机 ZeroTier 网卡名 | zt2ffxhxxq(可能变化) |
💡 网关机就是同时连接「ZeroTier 网络」和「家里局域网」的那台机器(可为 FNOS 主机、旁路机、软路由、Linux 主机等)。
2. ZeroTier 侧:配置路由(必须)🧱
你必须在 ZeroTier Central(或自建控制台)添加一条 Managed Route:
✅ Route:
1
| 192.168.100.0/24 via 10.121.15.79
|
含义:
其他 ZeroTier 节点访问 192.168.100.x 时,流量会转交给网关机(10.121.15.79)进行转发。
若未配置此路由,外网节点并不知道 192.168.100.0/24 该走哪台机器。
3. 网关机:查看网卡 & 确认接口 🧩
3.1 查看所有网卡(推荐)
示例:
1
2
3
4
| ens34 UP 192.168.100.240/24
zt2ffxhxxq UP 10.121.15.79/24
docker0 DOWN 172.17.0.1/16
br-xxxx UP 172.18.0.1/16
|
3.2 查看默认路由(确认 LAN 网卡)
1
| ip route | grep default
|
示例:
1
| default via 192.168.100.1 dev ens34 proto dhcp src 192.168.100.240 metric 100
|
✅ 说明 LAN 网卡就是 ens34
3.3 查看 ZeroTier 网卡(匹配 zt 开头)
或:
4. 开启系统转发(IP Forward)🚦
ZeroTier 做内网穿透必须开启 IPv4 转发。
4.1 临时开启(立即生效)
1
| sysctl -w net.ipv4.ip_forward=1
|
4.2 永久开启(重启仍有效)
1
2
| echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
|
检查:
1
| sysctl net.ipv4.ip_forward
|
应输出:
1
| net.ipv4.ip_forward = 1
|
5. 设置 iptables 转发/NAT(关键步骤)🔥
5.1 为什么需要 NAT?
局域网设备(192.168.100.x)通常不知道 10.121.15.0/24 如何回包。
所以需要在网关机做 NAT(MASQUERADE),让局域网设备把回包发回网关机,再由网关机转回 ZeroTier。
5.2 添加 NAT(适配 iptables-nft)
✅ 正确 NAT:
1
2
3
| iptables -t nat -A POSTROUTING \
-s 10.121.15.0/24 -d 192.168.100.0/24 \
-o ens34 -j MASQUERADE
|
注意:在某些 iptables-nft 环境中,POSTROUTING 链不支持 -i(入接口匹配),所以采用 -s/-d/-o 的写法最稳。
5.3 添加转发规则(FORWARD)
1
2
3
| iptables -A FORWARD -s 10.121.15.0/24 -d 192.168.100.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.100.0/24 -d 10.121.15.0/24 \
-m state --state RELATED,ESTABLISHED -j ACCEPT
|
5.4 查看规则是否已添加
NAT POSTROUTING:
1
| iptables -t nat -S POSTROUTING
|
FORWARD:
1
| iptables -S FORWARD | grep 10.121.15
|
6. 保存 iptables(重启仍有效)💾
Ubuntu/Debian 推荐使用 iptables-persistent。
6.1 安装
1
2
| apt update
apt install -y iptables-persistent
|
6.2 保存规则
1
| netfilter-persistent save
|
6.3 保存位置(重要)
- IPv4:
/etc/iptables/rules.v4 - IPv6:
/etc/iptables/rules.v6
查看:
1
| cat /etc/iptables/rules.v4
|
7. 一键脚本(固定网段版)⚙️
特点:简单稳定,但需要你自己写死 ZT_NET,如果 ZeroTier 网段变化,需要改脚本。
7.1 创建脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| cat >/usr/local/bin/zt-route-reset.sh <<'EOF'
#!/bin/bash
set -e
LAN_IF="ens34"
LAN_NET="192.168.100.0/24"
ZT_NET="10.121.15.0/24"
echo "==== ZeroTier 转发/NAT 脚本(固定网段 + 自动保存)===="
sysctl -w net.ipv4.ip_forward=1 >/dev/null
if ! grep -q "^net.ipv4.ip_forward=1" /etc/sysctl.conf 2>/dev/null; then
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
fi
# 删除旧规则(按 ZT_NET 匹配)
while iptables -t nat -S POSTROUTING | grep -q "${ZT_NET}"; do
RULE=$(iptables -t nat -S POSTROUTING | grep "${ZT_NET}" | head -n1)
iptables -t nat ${RULE/-A/-D} || true
done
while iptables -S FORWARD | grep -q "${ZT_NET}"; do
RULE=$(iptables -S FORWARD | grep "${ZT_NET}" | head -n1)
iptables ${RULE/-A/-D} || true
done
# 添加 NAT + 转发
iptables -t nat -A POSTROUTING -s ${ZT_NET} -d ${LAN_NET} -o ${LAN_IF} -j MASQUERADE
iptables -A FORWARD -s ${ZT_NET} -d ${LAN_NET} -j ACCEPT
iptables -A FORWARD -s ${LAN_NET} -d ${ZT_NET} -m state --state RELATED,ESTABLISHED -j ACCEPT
# 保存
if ! command -v netfilter-persistent >/dev/null 2>&1; then
export DEBIAN_FRONTEND=noninteractive
apt update -y
apt install -y iptables-persistent
fi
netfilter-persistent save
echo "✅ 完成,已保存到 /etc/iptables/rules.v4"
EOF
chmod +x /usr/local/bin/zt-route-reset.sh
|
7.2 执行脚本
1
| /usr/local/bin/zt-route-reset.sh
|
8. 一键脚本(自动识别 ZeroTier/LAN 网段版,推荐)🧠
特点:
✅ 自动识别 LAN 网卡(default route)
✅ 自动识别 LAN 网段(从 LAN 网卡的 IP/掩码计算)
✅ 自动识别 ZeroTier 网卡(zt*)
✅ 自动识别 ZeroTier 网段(从 zt 网卡的 IP/掩码计算)
✅ 无需写死 10.121.15.0/24,ZeroTier 网段变化也能自动适配
✅ 自动保存
8.1 创建自动识别脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
| cat >/usr/local/bin/zt-route-auto.sh <<'EOF'
#!/bin/bash
set -e
echo "==== ZeroTier 内网穿透脚本(自动识别网卡/网段 + 自动保存)===="
die() { echo "❌ $*" >&2; exit 1; }
need_cmd() { command -v "$1" >/dev/null 2>&1 || die "缺少命令:$1,请先安装"; }
need_cmd ip
need_cmd iptables
need_cmd awk
need_cmd grep
need_cmd sed
# 识别 LAN 接口(默认出口)
LAN_IF=$(ip route | awk '/default/ {print $5; exit}')
[ -n "$LAN_IF" ] || die "无法识别默认出口网卡(LAN_IF)"
LAN_CIDR=$(ip -4 -o addr show dev "$LAN_IF" | awk '{print $4}' | head -n1)
[ -n "$LAN_CIDR" ] || die "无法识别 LAN 网卡 $LAN_IF 的 IPv4 地址"
# 识别 ZeroTier 接口(第一个 zt*)
ZT_IF=$(ip -o link show | awk -F': ' '{print $2}' | grep -E '^zt' | head -n1)
[ -n "$ZT_IF" ] || die "未找到 ZeroTier 网卡(zt*),请确认已加入 ZeroTier 网络"
ZT_CIDR=$(ip -4 -o addr show dev "$ZT_IF" | awk '{print $4}' | head -n1)
[ -n "$ZT_CIDR" ] || die "ZeroTier 网卡 $ZT_IF 没有 IPv4 地址,检查是否已分配 Managed IP"
# 安装 ipcalc(用于计算网段)
if ! command -v ipcalc >/dev/null 2>&1; then
echo "ℹ️ 未检测到 ipcalc,正在安装..."
export DEBIAN_FRONTEND=noninteractive
apt update -y
apt install -y ipcalc
fi
LAN_NET=$(ipcalc -n "$LAN_CIDR" | awk -F= '/NETWORK/ {print $2}')"/"$(echo "$LAN_CIDR" | cut -d/ -f2)
ZT_NET=$(ipcalc -n "$ZT_CIDR" | awk -F= '/NETWORK/ {print $2}')"/"$(echo "$ZT_CIDR" | cut -d/ -f2)
echo "✅ 识别结果:"
echo " LAN_IF = $LAN_IF"
echo " LAN_CIDR = $LAN_CIDR"
echo " LAN_NET = $LAN_NET"
echo " ZT_IF = $ZT_IF"
echo " ZT_CIDR = $ZT_CIDR"
echo " ZT_NET = $ZT_NET"
echo
echo "[1/6] 开启 IPv4 转发..."
sysctl -w net.ipv4.ip_forward=1 >/dev/null
if ! grep -q "^net.ipv4.ip_forward=1" /etc/sysctl.conf 2>/dev/null; then
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
fi
echo "[2/6] 清理旧 ZeroTier 规则(按旧网段/zt 关键字)..."
while iptables -t nat -S POSTROUTING | grep -Eq "zt|${ZT_NET%/*}"; do
RULE=$(iptables -t nat -S POSTROUTING | grep -E "zt|${ZT_NET%/*}" | head -n1)
echo " 删除 NAT: $RULE"
iptables -t nat ${RULE/-A/-D} || true
done
while iptables -S FORWARD | grep -Eq "zt|${ZT_NET%/*}"; do
RULE=$(iptables -S FORWARD | grep -E "zt|${ZT_NET%/*}" | head -n1)
echo " 删除 FWD: $RULE"
iptables ${RULE/-A/-D} || true
done
echo "[3/6] 添加 NAT(ZT -> LAN)..."
iptables -t nat -A POSTROUTING -s "$ZT_NET" -d "$LAN_NET" -o "$LAN_IF" -j MASQUERADE
echo "[4/6] 添加 FORWARD 转发规则..."
iptables -A FORWARD -s "$ZT_NET" -d "$LAN_NET" -j ACCEPT
iptables -A FORWARD -s "$LAN_NET" -d "$ZT_NET" -m state --state RELATED,ESTABLISHED -j ACCEPT
echo "[5/6] 保存规则(iptables-persistent)..."
if ! command -v netfilter-persistent >/dev/null 2>&1; then
echo "ℹ️ 未检测到 netfilter-persistent,正在安装 iptables-persistent..."
export DEBIAN_FRONTEND=noninteractive
apt update -y
apt install -y iptables-persistent
fi
netfilter-persistent save
echo "[6/6] 完成!关键规则如下:"
echo "---- NAT POSTROUTING ----"
iptables -t nat -S POSTROUTING | grep -E "$(echo "$ZT_NET" | cut -d/ -f1)|MASQUERADE" || true
echo "---- FORWARD ----"
iptables -S FORWARD | grep -E "$(echo "$ZT_NET" | cut -d/ -f1)|ACCEPT|RELATED" || true
echo
echo "✅ 已自动保存到 /etc/iptables/rules.v4,重启仍生效。"
EOF
chmod +x /usr/local/bin/zt-route-auto.sh
|
8.2 执行自动识别脚本
1
| /usr/local/bin/zt-route-auto.sh
|
9. 验证是否成功(外网节点)✅
在外网加入同一 ZeroTier 的设备上:
1
2
3
| ping 192.168.100.240
ping 192.168.100.1
ping 192.168.100.10 # 局域网任意设备
|
只要能 ping 通 192.168.100.1 或任意内网设备 → 穿透成功 ✅
也可以直接访问:
- Web:
http://192.168.100.10 - SMB:
\\192.168.100.10 - SSH:
ssh user@192.168.100.10
10. 常见问题排错 🧯
10.1 只能 ping 通网关机(192.168.100.240),ping 不通其他设备
原因一般是 NAT/FORWARD 不生效或被防火墙拦截。
检查:
1
2
| iptables -t nat -S POSTROUTING | grep MASQUERADE
iptables -S FORWARD | grep ACCEPT
|
10.2 ZeroTier 路由未下发
确认 ZeroTier Central 中存在:
1
| 192.168.100.0/24 via <网关机的ZeroTierIP>
|
10.3 目标设备防火墙
例如 Windows 默认可能阻止 ICMP/Ping 或 SMB,需要允许局域网访问。
11. 常用命令合集 🧰
查看网卡
查看默认路由
1
| ip route | grep default
|
查看 iptables
1
2
| iptables -t nat -S
iptables -S
|
查看保存规则文件
1
| cat /etc/iptables/rules.v4
|
清屏
或快捷键:Ctrl + L
发布前提示(建议)📌
- 请确保 WebShell/SSH 等管理端口不暴露公网(内网/ZeroTier 内访问最安全)
- 若你不想使用 NAT(更干净),也可以走「主路由静态路由」方案:
主路由增加 10.121.15.0/24 -> 192.168.100.240(需要你能改主路由)
至此,ZeroTier 内网穿透方案(含自动识别网段脚本)完整结束。
欢迎直接复制本文发布或二次编辑。