skip to content
Liu Yang's Blog

TUN + 双网卡分流:让内网主机上网

/ 6 min read

Updated:
Table of Contents

在内网进行开发 / 部署时,经常会遇到这样一种情况:
内网机器几乎不可能直接接入互联网,例如无法外接网线、无法修改网络拓扑等。
那么,有没有一种“曲线救国”的方式,让内网主机也能访问互联网呢?

假设存在如下场景:

  1. 一台无法直接联网的内网设备
    • 内网地址示例:10.0.0.10
  2. 一台笔记本电脑,可以接入该内网
    • 内网地址示例:10.0.1.100

内网网段示例为 10.0.0.0/8,内网网关为 10.0.0.1。

显然,只要笔记本能够同时连接内网与外网,问题就有解:

  • 内网:通过有线网卡接入
  • 外网:通过无线或另一块有线网卡接入

假设笔记本的外网地址示例为 172.16.0.100,外网网关为 172.16.0.1。


核心思路

  1. 调整路由表优先级
    • 内网网段 → 走内网网关
    • 其他所有流量(0.0.0.0/0)→ 走外网网关
  2. 将笔记本上的代理工具(HTTP / SOCKS)暴露到局域网
    • 内网设备将流量 proxy 到笔记本
  3. 但仍存在两个问题
    • DNS 解析怎么办?
    • 某些应用不支持代理协议怎么办?
  4. 解决方案:直接上 TUN 网卡
    • TCP / UDP 流量全部接管,无需逐应用配置代理

内外网与双网卡分流原理

假设网络环境如下:

  • Wi-Fi:连接外网
  • 有线:连接内网

一点小知识

  • 大多数情况下:有线网卡的路由优先级高于无线
  • Linux 可以在单张网卡上配置多个 IP 和网关
  • Windows 踩过坑,不支持单网卡多IP和网关

Windows 下的内外网分流

Terminal window
# 查看 IPv4 路由表
route print -4
# 删除所有默认路由(有线和无线的都会删掉)
route delete 0.0.0.0
# 只把默认路由加回外网网关:其他所有流量走 Wi-Fi
route add 0.0.0.0 mask 0.0.0.0 172.16.0.1
# 内网网段走内网网关(加 -p 可以持久化,重启后仍然生效)
route -p add 10.0.0.0 mask 255.0.0.0 10.0.0.1 metric 10

⚠️ 注意

  • 网关、网段、metric 均需根据实际环境调整
  • 需要以管理员身份运行

Linux / Debian(以 Debian 13 为例)

Linux 下的配置更简洁:

命令行方式

Terminal window
# 删除有线网卡(内网)的默认路由,默认路由只留给 Wi-Fi
sudo ip route del default dev eth0
# 添加静态路由:内网网段走内网网关
sudo ip route add 10.0.0.0/8 via 10.0.0.1 dev eth0
# 查看当前路由
ip route show

GNOME 桌面方式

  1. 打开对应网络连接设置
  2. 点击 “路由…” (Routes…)
  3. 勾选: “仅用于此网络上的资源” (Use this connection only for resources on its network)

该选项会自动阻止该连接成为默认路由,无需手动调整路由表。


TUN 网卡配置 / sing-box 示例

当代理方案无法覆盖所有应用时,TUN 模式是最省事的选择。

下面的 sing-box 配置运行在内网设备上:TUN 网卡接管设备上的所有 TCP / UDP 流量和 DNS,再转发到笔记本暴露在内网的 SOCKS 代理(10.0.1.100:7890),由笔记本经 Wi-Fi 送出去。私有地址的流量仍然直连。

示例使用 FakeIP 模式,用于完全接管流量:

{
"log": {
"level": "warning",
"timestamp": true
},
"experimental": {
"cache_file": {
"enabled": true,
"store_rdrc": true
}
},
"dns": {
"independent_cache": true,
"servers": [
{
"type": "local",
"tag": "local",
"detour": "default"
},
{
"tag": "fakeip",
"type": "fakeip",
"inet4_range": "198.18.0.0/15",
"inet6_range": "fc00::/18"
}
],
"rules": [
{
"query_type": ["A", "AAAA"],
"server": "fakeip"
}
]
},
"inbounds": [
{
"type": "tun",
"address": [
"172.18.0.1/30",
"fd00::1/126"
],
"auto_route": true,
"auto_redirect": true,
"strict_route": true
},
{
"type": "mixed",
"listen": "127.0.0.1",
"listen_port": 17890,
"set_system_proxy": true
}
],
"outbounds": [
{
"tag": "default",
"type": "selector",
"default": "proxy",
"outbounds": ["proxy", "direct"]
},
{
"tag": "direct",
"type": "direct"
},
{
"tag": "proxy",
"type": "socks",
"server": "10.0.1.100",
"server_port": 7890
}
],
"route": {
"final": "default",
"auto_detect_interface": true,
"rules": [
{ "action": "sniff" },
{ "protocol": "dns", "action": "hijack-dns" },
{ "ip_is_private": true, "outbound": "direct" }
]
}
}

📌 说明

  • 示例 IP 均为脱敏后的私有地址
  • 笔记本上的代理需要监听内网地址(或 0.0.0.0)并允许局域网连接,否则内网设备连不上
  • FakeIP 非常适合复杂应用、游戏、CLI 工具等场景

这项技术还能做什么?

  1. 在支持策略路由的路由器中接入 多 WAN

    • 例如:运营商 A + 运营商 B
    • 国内流量走 A,国际流量走 B
  2. 内网调试、渗透测试、应急运维

  3. 在不改动内网拓扑的前提下实现“准上网环境”