所以我被赋予了一个任务来总体了解firewalld 和linux 网络。这是我的测试设置:
路由器和客户端运行的是 Debian 12,笔记本电脑运行的是 Ubuntu 22.04。
此设置应实现以下目标:
- 路由器显然应该充当子网 192.168.8.0/24 和 192.168.7.0/24 之间的路由器
- 笔记本电脑和客户端应该能够互相 ping 通
- 如果源 IP 为 192.168.7.120,则来自客户端的流量应通过 192.168.8.120 进行 nated
- 如果源 IP 为 192.168.7.121,则来自客户端的流量应通过 192.168.8.121 进行 nat
- 具有firewalld标准功能的路由器上的防火墙,没有直接规则
我的问题是实现 5。无论我尝试什么,流量始终通过 192.168.8.120 进行 NAT。
这是防火墙配置:
firewall-cmd --permanent --new-zone=ext0
firewall-cmd --permanent --zone=ext0 --set-target=default
firewall-cmd --permanent --zone=ext0 --add-masquerade
firewall-cmd --permanent --zone=ext0 --add-forward
firewall-cmd --permanent --zone=ext0 --add-service=ssh
firewall-cmd --permanent --zone=ext0 --change-interface=enp1s0:0
firewall-cmd --permanent --zone=ext0 --add-source=192.168.7.120
firewall-cmd --permanent --zone=ext0 --add-source=192.168.8.100/32
firewall-cmd --permanent --new-zone=ext1
firewall-cmd --permanent --zone=ext1 --set-target=default
firewall-cmd --permanent --zone=ext1 --add-masquerade
firewall-cmd --permanent --zone=ext1 --add-forward
firewall-cmd --permanent --zone=ext1 --add-service=ssh
firewall-cmd --permanent --zone=ext1 --change-interface=enp1s0:1
firewall-cmd --permanent --zone=ext1 --add-source=192.168.7.121
firewall-cmd --permanent --zone=ext1 --add-source=192.168.8.0/24
我使用了各种配置,它们仅在接口名称方面略有不同,因为我尝试了不同的设备类型:
- 虚拟接口,我在这里看到的问题是 enp1s0:0 和 enp1so:1 等两个设备共享相同的 MAC 地址。尝试分配新的本地 MAC 地址,并尝试将每个接口包装到网桥中。
- VLAN,同样的问题,也尝试分配 MAC 并绕入网桥。
- 虚拟接口对于外界来说似乎是不可见的,包裹成桥也没有帮助。
基本思想是:两个区域,一个用于 192.168.8.120 上的流量,一个用于 192.168.8.121 上的流量。将具有相应 IP 的“传出”接口添加到每个区域,打开伪装和转发,最后添加“传入”接口或 IP 地址作为源。事实证明,仅添加接口是不够的,只有在添加 IP 源时才有效。
我看到的另一个问题是我无法将相同的源添加到firewalld 中的不同区域(注意源192.168.8.100/32 和192.168.8.0/24)。 AFAIK IP 源优先于接口,区域按字母顺序处理,因此至少来自 192.168.8.100 的流量(例如回显回复)将滞留在区域 ext0 中。
由于firewalld文档表明丰富的规则应该只是最后的手段,我还没有真正深入研究这一点(现在就这样做,任何指针都值得赞赏)。
那么我做错了什么?这可以通过firewalld的基本功能来完成吗?
预先感谢您的帮助:)