使用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.WIM2.配置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
© 2019 - ZXQ's Diary - zhangxiaoqiang.top