我有一个系统托管多个 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
。
希望它能回答你的问题,
響