skip to content
Liu Yang's Blog

【TUN 模式 + 双网卡分流】让内网主机访问互联网

/ 5 min read

Updated:
Table of Contents

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

假设存在如下场景:

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

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

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

假设笔记本的外网地址示例为:172.16.0.100


核心思路

  1. 调整路由表优先级
    • 内网网段 → 走内网网关
    • 其他所有流量(0.0.0.0/0)→ 走外网网关
  2. 将笔记本上的 🐱(HTTP / 🧦 代理)暴露到局域网
    • 内网设备将流量 proxy 到笔记本
  3. 问题来了 🤔
    • DNS 解析怎么办?
    • 某些冷门应用不支持代理怎么办?
  4. 解决方案:直接上 TUN 网卡
    • 不讲道理 😈
    • TCP / UDP 统统接管

内外网与双网卡分流原理

假设网络环境如下:

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

若需要持久化路由规则,通常需要在命令中添加 -p 参数(不同系统略有差异)。

一点小知识

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

Windows 下的内外网分流

Terminal window
# 查看 IPv4 路由表
route print -4
# 删除默认路由
route delete 0.0.0.0
# 设置新的默认路由(外网网关)
route add 0.0.0.0 mask 0.0.0.0 172.16.0.1
route add 0.0.0.0 mask 0.0.0.0 172.16.0.254
# 针对内网网段添加静态路由(示例)
route add 10.0.0.0 mask 255.255.255.0 192.168.0.1 metric 10

⚠️ 注意

  • 网关、网段、metric 均需根据实际环境调整
  • 管理员权限是必须的

Linux / Debian(以 Debian 13 为例)

Linux 下配置就优雅得多了 🐧

命令行方式

Terminal window
# 删除有线网卡的默认路由
sudo ip route del default dev eth0
# 添加静态路由:内网网段走内网网关
sudo ip route add 10.0.0.0/24 via 192.168.0.1 dev eth0
# 查看当前路由
ip route show

GNOME 桌面方式

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

该选项会自动阻止该连接成为默认路由,非常省心 👍


TUN 网卡配置 / 🎵-Box 示例

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

下面示例为 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": "192.168.0.2",
"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 均为脱敏后的私有地址
  • FakeIP 非常适合复杂应用、游戏、CLI 工具等场景

这项技术还能做什么?

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

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

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


使用ChatGPT润色