我有一台 ubuntu 18 服务器,有 4 个活动 NIC。设置如下:
1. 一个公共 NIC(与本例无关)
2. 一个单 NICeno1IP 为 10.123.10.21
3. 一bond0(eno3 和 eno4 组成的 LACP 绑定),ip 10.123.10.30
2/eno1 和 3/bond0 位于同一个网络/vlan 中,因为 bond0 负责处理应用程序流量,而 eno1 用于管理和支持服务。
当为 eno1 上的某些服务启用防火墙 (ufw) 时,似乎什么都没起作用,经过大量挖掘和 tcpdumping 后,我发现 bond0 正在响应 eno1 的 arp 请求,所有流量都流向 bond0。只要 fw 规则不是特定于 IP 的,一切就都正常,但是当你说允许 IF 上的 IP由于这个 IP 实际上由另一个 IF 提供服务,因此什么也没有发生。
我没有开启 IP 转发或任何桥接
# cat /proc/sys/net/ipv4/ip_forward
0
在交换机端,此 VLAN 仅供内部流量访问/未加标签,bond0 有一个 LACP 组,其余为标准。它也是 ufw/iptables 独立的,因为我关闭了服务,它保持不变(我认为它可能是一些预路由链)。
所以我对发生的事情感到很困惑。我不知道我可以发布什么有用的信息。ip addr + routes 似乎没问题:
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 94:18:82:7b:9a:6c brd ff:ff:ff:ff:ff:ff
inet 10.123.10.21/24 brd 10.123.10.255 scope global eno1
valid_lft forever preferred_lft forever
4: eno3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 9000 qdisc mq master bond0 state UP group default qlen 1000
link/ether 2a:08:3c:37:0d:3a brd ff:ff:ff:ff:ff:ff
5: eno4: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 9000 qdisc mq master bond0 state UP group default qlen 1000
link/ether 2a:08:3c:37:0d:3a brd ff:ff:ff:ff:ff:ff
8: bond0: <BROADCAST,MASTER,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
link/ether 2a:08:3c:37:0d:3a brd ff:ff:ff:ff:ff:ff
inet 10.123.10.30/24 brd 10.123.10.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::2808:3cff:fe37:d3a/64 scope link
valid_lft forever preferred_lft forever
# ip r
default via ... dev eno50 proto static
10.123.10.0/24 dev bond0 proto kernel scope link src 10.123.10.30
10.123.10.0/24 dev eno1 proto kernel scope link src 10.123.10.21
.../28 dev eno50 proto kernel scope link src ....
如果有人知道从这里继续前进,我将不胜感激。
解决方案
事实证明,这是 Linux TCP 堆栈的默认/首选行为。从 @Zoredache 的一条非常有用的评论以及摆弄各种参数可以看出,如果您想将同一子网中每个 NIC 上的流量限制到该 NIC 的 IP,您需要设置基于策略的路由也一样。
以下为一些有用的链接:
https://pontus.ullgren.com/view/Multiple_interfaces_on_the_same_subnet
以及非常深入的 Linux 高级路由
https://lartc.org/lartc.html
我想我会接受这个世界的本来面目并修改我的 ufw 过滤器以适应这种哲学。
法律
答案1
不确定,但我认为你需要对某些操作进行处理arp_filter
,或者也许对其他一些 arp 标志进行处理。
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
arp_filter - 布尔值
...
0 -(默认值)内核可以使用其他接口的地址来响应 arp 请求。这看起来可能不对,但通常是有意义的,因为它增加了成功通信的机会。在 Linux 上,IP 地址归整个主机所有,而不是由特定的接口所有。只有对于负载平衡等更复杂的设置,这种行为才会导致问题。