我正在尝试在不使用 NATting 的情况下将数据包转发到防火墙,以保留原始目标 IP。
场景如下:
- 我有一台连接到互联网的物理服务器多个外部 IP仅通过一个物理网络适配器。
- 此物理服务器作为虚拟机管理程序运行。其中一个虚拟机正在运行 pfSense 作为防火墙,并应负责所有到其他虚拟机的端口转发(这些虚拟机位于不同的网络中,只有防火墙可以直接访问并进行 NAT)。
- 这个想法是将多个外部 IP 的传入数据包转发/重定向到 pfSense 防火墙,这样我就可以只在该中心位置设置一次端口转发规则。
问题是,如果我使用 NAT,我当然会在将传入数据包传递到防火墙之前将其目标 IP 替换为防火墙的 IP。如果只有一个外部 IP,这种方法没问题,但如果有多个外部 IP,我将丢失有关最初针对哪个外部 IP 的信息,这实际上限制了我只能在所有外部 IP 上进行一次端口转发。
问题:有没有办法将数据包转发到 pfSense 防火墙而不改变目标 IP 或者以某种方式保留此信息以供 pfSense 防火墙使用?
我尝试使用 iptables mangle 表并为数据包设置 mark / fwmark + 使用 ip route 和 ip rule 来重定向包,但它似乎不起作用:
Hypervisor:
External IP 1 = 123.123.123.123
Firewall network IP = 10.0.0.1
pfSense firewall
Firewall network IP = 10.0.0.2
iptables -t mangle -A PREROUTING -d 123.123.123.123/32 -j MARK --set-mark 1
iptables -A FORWARD -d 123.123.123.123/32 -j ACCEPT
ip route flush table 1
ip route add table 1 default via 10.0.0.2
ip rule add fwmark 1 table 1
ip 规则确实有效:
# ip route get 1.1.1.1 mark 0
1.1.1.1 via 123.123.123.1 dev xenbr0 src 123.123.123.123 uid 0
cache
# ip route get 1.1.1.1 mark 1
1.1.1.1 via 10.0.0.2 dev xenbr0 table 1 src 10.0.0.1 mark 1 uid 0
cache
iptables 显示这些相关规则确实得到正确执行,但是当我在虚拟机管理程序上运行 tcpdump 时:
tcpdump -i any -n tcp and dst port 12345
那么我只会看到传入数据包的两个条目,而不是像使用 DNAT 时那样看到的另一组两个条目。
pfSense 上的 tcpdump 没有显示任何内容:
tcpdump -i xn0 -n tcp and dst port 12345
此时我不确定 iptables 或 ip 路由/规则部分是否正常工作,但我找不到好的方法来测试它。
我愿意接受不同的方法,但我想保留当前的网络布局。
谢谢你!