首页 内网穿透进阶:一台家用 Linux 当网关,异地访问家里所有设备
文章
取消

内网穿透进阶:一台家用 Linux 当网关,异地访问家里所有设备

你已经会用内网穿透了。但你是否遇到过这样的需求:不只想连上家里那一台服务器,还想顺手访问家里局域网里的其他设备,比如 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.x192.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.confROUTES 行,然后:

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

如果不通,排查顺序:

  1. 异地组网是否连接正常(以 ZeroTier 为例:zerotier-cli peers,其他工具参考各自文档)
  2. 家里主机 IP 转发是否开启:sysctl net.ipv4.ip_forward
  3. 办公室电脑路由是否生效:ip route show(Linux)/ route print(Windows)
  4. 家里主机防火墙是否放行转发流量:检查 iptables -L FORWARD

小结

步骤操作
家里 Linux开启 net.ipv4.ip_forward = 1
办公室 Linux部署 static-routes systemd 服务
办公室 Windows / macOS原理相同,使用各平台路由命令自行配置

核心思路很简单:让办公室电脑知道,访问家里网段要走异地组网隧道,由家里的 Linux 主机做转发中继。 一旦理解了这个原理,不管用 ZeroTier、WireGuard 还是其他异地组网工具,配置思路完全一致,只需把网关 IP 和网卡名替换掉即可。

本文由作者按照 CC BY 4.0 进行授权

我用 sing-box 搭了一套极致精准的科学上网方案(全平台通用+网关化)

-