
我正在使用基於策略的路由設定 KVM 虛擬化主機(192.168.1.0/24 管理網路用於主機相關流量,如更新、ssh 等,192.168.2.0/24 DMZ 網路路由到虛擬機器)
設定看起來像這樣(^^^ 我的意思是像上面一樣來表示樹狀結構)
#external connectivity
eth0 -> vlan110 -> brhost (192.168.1.9)
^^^ -> vlan120 -> brguest (192.168.2.4)
#internal connectivity
brguestA (10.0.1.1) -> tapA0
^^^ -> tapA1
^^^ -> tapA2
brguestB (10.0.2.1) -> tapB0
^^^ -> tapB1
# ... and so on for each VM group subnet
機器 An 在一個「交換器」中,Bn 在第二個「交換器」中,依此類推。來源 IP 在 iptables 層級上對每個網橋進行驗證。
一般來說,一切「正常」都有效,但當我執行一些邊界情況操作時,它仍然按應有的方式運行,但日誌表明這更多是巧合,而不是實際的正常運行。例如:
從虛擬機器(管理網路中的不同主機)連接到 192.168.1.3,該虛擬機器在 iptables 層級(tcp-reset)上被封鎖操作,給出
(iptables reject log) IN=brguestA OUT=brguest SRC=10.0.1.2 DST=192.168.1.3 ... IPv4: martian source 10.0.1.2 from 192.168.1.3 on dev brhost
請注意,OUT
考慮到主機/來賓網路分離的邏輯,介面實際上是正確的,根據它應該做什麼,即使這樣的封包將由主機轉發,它們無論如何都會被丟棄在防火牆上。然而,主機 iptables 無法正確拒絕 tcp-reset,因此此類連線只會掛在虛擬機器上且不會收到重置
從 VM 連接到 192.168.1.9 給出
IPv4: martian source 192.168.1.9 from 10.0.1.2 on dev brguestA
沒有別的。在這些日誌中交換 10.0.1.x 和 192.168.1.x 的位置讓我非常困惑,我真的不明白它們的含義(哪個是 src ip,哪個是 dst ip)。我真的不知道主機正在嘗試做什麼以及為什麼失敗。這是我的ip rule
輸出ip route
:
ip rule
0: from all lookup local
32763: from 10.0.0.0/16 lookup guest
32764: from 192.168.2.0/24 lookup guest
32765: from all iif lo lookup host
32766: from all lookup main
32767: from all lookup default
ip route show table host
default via 192.168.1.1 dev brhost proto static
192.168.1.0/24 dev brhost proto static
ip route show table guest
default via 192.168.2.1 dev brguest proto static
10.0.0.0/24 dev brguestA proto static
10.0.1.0/24 dev brguestB proto static
# ... so on for other networks
ip route show table main
192.168.1.0/24 dev brhost proto static
10.0.0.0/24 dev brguestA proto static
10.0.1.0/24 dev brguestB proto static
# ...
我用於systemd-networkd
網路管理。我想法發生這種情況是因為主機總是嘗試使用brhost
設備作為其設定的OUTPUT
資料包類型進行回應,以便被規則捕獲。然而,情況似乎並非如此,因為連接被正確拒絕,因此它並不總是選擇作為輸出來源。iif
lo
from iif lookup host
192.168.2.4
brhost