环境介绍
本实验采用单网口旁路由架构:
光猫(桥接)
↓
主路由(NX30Pro,192.168.124.1)
↓
交换机
├─ Windows(192.168.124.12)
└─ Ubuntu旁路由(192.168.124.14)旁路由与客户端处于同一网段,通过修改客户端网关实现流量接管。
一、网络环境测试
在本步骤中,我们要验证旁路由主机具备完整网络能力,包括:
正确的 IP 与网关配置
可访问主路由
可访问公网 IP
DNS 解析正常
这是后续进行流量转发与 NAT 的基础。
确认Ubuntu主机的IP配置、网卡
ip a确认Ubuntu主机默认网关正确
ip route确认Ubuntu主机的网络联通性
ping -c 4 192.168.124.1 #内网(主路由)
ping -c 4 8.8.8.8 #公网IP
ping -c 4 baidu.com #DNS说明:
该步骤的目的是确认旁路由主机具备完整网络能力。
若此步骤不通过,后续 NAT 与转发配置均无意义。
二、开启IP转发
在 Linux 中,默认情况下系统不会转发数据包,因此旁路由必须开启 IP 转发功能。
编辑Ubuntu主机IP转发配置
sudo nano /etc/sysctl.conf找到并取消注释、或添加
net.ipv4.ip_forward=1立刻生效设置
sudo sysctl -p验证设置
cat /proc/sys/net/ipv4/ip_forward值为“1”则成功
说明:
默认情况下,Linux 仅处理发往自身的数据包,不会转发其他设备的流量。
开启 ip_forward 后,系统才具备“路由器”的基本能力。
三、配置NAT
在单臂旁路由架构中,NAT 是保证通信正常的关键步骤。
如果没有 NAT,返回流量将绕过旁路由,导致连接异常。
如果不配置 NAT,数据流如下:
Windows(192.168.124.12) → Internet
返回 → 主路由 → Windows返回流量绕过旁路由,导致连接异常。
正确流程(有 NAT)
Windows → Ubuntu(伪装成192.168.124.14)→ Internet
返回 → Ubuntu → Windows在Ubuntu主机执行,实现源地址伪装,即所有从 enp2s0 发出去的流量,都伪装成Ubuntu主机自己的 IP
配置NAT
sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE网卡为enp2s0
验证设置
sudo iptables -t nat -L -n -v主要观察
MASQUERADE ... enp2s0
pkts > 0 表示规则生效四、配置FORWARD
配置 FORWARD
sudo iptables -A FORWARD -i enp2s0 -j ACCEPT
sudo iptables -A FORWARD -o enp2s0 -j ACCEPT
sudo iptables -P FORWARD ACCEPTFORWARD必须配置。NAT 仅修改地址,不负责放行数据包
如果 FORWARD 未放行,会出现:
Windows → Ubuntu(成功)
Ubuntu → 外网(被丢弃)表现为:tracert 第一跳正确,但无法上网
五、在 Windows 上指定网关和 DNS
设置网关和DNS
网关:192.168.124.14
DNS:192.168.124.14 或 192.168.124.1在未部署 DNS 服务时:
即使设置为 192.168.124.14,仍可能正常上网
原因是:
DNS请求 → Ubuntu→ 主路由 → 返回实际是“透明转发”,并非旁路由解析
要确认是否真正接管 DNS,在 Ubuntu:
ss -lntup | grep :53若仅有:
127.0.0.53:53说明未对外提供 DNS 服务
以下项目有DNS服务
AdGuard Home
dnsmasq
smartdns
mihomo / sing-box 内置 DNS
在Windows执行
tracert 8.8.8.8出现类似以下结果
1 * * *
2 192.168.124.1这是 Linux 单臂旁路由的常见现象:
Windows 发 TTL=1
Ubuntu主机 收到后转发(而不是“终止并返回”)
ICMP Time Exceeded 没正确回传
判断旁路由是否成功,结合以下命令
sudo tcpdump -i enp2s0 icmp若看到:
192.168.124.12 → 外网
192.168.124.14 → 外网表示 NAT 已生效,旁路由成功
六、常见问题排查
1、设置网关为旁路由后无法上网
现象
Windows 设置网关为
192.168.124.14tracert第一跳是旁路由但无法访问网页
原因
FORWARD 链未放行
若只配置 NAT:
iptables -t nat -A POSTROUTING ...但忽略:
NAT ≠ 放行数据包本质
Windows → Ubuntu(成功)
Ubuntu→ 外网(被丢弃)解决
sudo iptables -A FORWARD -i enp2s0 -j ACCEPT
sudo iptables -A FORWARD -o enp2s0 -j ACCEPT
sudo iptables -P FORWARD ACCEPT2、NAT 已配置但仍无法上网
现象
已执行 MASQUERADE
但
tcpdump显示:
192.168.124.12 → 外网而不是:
192.168.124.14 → 外网原因
NAT 规则未命中(规则顺序问题)
由于系统中存在:
Docker
1Panel
会自动插入 NAT 规则链
解决
sudo iptables -t nat -I POSTROUTING 1 -o enp2s0 -j MASQUERADE验证
sudo iptables -t nat -L -n -v确认:
pkts > 03、tracert 第一跳不显示旁路由
现象
1 * * *
2 192.168.124.1正常,不代表失败
原因
Linux 转发行为:
TTL=1 数据包直接转发
未返回 ICMP Time Exceeded
正确验证方法
sudo tcpdump -i enp2s0 icmp如果看到:
192.168.124.12 → 外网
192.168.124.14 → 外网说明旁路由已生效
4、DNS 设置为旁路由后无法访问网站
现象
DNS =
192.168.124.14大部分网站打不开
原因
旁路由未运行 DNS 服务
常见误区
即使能访问部分网站,也可能是:
DNS 缓存
浏览器缓存
解决方案
方案 A(临时)
DNS = 主路由(192.168.124.1)方案 B(推荐)
部署 DNS 服务:
AdGuard Home
dnsmasq
smartdns
mihomo DNS
5、DNS 设置为旁路由却“可以上网”
现象
DNS =
192.168.124.14仍然可以访问网页
原因
DNS 请求被“透明转发”
实际路径:
Windows → Ubuntu→ 主路由 → DNS验证方法
ss -lntup | grep :53若只有:
127.0.0.53:53表示未真正接管 DNS
6、设置网关后不走旁路由
现象
tracert 第一跳仍然是主路由原因
① VPN 干扰
26.0.0.1(Radmin VPN)抢占默认路由
② 多网卡优先级
WiFi
虚拟网卡
解决
禁用 VPN 网卡
禁用多余网卡
检查:
route print7、IPv6 导致旁路由失效
现象
设置 IPv4 网关后仍异常
部分网站能访问,部分不行
原因
Windows 默认优先 IPv6
本质
IPv6 流量绕过旁路由解决
临时关闭 IPv6:
网络适配器 → 取消 IPv6七、拓展:部署mihomo实现正常上网
面板下载:MetaCubeX/metacubexd: Mihomo Dashboard, The Official One, XD
配置文件参考/opt/mihomo/config/config.yaml:
port: 7890
socks-port: 7891
redir-port: 7892
allow-lan: true
mode: rule
log-level: info
external-controller: 0.0.0.0:9090
external-ui: ui
secret: "pocream"
profile:
store-selected: true
store-fake-ip: true
unified-delay: true
tcp-concurrent: true
dns:
enable: true
listen: 0.0.0.0:53
ipv6: true
enhanced-mode: redir-host
fake-ip-range: 28.0.0.1/8
use-hosts: true
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- 1.1.1.1
- 8.8.8.8
fallback-filter:
geoip: false
tun:
enable: true
stack: system
auto-route: false
auto-redirect: false
auto-detect-interface: true
# 订阅
proxy-providers:
mysub:
type: http
url: "https://daili.pocream.com"
interval: 3600
path: ./providers/mysub.yaml
health-check:
enable: true
interval: 600
url: https://www.gstatic.com/generate_204
proxy-groups:
- name: 节点选择
type: select
use:
- mysub
proxies:
- DIRECT
- name: 自动选择
type: url-test
use:
- mysub
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 50
- name: 国外流量
type: select
proxies:
- 自动选择
- 节点选择
- DIRECT
- name: 国内流量
type: select
proxies:
- DIRECT
- 国外流量
rules:
- DOMAIN-SUFFIX,lan,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
- MATCH,国外流量