使用OpenWrt进行路由转发实现两个网段之间的互通

HTML  2026-02-13 14:53  2  

折腾家里的ALL IN ONE小主机,现在想实现常用设备不连接我的服务器内网,因为会导致我折腾小主机时其他手机\智能家具设备断网,想让手机等一般上网设备与服务器网络分离开来,但又需要支持互相访问(NAS以及手机管理服务器).

首先介绍一下网络,小主机安装了RouterOS作为服务器网络的路由192.168.4.0/24,ROS的WAN口交给CPE用于互联网访问,CPE流量不够但稳定,用于服务器轻度使用(没有长期占用网络的服务),因此用另一条网络用于日常上网192.168.123.0/24,现在想打通两个网络,让他们变得不那么完全分开,及可以在服务器管理到到日常上网的路由器,也可以用手机管理服务器.

开始是将小主机分配一个网口给ESXI的win7虚拟机,这样win7就有双网卡(4网段和123网段),然后将win7设置为网关,在123路由器设置静态路由,路由4网段的数据到win7上,最后发现走不通(使用的是配置开启系统的路由转发功能,注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter方式),搞到晚上两点由于要上班只有先搁置,夜里睡不着想着为什么不用OpenWrt充当这个角色,于是花半天时间折腾Openwrt成功.


网络拓扑

主网络(4网段): 192.168.4.0/24,网关 192.168.4.1, (网关连接外网192.168.8.1,与配置无关)

内网段(123网段): 192.168.123.0/24,网关 192.168.123.1

4网段由ESXI中的软路由管理,所有4网段的机器都是虚拟机,123网段是硬路由

OpenWrt 双网卡:

eth0: 192.168.4.250(连接4网段)

eth1: 192.168.123.250(连接123网段)

1.首先安装OpenWrt,备忘一下,由于OpenWrt都是img镜像,想要在虚拟平台安装,必须使用转换工具将Img文件转换成虚拟磁盘,ESXI对应就是vmdk,或者使用网友将img封装到pe的iso镜像,通过iso虚拟光驱启动pe,在pe中将img写入硬盘方式,安装OpenWrt.

我使用的是OpenWrt-19.08.iso,目录树如下,佩服人类的智慧

F:\>tree /F
卷 WePE64 的文件夹 PATH 列表
卷序列号为 3F0D-F757
F:.
│  BOOTMGR
│  IMG写盘工具.exe
│  openwrt-19.07.8-x86-64-combined-squashfs.img
│
├─EFI
│  ├─BOOT
│  │      bootx64.efi
│  │
│  └─MICROSOFT
│      └─BOOT
│              BCD
│
└─WEPE
        B64
        WEPE.SDI
        WePE64.WIM

2.配置OpenWrt

安装完成后在控制台修改eth0为的ip为固定192.168.4.250,不需要设置网关,除非你想在这个上面运行其他服务,我这里让他作为纯路由转发,进入luci操作剩余步骤

删除默认创建的wan和wan6口,绑定为eth1,新建名为LAN2的接口,设置固定ip192.168.123.250,不需要设置网关

编辑LAN口,取消桥接,禁用dhcp服务器

3.配置4网段,123网段的路由器,设置静态路由

由于需要123网段能访问4网段,4网段又需要访问123网段,因此他们都需要配置静态路由,当访问对应网段的数据时都去找当前网段内的192.168.x.250(x是4或者123)

具体就是

4网段:目标网络192.168.123.0/24,网关192.168.4.250

123网段:目标网络 192.168.4.0/24,网关192.168.123.250,

4.接下来是新知识点,你会发现在设置完两边路由的静态路由后,两个网络的设备可以互相访问对方的路由,也就是

192.168.4.x可以访问到192.168.123.1路由器管理页面

192.168.123.x可以访问到192.168.4.1路由器管理页面

对方网络的其他设备的ip可以ping通,但像web服务等却无法使用,路由追踪如下:

[root@localhost ~]# traceroute 192.168.123.1
traceroute to 192.168.123.1 (192.168.123.1), 30 hops max, 60 byte packets
 1  gateway (192.168.4.1)  0.484 ms  0.408 ms  0.345 ms
 2  192.168.4.250 (192.168.4.250)  0.865 ms  0.831 ms  0.787 ms
 3  192.168.123.1 (192.168.123.1)  1.216 ms  1.372 ms  1.304 ms

