Contents

ZeroTier 内网穿透

手把手配置 ZeroTier 内网穿透与 iptables 转发,含自动识别网段的一键脚本。

📚 目录


1. 场景目标与网络信息 🧭

✅ 目标

通过 ZeroTier 实现从外网(ZeroTier 另一端节点)访问家里局域网设备,例如:

  • NAS / FNOS
  • 局域网共享
  • 路由器管理页面
  • 摄像头/打印机/服务器等

即:外网访问局域网网段 192.168.100.0/24


✅ 示例环境参数(可按你的实际替换)

项目示例值
局域网网段192.168.100.0/24
网关机局域网 IP192.168.100.240
网关机 LAN 网卡ens34
ZeroTier 网段10.121.15.0/24
网关机 ZeroTier IP10.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
ip -br a

示例:

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 开头)

1
ip -br link | grep zt

或:

1
ip addr | grep -A2 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 -br a

查看默认路由

1
ip route | grep default

查看 iptables

1
2
iptables -t nat -S
iptables -S

查看保存规则文件

1
cat /etc/iptables/rules.v4

清屏

1
clear

或快捷键:Ctrl + L


发布前提示(建议)📌

  • 请确保 WebShell/SSH 等管理端口不暴露公网(内网/ZeroTier 内访问最安全)
  • 若你不想使用 NAT(更干净),也可以走「主路由静态路由」方案:
    主路由增加 10.121.15.0/24 -> 192.168.100.240(需要你能改主路由)

至此,ZeroTier 内网穿透方案(含自动识别网段脚本)完整结束。
欢迎直接复制本文发布或二次编辑。