我有一個託管多個 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
。
希望它能回答你的問題,
fo