[RT-AC54U /home/root]# traceroute 192.168.4.200
traceroute to 192.168.4.200 (192.168.4.200), 30 hops max, 38 byte packets
 1  192.168.123.250 (192.168.123.250)  0.359 ms  0.193 ms  0.312 ms
 2  192.168.4.200 (192.168.4.200)  0.705 ms !C  0.581 ms !C  0.501 ms !C
[RT-AC54U /home/root]#  traceroute 192.168.4.201
traceroute to 192.168.4.201 (192.168.4.201), 30 hops max, 38 byte packets
 1  192.168.123.250 (192.168.123.250)  0.249 ms  0.449 ms  0.626 ms
2 192.168.4.201 (192.168.4.201) 0.585 ms * 0.685 ms [RT-AC54U /home/root]# curl http://192.168.4.201 curl: (56) Recv failure: Connection reset by peer

可以看到到路由器,数据包能正常过去,而到其他主机则会被拒绝(traceroute 显示包能到达 192.168.4.200,但返回了 !C(Communication Administratively Prohibited),

下面是求助ai过程

好的,让我给你总结一下根本原因:
核心问题:非对称路由 + 严格的防火墙状态检查
数据包的实际路径
从 123 网段访问 4.1(路由器):

去程:123.x → 123.250(OpenWrt)→ 4.250(OpenWrt)→ 4.1
回程:4.1 → 4.250(OpenWrt)→ 123.250(OpenWrt)→ 123.x
✅ 路径对称,往返都经过同一个设备(OpenWrt) 从 123 网段访问 4.200/201(服务器): 去程:123.x → 123.250(OpenWrt)→ 4.250(OpenWrt)→ 4.200
回程:4.200 → 4.1(默认网关) → 4.250(OpenWrt)→ 123.250 → 123.x
❌ 路径不对称,回程多绕了一圈经过 4.1 为什么路径不对称会导致问题? 4.200 没有去 123 网段的路由,只有默认路由指向 4.1 所以 4.200 回包时发给了 4.1,4.1 再转给 OpenWrt OpenWrt 的防火墙做连接跟踪(conntrack),发现: 去程时看到了这个连接 但回程包是从 4.1 来的,不是从 4.200 直接来的 连接状态出现异常 更关键的是 4.200 的防火墙: 它的 firewalld 规则要求端口 80 必须是 ctstate NEW,UNTRACKED 从 123.x 来的包,因为非对称路由,连接状态不正常 被防火墙的最后一条 REJECT 规则拒绝了 为什么 4.1(路由器)没问题? 4.1 的防火墙是空的(你查过 iptables -L 是空的) 路由器设备不做严格的连接状态检查 即使路径稍微绕一下,路由器也能正常处理 SNAT 如何解决问题? SNAT 把源 IP 改成 OpenWrt 的 IP(4.250),强制让 4.200 的回包直接回给 4.250,而不是回给 4.1,从而实现了路径对称: 去程:123.x → OpenWrt(改成 4.250)→ 4.200 回程:4.200 → 4.250(直接回)→ OpenWrt → 123.x 这样防火墙的连接跟踪就正常了。

由于来回路由不对称,且路由器防火墙规则相对宽松

而其他主机(此处是Centos7)则有相对严格的防火墙规则

[root@localhost conf.d]# iptables -L IN_public_allow -n -v --line-numbers
Chain IN_public_allow (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
...
2       13   748 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 ctstate NEW,UNTRACKED
...


IN_public_allow 链的规则中,端口 80 只允许 ctstate NEW,UNTRACKED 的连接
关键在于 ctstate NEW,UNTRACKED。
从 123 网段过来的连接,经过了 OpenWrt 的 NAT 转发,连接状态可能不是 NEW 或 UNTRACKED,而是 RELATED 或其他状态,所以被防火墙拒绝了。

这里他让我去挨个修改4网段内的所有主机防火墙规则,(修改 firewalld 的 public zone,允许端口 80 的所有连接状态),

我骂了他一顿,让他上网找案例,最后找到案例Simple static routes not working when firewall+masquerading is active

说在防火墙和NAT开启的情况下,静态路由无法工作,需要添加SNAT规则,对于SNAT,我摘取AI的回答

SNAT 是 **Source NAT(源地址网络地址转换)**的缩写。
简单解释
SNAT 的作用就是修改数据包的源 IP 地址。
举个例子
没有 SNAT 的情况:
123网段的机器 (192.168.123.50) 访问 4网段的机器 (192.168.4.200)

发送的包:
源IP: 192.168.123.50
目标IP: 192.168.4.200

192.168.4.200 收到的包显示:来自 192.168.123.50
有 SNAT 的情况(在 OpenWrt 上做 SNAT):
123网段的机器 (192.168.123.50) 访问 4网段的机器 (192.168.4.200)

原始包:
源IP: 192.168.123.50
目标IP: 192.168.4.200

经过 OpenWrt (192.168.4.250) 的 SNAT 处理后:
源IP: 192.168.4.250  ← 被改了!
目标IP: 192.168.4.200

192.168.4.200 收到的包显示:来自 192.168.4.250
为什么需要 SNAT?
在你的场景中,SNAT 解决了回程路由的问题:
没有 SNAT:

123.50 发包给 4.200(源IP是 123.50)
4.200 收到后要回复给 123.50
4.200 查路由表,发现没有去 123 网段的路由,就从默认网关 4.1 出去
回包路径变了,导致防火墙的连接跟踪出问题

有 SNAT:

123.50 发包,OpenWrt 改成源IP 是 4.250
4.200 收到包,以为是 4.250 发来的
4.200 回复给 4.250(同一个网段,直接回复)
OpenWrt 收到回包,再转回给 123.50
往返路径都经过 OpenWrt,路径对称,防火墙正常工作

常见的 NAT 类型

SNAT(Source NAT): 改源 IP,用于让内网访问外网
DNAT(Destination NAT): 改目标 IP,用于端口转发
MASQUERADE: 自动 SNAT,常用于家用路由器上网

你家里的路由器其实就在用 MASQUERADE(一种自动的 SNAT),让你的手机、电脑可以共享一个公网 IP 上网。

所以我们需要的配置文件如下

vi /etc/config/firewall
# 123网段访问4网段时做SNAT
config nat
    option family 'ipv4'
    option src 'wan'
    option dest 'lan'
    option target 'SNAT'
    option snat_ip '192.168.4.250'

# 4网段访问123网段时做SNAT  
config nat
    option family 'ipv4'
    option src 'lan'
    option dest 'wan'
    option target 'SNAT'
    option snat_ip '192.168.123.250'
/etc/init.d/firewall restart

问他要到了luci的操作步骤,在Network-Firewall菜单中的NAT选项卡中,我的OpenWrt版本是19.07.8,表单如下

第一条规则(123网段访问4网段)

Name: SNAT_123_to_4
Protocol: Any
Outbound zone: lan(选择 lan,对应 eth0 / 4网段侧)
Source address: 192.168.123.0/24(填写 123 网段)
Destination address: 192.168.4.0/24(填写 4 网段)
Action: SNAT - Rewrite to specific source IP or port
Rewrite IP address: 192.168.4.250

点击 Save
第二条规则(4网段访问123网段)

Name: SNAT_4_to_123
Protocol: Any
Outbound zone: wan(选择 wan,对应 eth1 / 123网段侧)
Source address: 192.168.4.0/24(填写 4 网段)
Destination address: 192.168.123.0/24(填写 123 网段)
Action: SNAT - Rewrite to specific source IP or port
Rewrite IP address: 192.168.123.250
点击 Save 最后 点击页面顶部或底部的 Save & Apply 按钮应用配置。

最后还需要将General Settings中Forward的reject改为accept

配置后完成了我的需求,

此次折腾基本全是靠AI完成的,因为每个人的网络拓扑以及应用场景不一样,对于这些概念的说法也很不一样,很难从搜索引擎中找到跟你完全相同的案例,而AI靠着能与我们对话的特性,可以逐步了解我们的需求,帮我们寻求答案,虽然他会给你胡编乱造,将猜测作为事实的去给你提供答案,但只要你在关键时刻及时制止他,将他拉回正轨,他也还能是我们的好帮手!



发布于 2026-02-13 14:53, 最后修改于2026-02-13 15:01