200字
基于 Ubuntu 单网口实现旁路由
2026-04-02
2026-04-04

环境介绍

本实验采用单网口旁路由架构:

光猫(桥接)
   ↓
主路由(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 ACCEPT

FORWARD必须配置。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.14

  • tracert 第一跳是旁路由

  • 但无法访问网页

原因

  • 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 ACCEPT

2、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 > 0

3、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 print

7、IPv6 导致旁路由失效

现象

  • 设置 IPv4 网关后仍异常

  • 部分网站能访问,部分不行

原因

Windows 默认优先 IPv6

本质

IPv6 流量绕过旁路由

解决

临时关闭 IPv6:

网络适配器 → 取消 IPv6

七、拓展:部署mihomo实现正常上网

下载:MetaCubeX/mihomo: A simple Python Pydantic model for Honkai: Star Rail parsed data from the Mihomo API.

面板下载: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,国外流量

基于 Ubuntu 单网口实现旁路由
作者
Pocream
发表于
2026-04-02
License
CC BY-NC-SA 4.0

评论