标题
WireGuard Split Tunnel 实战:手机热点上外网,同时访问公司内网
副标题 / 摘要
你想在外网(手机热点)正常上网,同时访问公司内网(192.168.x.x)服务。 最干净的方式是:外网默认走手机热点,只有内网网段走 WireGuard(Split Tunnel)。
目标读者
- 需要在外网访问公司内网服务(Gitlab/内部 API/数据库)的开发者
- 公司内网没有官方 VPN,或现有 VPN 体验差
- 希望“分流”:外网不走公司出口,内网安全可控
背景 / 动机
很多公司内网服务只在私网开放(如 192.168.1.0/24)。
当你在外面用手机热点上网时:
- 外网访问没问题
- 但内网地址不可达
如果你把电脑同时连两条网络(公司 WiFi + 手机热点),“能用但不干净”: 路由/DNS 冲突、稳定性差、切换成本高。
WireGuard 的价值在于:
- 只打通你需要的内网网段(Split Tunnel)
- 外网仍走你自己的手机出口
- 连接快、配置简单、性能好
核心概念
- WireGuard:现代 VPN 协议与实现,配置简洁、性能优秀。
- Peer:对端节点(客户端/服务器)。
- AllowedIPs(关键):决定哪些流量走 VPN。
- Split Tunnel(分流):AllowedIPs 只写内网网段,不接管默认路由。
- NAT / 端口映射:服务器在内网(192.168.*)时,外网直连需要网关转发 UDP 端口。
思维推导(从“想要双网”到“正确分流”)
- 需求:公司内网访问 + 手机热点上外网。
- 朴素解:同时连两张网卡,靠系统自动选路由 → 不稳定。
- 关键观察:你的目标不是“同时连两张网”,而是“只让内网走公司通道”。
- 方法选择:WireGuard Split Tunnel:仅路由
192.168.x.x走 VPN。 - 约束:WireGuard 需要一个外网可达的 Endpoint;如果公司服务器在 NAT 后面,需要端口映射或中转方案。
A — Algorithm(题目与算法)
题目还原
电脑连手机热点上网,但还能访问公司内网(如 192.168.1.0/24)。
解法要点
- 让客户端的默认路由仍然是手机热点
- 为公司内网网段添加一条“更具体”的路由,走 WireGuard
在 WireGuard 里,这条路由由 AllowedIPs 决定。
C — Concepts(核心思想)
WireGuard 的最小心智模型
你有两类 IP:
- 公司内网 IP 段:例如
192.168.1.0/24 - WireGuard 虚拟网段:例如
10.200.200.0/24
- 公司内网 IP 段:例如
客户端通过 UDP 连接服务器
Endpoint,协商后建立加密隧道。当你的流量命中
AllowedIPs指定网段时,流量会进入隧道。
Split Tunnel 的关键
- ❌ 全流量 VPN(不适合你的目标):
AllowedIPs = 0.0.0.0/0
- ✅ 只接管公司内网(你要的):
AllowedIPs = 192.168.1.0/24
实践指南 / 步骤(从 0 部署)
下面以公司内网 192.168.1.0/24 为例,你可替换成自己的网段。
Step 0:确认公司服务器是否“外网可达”
在公司服务器上执行:
ip a
curl ifconfig.me
ip a看到192.168.*:说明服务器在内网curl ifconfig.me看到公网 IP:通常是公司出口 NAT(不代表这台服务器可被外网直连)
若服务器无公网入口,你需要:
- 端口映射(网关把 UDP 51820 转发到该服务器),或
- 用公网 VPS 做中转(后文提供方案),或
- 改用 Tailscale(更省事,但本文主讲 WireGuard)
Step 1:在公司内网服务器安装 WireGuard(Linux)
Ubuntu/Debian:
sudo apt update
sudo apt install -y wireguard
Step 2:生成密钥(Server & Client)
在服务器上生成:
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee client.key | wg pubkey > client.pub
Step 3:配置服务器 /etc/wireguard/wg0.conf
说明:下方
<...>用你自己的值替换;不要把私钥提交到仓库。
[Interface]
Address = 10.200.200.1/24
ListenPort = 51820
PrivateKey = <server_private_key>
# 开启转发 + NAT(让客户端能访问 192.168.1.0/24)
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -t nat -A POSTROUTING -o eno2 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eno2 -j MASQUERADE
[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.200.200.2/32
注意:
eno2是你公司内网网卡名(用ip a查看后替换)- 如果你希望多台客户端接入,每台一个
[Peer]并分配不同10.200.200.x
Step 4:开启转发(永久生效)
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Step 5:启动 WireGuard
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo wg
Step 6:让外网能连到公司服务器(端口映射)
如果公司服务器只有 192.168.x.x 这类内网地址,外网无法直接连到它。
你必须在公司网关/路由器上配置端口映射:
公网 UDP 51820 -> <WG_SERVER_LAN_IP>:51820
这是很多公司做不到的关键点:你需要能控制网关,或请网络管理员协助。
Step 7:客户端(Windows/macOS/Linux)配置
创建客户端配置 wg-client.conf:
[Interface]
Address = 10.200.200.2/24
PrivateKey = <client_private_key>
[Peer]
PublicKey = <server_public_key>
Endpoint = <公司公网IP或域名>:51820
# ✅ Split Tunnel:只把公司内网走 VPN
AllowedIPs = 192.168.1.0/24
PersistentKeepalive = 25
说明:
PersistentKeepalive=25对 NAT 环境非常重要(保持映射不超时)- 只写
192.168.1.0/24,外网仍走手机热点
可运行示例(验证与排错)
1)连通性验证
客户端连接 WireGuard 后:
# 内网是否能通
ping 192.168.1.10
# 外网出口是否仍是手机热点(应是你手机运营商/热点出口)
curl ifconfig.me
2)服务器端检查
sudo wg
sudo iptables -t nat -S | grep -n MASQUERADE || true
sudo sysctl net.ipv4.ip_forward
解释与原理(为什么这么配)
AllowedIPs 决定路由:它相当于在客户端路由表里加了一条“更具体”的规则。
为什么要 NAT(MASQUERADE):
- 你的公司内网机器(192.168.1.x)通常不知道
10.200.200.0/24这个网段怎么回包 - 通过 NAT,把客户端流量伪装成“来自服务器内网 IP”,就能直接通
- 为什么需要端口映射:
- WireGuard 的握手基于 UDP
- 若服务器在 NAT 后面,外网数据包无法被路由器自动转发到它
E — Engineering(工程应用)
场景 1:手机热点开发 + 访问内网 Gitlab
背景:外网走热点更稳定,但代码仓库只在内网。
为什么适用:Split Tunnel 只接管内网,不影响外网。
git clone http://192.168.1.20/your/repo.git
场景 2:外网排查内网服务(健康检查)
背景:需要在外面快速确认某个内网服务是否正常。
为什么适用:VPN 让你像在办公室一样访问内网 IP。
curl -sS http://192.168.1.10:8080/health || echo "health check failed"
场景 3:把 WireGuard 作为“最小权限入口”
背景:不想把 SSH/数据库暴露公网。
为什么适用:只开放 WireGuard UDP,一个口进入受控内网。
ssh user@192.168.1.30
R — Reflection(反思与深入)
成本与复杂度
- 部署复杂度:中等(关键在公网入口与路由/NAT)
- 运行开销:低(WireGuard 性能很好)
常见失败点(优先排查顺序)
- Endpoint 不可达:没做端口映射 / 被防火墙拦截
- AllowedIPs 配错:写成
0.0.0.0/0导致外网走公司 - 没开 ip_forward:客户端能握手但访问内网不通
- 没做 NAT 或回程路由:内网回包找不到
10.200.200.0/24 - DNS 问题:内网域名无法解析(需要内网 DNS)
替代方案(当你做不了端口映射)
- 最省事:Tailscale 子网路由(同样基于 WireGuard,NAT 穿透更友好)
- 自建:公网 VPS 做中转(Hub-and-Spoke)
- 运维化:FRP / 反向隧道
S — Summary(总结)
- 你的目标是“分流”,不是“同时连两张网”。
- WireGuard 的分流关键是
AllowedIPs:只写公司内网网段。 - 服务器在 NAT 后面时,最难的是“外网入口”(端口映射或中转)。
- 内网访问不通时,优先查:端口可达 → ip_forward → NAT/回程路由。
推荐延伸阅读:
- WireGuard Quick Start
- Linux
ip route与iptables基础
常见问题与注意事项
公司网关做不了端口映射怎么办?
优先用 Tailscale;如果必须自建,可用公网 VPS 做中转。Windows 连上 WireGuard 后,WSL 能用吗?
WSL1 通常没问题;WSL2 多数情况下也可访问同一路由。 若 WSL2 不通,建议开启 Windows 11 的 mirrored networking,或在 WSL 内单独安装 WireGuard。能不能把数据库端口暴露给外网?
不建议。更安全的做法是只暴露 WireGuard,再在内网访问数据库。
最佳实践与建议
- 只做 Split Tunnel:
AllowedIPs只包含内网网段。 - 最小暴露面:公网只开放 UDP 51820。
- 把“端口映射/防火墙/网卡名”写进运维文档,方便交接。
- 先跑通 IP,再解决 DNS(内网域名需要内网 DNS)。
小结 / 结论
WireGuard 完全可以实现“外网走手机热点、内网走 VPN”。 但成败关键在于:服务器是否有公网入口。 能做端口映射就用标准 WireGuard;做不了就考虑 Tailscale 或中转方案。
参考与延伸阅读
- https://www.wireguard.com/quickstart/
- https://man7.org/linux/man-pages/man8/ip.8.html
- https://man7.org/linux/man-pages/man8/iptables.8.html
元信息
- 阅读时长:约 12 分钟
- 标签:WireGuard、VPN、Split Tunnel、内网访问
- SEO 关键词:WireGuard, Split Tunnel, 内网访问, 端口映射, NAT
- 元描述:WireGuard Split Tunnel 实战教程,教你手机热点上外网同时访问公司内网,含端口映射与排错清单。
行动号召(CTA)
把你的内网网段(例如 192.168.1.0/24)和服务器网卡名(如 eno2)发我,
我可以帮你把配置替换成“可直接复制运行”的最终版,并补一份排错命令清单。