我有一个托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.X
到8.8.8.8
的连接的路由和输出设备。
希望它能回答你的问题,
f0o