你已经会用内网穿透了。但你是否遇到过这样的需求:不只想连上家里那一台服务器,还想顺手访问家里局域网里的其他设备,比如 NAS、路由器管理页面、KVM 虚拟机,甚至整个
192.168.0.0/24网段?本文正是为此而写。
适合哪些人读
- 已经用 ZeroTier、WireGuard、FRP 或其他工具搭建好了异地互联
- 希望以家里那台 Linux 为跳板,访问家里整个局域网
- 想把配置做得优雅一点,可维护,可复用
如果还没搭建好内网穿透,可先参考这篇教程: 👉 把服务器放在贵州深山,随时从沿海大城市访问算力
场景说明
本文以如下典型场景为例:
| 角色 | 说明 |
|---|---|
| 家里的 Linux 主机 | Debian,局域网 IP 192.168.0.100,异地组网 IP 10.144.0.100 |
| 家里的 KVM 虚拟机 | 运行在该主机上,网段 192.168.122.0/24 |
| 家里局域网 | 路由器下所有设备,网段 192.168.0.0/24 |
| 办公室 / 移动端电脑 | 通过异地组网与家里主机互联 |
目标: 在办公室,通过异地组网 IP 访问家里 192.168.122.x 和 192.168.0.x 网段的所有设备,流量经由 10.144.0.100 (家里主机)中转。
架构示意:
1
2
3
4
5
6
7
办公室电脑
│
│ 异地组网隧道(ZeroTier / WireGuard 等)
▼
10.144.0.100(家里 Linux 主机,异地组网 IP)
├──► 192.168.122.0/24(KVM 虚拟机)
└──► 192.168.0.0/24(局域网所有设备)
系统推荐
异地互联的机器建议统一使用 Linux,推荐 Debian:
- 软件包兼容性好,
apt生态完善 - 社区活跃,遇到问题容易找到答案
- 本文所有命令均基于 Debian,其他发行版(Ubuntu、CentOS 等)理论上可用,个别路径或命令可能有差异
第一步:家里 Linux 主机开启 IP 转发
IP 转发(IP Forwarding)允许主机将收到的数据包转发到其他网络接口,是实现”网关”功能的核心。
临时开启(重启失效)
1
echo 1 > /proc/sys/net/ipv4/ip_forward
永久开启(推荐)
编辑 /etc/sysctl.conf,找到或添加以下行:
1
net.ipv4.ip_forward = 1
立即生效:
1
sudo sysctl -p
验证是否成功:
1
2
sysctl net.ipv4.ip_forward
# 输出应为:net.ipv4.ip_forward = 1
第二步:办公室 Linux 电脑配置静态路由
方案:使用 systemd 服务自动管理路由
直接用 ip route add 命令添加路由在重启后会丢失。我们用一个 systemd 服务来实现开机自动添加、关机自动清理,并且在网络未就绪时自动重试。
配置分为两个文件:
/etc/static-routes.conf(路由变量配置,日常只改这里)
1
2
3
4
5
6
7
8
# 路由网关 IP(家里主机的异地组网 IP)
GATEWAY=10.144.0.100
# 异地组网虚拟网卡名(用 ip link 查看,ZeroTier 通常以 zt 开头,WireGuard 通常为 wg0)
IFACE=ztuku5jfcs
# 目标网段,英文逗号分隔,可随意增减
ROUTES="192.168.122.0/24,192.168.0.0/24"
如何查看网卡名:
1 2 ip link show # ZeroTier 网卡通常以 zt 开头,WireGuard 通常为 wg0
/etc/systemd/system/static-routes.service(服务文件,一般不需要改动)
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
[Unit]
Description=Add static routes via specified gateway
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/static-routes.conf
# 等待网关可达,最多重试 10 次,每次间隔 3 秒(共 30 秒)
ExecStartPre=/bin/sh -c '\
for i in 1 2 3 4 5 6 7 8 9 10; do \
ping -c1 -W2 $GATEWAY && exit 0; \
sleep 3; \
done; exit 1'
ExecStart=/bin/sh -c '\
for route in $(echo $ROUTES | tr "," " "); do \
ip route replace $route via $GATEWAY dev $IFACE; \
done'
ExecStop=/bin/sh -c '\
for route in $(echo $ROUTES | tr "," " "); do \
ip route del $route via $GATEWAY dev $IFACE 2>/dev/null || true; \
done'
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
几个设计细节:
ExecStartPre先 ping 网关,确认异地组网隧道通了再添加路由,避免系统刚启动时网络未就绪导致的失败ip route replace是幂等操作,重复执行不会报错Restart=on-failure+RestartSec=30保证万一启动失败,systemd 会自动重试
启用服务
1
2
sudo systemctl daemon-reload
sudo systemctl enable --now static-routes
验证:
1
2
sudo systemctl status static-routes
ip route show | grep 192.168
日后增加新网段,只需编辑 /etc/static-routes.conf 的 ROUTES 行,然后:
1
sudo systemctl restart static-routes
第三步:办公室电脑配置静态路由
博主的办公室电脑同样是 Linux,因此本文以 Linux 的 systemd 方案作为示例,配置方式与上文完全一致,复用同一份配置文件即可。
如果你使用的是 Windows 或 macOS ,核心思路相同——在本机添加一条静态路由,告诉系统访问家里的网段时走异地组网的虚拟网卡。由于博主手边没有这两种环境,无法逐一验证,这里就不贴具体命令了,避免误导。建议搜索以下关键词自行配置:
- Windows:
route add命令,或在网络适配器高级设置中添加静态路由 - macOS:
sudo route -n add -net命令,或通过 LaunchDaemon 实现开机自动生效
验证全链路
配置完成后,从办公室电脑测试:
1
2
3
4
5
6
7
8
# 能否 ping 通家里 KVM 虚拟机
ping 192.168.122.x
# 能否 ping 通家里其他局域网设备
ping 192.168.0.x
# 访问家里路由器管理页面(通常是 192.168.0.1)
curl http://192.168.0.1
如果不通,排查顺序:
- 异地组网是否连接正常(以 ZeroTier 为例:
zerotier-cli peers,其他工具参考各自文档) - 家里主机 IP 转发是否开启:
sysctl net.ipv4.ip_forward - 办公室电脑路由是否生效:
ip route show(Linux)/route print(Windows) - 家里主机防火墙是否放行转发流量:检查
iptables -L FORWARD
小结
| 步骤 | 操作 |
|---|---|
| 家里 Linux | 开启 net.ipv4.ip_forward = 1 |
| 办公室 Linux | 部署 static-routes systemd 服务 |
| 办公室 Windows / macOS | 原理相同,使用各平台路由命令自行配置 |
核心思路很简单:让办公室电脑知道,访问家里网段要走异地组网隧道,由家里的 Linux 主机做转发中继。 一旦理解了这个原理,不管用 ZeroTier、WireGuard 还是其他异地组网工具,配置思路完全一致,只需把网关 IP 和网卡名替换掉即可。