Debian

Sysctl 參數 accept_local 和 rp_filter 在雙網卡機器上不起作用

  • March 1, 2018
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這是具有最高優先級的表,因此您在其他表(即)中定義的內容無關緊要。這些條目從不匹配。

引用自:https://unix.stackexchange.com/questions/387637