影响POSTROUTING链中或之后的出站接口select?

我有一个托pipe多个KVM实例的系统。 所有这些都连接到一个单一的桥梁(比如brvirt ),也连接到eth1 。 此第2层环境位于使用172.16.10.0/24进行地址更改的专用networking上。 系统上还有两个其他接口,我们称之为eth0 (10.10.10.10)和eth2 (10.10.20.20)。

通常情况下,外部连接通过SNAT提供给eth0的地址(主机的默认网关也在这个接口之外)。 对于某些系统 ,我需要在10.10.20.0/24networking上连接到eth2的显式1-1 SNAT规则。

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

有没有办法解决? 我真正想要做的是在POSTROUTING链的结尾根据数据包的源地址做出路由决定……但是有一个很好的理由叫做POSTROUTING

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

您将需要一组规则和路由与模式:

 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 

variables:

 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但我不认为这是需要在这种情况下。

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

希望它能回答你的问题,

f0o