Sysctl 参数accept_local 和rp_filter 在双网卡机器上不起作用

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 个网卡/主机:这可以工作(与下面的主机 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 个网卡:这不起作用

---------------------
| 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 选项指定出口界面,事情似乎有效,但有一个警告。我说它们有效是因为 ping 命令收到回复的往返时间约为 40 毫秒。如果数据包实际上是传出而不是被堆栈短路(在这种情况下,往返时间为亚毫秒),这就是我所期望的。然而,这里有一个警告......

出口和入口接口上的数据包捕获显示仅有的回显请求。捕获的显示回显回复。我不知道怎么会这样......

答案1

# 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)。这些条目永远不会匹配。

答案2

流量永远不会离开主机 3 的线路,与两个不同的图片子网通信,因为host3 具有同时属于这两个子网的 NIC,因此它是同时属于这两个子网的多宿主计算机。 (或者它不会从路由器中流出,因此如果您强制输出接口,您将不会收到回复)

因此,实际上发生的情况是,任何具有 192.168.1.2/24 和 192.168.2.2/24 目的地的流量都是到 host3 的内部流量,并且将进入服务器的环回,因此您在网络上看不到任何内容。

我还建议只使用一个默认网关,而不是两个。发生的情况是非主机 3 内部网络的流量,将被发送到路由器/默认网关;上述网络块的情况并非如此。

我建议稍微不同的设置:

---------------------
| Linux Host host-3 |
|     192.168.1.2/24|--------|
|               eth0|        |
|                   |        |
|                   |        |
|               eth1|        |
|     192.168.2.2/24|---|    |
---------------------   |    |
                        |    |
                        |    |
                        |    |
                        |    |         -------------------------------------------
                        |    |         |        Device Under Test (router)       |
                        |    |---------|192.168.3.2/24             192.168.3.1/24|---------|
                        |              -------------------------------------------         |
                        |                                                                  |
                        |                                                                  |
                        |                                                                  |
                        |                                                                  |
                        |------------------------------------------------------------------|

要查看线路上的流量,您必须将流量从 host3 发送到 192.168.3.0/24 网络。

相关内容