影响 POSTROUTING 链中或之后的出站接口选择吗?

影响 POSTROUTING 链中或之后的出站接口选择吗?

我有一个系统托管多个 KVM 实例。所有这些实例都连接到单个桥接器(例如brvirt),该桥接器也连接到eth1。此第 2 层环境位于使用 172.16.10.0/24 进行地址更改的私有网络上。系统上还有另外两个接口,我们将其称为eth0(10.10.10.10) 和eth2(10.10.20.20)。

一般情况下,外部连接是通过SNAT的地址提供的eth0(主机的默认网关也位于此接口之外)。对于一些系统,我想要一个SNAT在 10.10.20.0/24 网络上的明确 1-1 规则,该规则附加到eth2

这是一个问题,因为当我们点击POSTROUTING链来执行时SNAT,出站接口选择已经完成。内核已经选择了默认路由(假设连接到除直接连接的网络之外的任何网络),这意味着当规则SNAT修改源 IP 地址时,本地路由基础设施会丢弃数据包,因为它源自错误的第 2 层网络。

有什么办法可以解决这个问题吗?真的想要做的是根据链末端数据包的源地址做出路由决策POSTROUTING……但是这样做是POSTROUTING有充分理由的。

答案1

这可以通过简单的基于策略的路由来实现。

您将需要一组具有以下模式的规则和路线:

ip rule add from 172.16.10.X iif brvirt lookup 200
ip route add default via 1.2.3.4 src 4.3.2.1 dev ethY table 200

变量:

172.16.10.X = KVM's IP
200         = Example value for routing_table, has to be unique for each KVM
ethY        = either eth0 or eth2
1.2.3.4     = Example Gateway on iface ethY
4.3.2.1     = Example Source-IP for each KVM

这将路由来自172.16.10.X指定 iface的所有ethY源地址为4.3.2.1

您还可以做得更复杂,fwmarks但我认为在这种情况下没有必要这样做。

您可以使用以下命令验证路由:ip route get iif brvirt from 172.16.10.X 8.8.8.8。这将显示内核用于从172.16.10.X到 的连接所用的路由和输出设备8.8.8.8

希望它能回答你的问题,

相关内容