![如何将数据包转发到防火墙同时保留原始目的地?](https://linux22.com/image/1603338/%E5%A6%82%E4%BD%95%E5%B0%86%E6%95%B0%E6%8D%AE%E5%8C%85%E8%BD%AC%E5%8F%91%E5%88%B0%E9%98%B2%E7%81%AB%E5%A2%99%E5%90%8C%E6%97%B6%E4%BF%9D%E7%95%99%E5%8E%9F%E5%A7%8B%E7%9B%AE%E7%9A%84%E5%9C%B0%EF%BC%9F.png)
我正在尝试在不使用 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 路由/规则部分是否正常工作,但我找不到好的方法来测试它。
我愿意接受不同的方法,但我想保留当前的网络布局。
谢谢你!