Debian
Sysctl 參數 accept_local 和 rp_filter 在雙網卡機器上不起作用
root@host-3:~# uname -a Linux host-3 4.4.35-1-pve #1 SMP Fri Dec 9 11:09:55 CET 2016 x86_64 GNU/Linux root@host-3:~# cat /etc/debian_version 8.9 root@host-3:~# ifconfig eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx inet addr:192.168.1.2 Bcast:192.168.1.2.255 Mask:255.255.255.0 inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3313 errors:0 dropped:0 overruns:0 frame:0 TX packets:348 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:224843 (219.5 KiB) TX bytes:29794 (29.0 KiB) eth1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0 inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3028 errors:0 dropped:0 overruns:0 frame:0 TX packets:15 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:196588 (191.9 KiB) TX bytes:1330 (1.2 KiB)
在下面的設置中,在 host-3 上,流量不會傳到線路上。堆棧只是將它發送回接收應用程序。
兩個介面上的數據包擷取表明沒有數據包實際到達任何網路介面。
為什麼是這樣?
2 台主機,1 台 NIC / 主機:這工作(與下面的主機 3 進行比較)
--------------------- ------------------------------------------- --------------------- | Linux Host host-1 | | Device Under Test (router) | | Linux Host host-2 | | 192.168.1.2/24|----------|192.168.1.1/24 192.168.2.1/24|----------|192.168.2.2/24 | --------------------- ------------------------------------------- ---------------------
1 台帶有 2 個 NIC 的主機:這不起作用
--------------------- | Linux Host host-3 | | 192.168.1.2/24|--------| | eth0| | | | | | | | | eth1| | | 192.168.2.2/24|---| | --------------------- | | | | | | | | | | ------------------------------------------- | | | Device Under Test (router) | | |---------|192.168.1.1/24 192.168.2.1/24|---------| | ------------------------------------------- | | | | | | | | | |------------------------------------------------------------------|
路由表,包括靜態路由,用於 host-3
Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.1.2 192.168.2.1 255.255.255.255 UGH 0 0 0 eth1 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.2.2 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0
host-3 的相關核心參數
root@host-3:~# sysctl -a | grep "\.rp_filter" net.ipv4.conf.eth0.rp_filter = 0 net.ipv4.conf.eth1.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.lo.rp_filter = 0 root@host-3:~# sysctl -a | grep "accept_local" net.ipv4.conf.eth0.accept_local = 1 net.ipv4.conf.eth1.accept_local = 1 net.ipv4.conf.all.accept_local = 1 net.ipv4.conf.default.accept_local = 1 net.ipv4.conf.lo.accept_local = 0
更新#1
針對查詢流量類型以及是否涉及虛擬機的評論…
流量只是ping。我還使用 UDP 單播進行了測試,發現行為沒有差異。
是的,這些是虛擬機。實際上,更準確地說,它們是在 Proxmox 4.4 下執行的 LXC Linux 容器。
此外,自從我的原始文章以來,我發現了另一件事。
ping 時,如果我使用 -I 選項指定出口(即源)IP 地址,我看不到行為變化。但是,如果我使用 ping 的 -I 選項來指定 egress interface,事情似乎可以工作,但需要注意一點。我說它們可以工作,因為 ping 命令以大約 40 毫秒的往返時間得到回复。如果數據包實際上是傳出而不是被堆棧短路(在這種情況下,往返時間是亞毫秒),這就是我所期望的。然而,這裡有一個警告……
出口和入口介面上的數據包擷取僅顯示回應要求。擷取不顯示迴聲回复。我不確定這怎麼可能……
# ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default # ip route list table local [...] broadcast 192.168.0.0 dev eth0 proto kernel scope link src 192.168.0.100 local 192.168.0.100 dev eth0 proto kernel scope host src 192.168.0.100 broadcast 192.168.0.255 dev eth0 proto kernel scope link src 192.168.0.100
您不能修改表格
local
;核心維護它。main
這是具有最高優先級的表,因此您在其他表(即)中定義的內容無關緊要。這些條目從不匹配。