多个互联网连接,错误的 NIC 端口上的传入数据包(入站路由问题?)

多个互联网连接,错误的 NIC 端口上的传入数据包(入站路由问题?)

我从一开始就要说声抱歉,因为我真的不知道该问什么。也许在某个地方有答案,但我谷歌搜索后没有找到任何答案。

这是我的设置的草图(命名简单),以便我们有一个共同点 在此处输入图片描述

ens1 设置为默认网关,其余未设置为。流量流出情况与我预期的一样。

这是一台新的 cent os 8 vmware esxi VM,带有一个 PCIx Intel 4 端口网卡和一个 PCI Intel 1 端口网卡(这是内部 LAN,没有图示,实际上应该无关紧要,因为它在物理上位于另一个交换机中)。以防万一。

现在我开始从头开始设置 nftables(只是无法通过我需要的自定义 NAT 通过防火墙完成,可能是因为我刚刚发现的问题;到达那里)

规则如下(基本上就是这样,我只是重新命名了 IF)

table ip nat {
    chain PREROUTING {
            type nat hook prerouting priority 0; policy accept;
            iif "ens4" goto PREROUTING_ENS4
    }

    chain PREROUTING_ENS4 {
            tcp dport { http, https } log prefix "ENS4_dnat"
            tcp dport { http, https } dnat to 192.168.1.4
    }
}

table inet filter {
    chain INPUT {
            type filter hook input priority 0; policy drop;
            iif "lo" accept
            ct state established,related accept
            ct status dnat accept
            iifname "ens5" goto INPUT_LOCAL
            ct state invalid log prefix "INPUT_STATE_INVALID_DROP: "
            ct state invalid drop
            log prefix "INPUT_FINAL_REJECT: "
            reject with icmpx type admin-prohibited
    }
}

因此,我希望/期望的是,当我在 IP ABFH 上从互联网发出 http 请求时,它将经过 IP4、ENS4,并将被 DNAT 到我的内部服务器 IP 192.168.1.4,然而,我实际得到的是

[118553.454575] INPUT_FINAL_REJECT: IN=ens1 OUT= MAC=00:15:17:7f:16:0a:cc:e1:7f:74:28:20:08:00 SRC=W.X.Y.Z DST=A.B.F.H LEN=52 TOS=0x00 PREC=0x00 TTL=115 ID=7927 DF PROTO=TCP SPT=63873 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0

因此,它是正确的 IP,但它进入的是错误的 NIC 端口,即 1 而不是 4。

dnat 日志未被触发。

那么,是什么原因导致的这种情况以及我可以尝试如何解决它?

最终,我将以相同的方式将 IP 2 和 3 DNAT 到其他几个虚拟机,并让我的 LAN 通过 IP1 出去。

我以前的网络只有 1 个外部静态 IP,使用的是 cent os 6,所有防火墙都是通过 iptables 手动设置的。多年来一直运行良好。

由于我刚刚搬家、更换了 ISP 并有机会获得这 4 个 IP,所以我认为我应该设置一个新的网关、新的 centos 和新的防火墙。

太多新东西(包括 4 端口网卡和专用的 5 端口交换机),所以我不知道是什么原因导致的(此外,我不是网络专家,但我确实自己设置了一些东西,主要是在谷歌的帮助下,偶尔也会有这种问题:))

另外,以防万一,我的 ISP 最初只给了我 ens1 上的 1 个 IP,大约 3-4 天后(在我验证了互联网正常运行等之后,我得到了其余的 IP)

先感谢您。

答案1

这个问题分为两部分:

  • ARP 流量。这是由于您在同一个以太网 LAN(在同一个“第 2 层广播域”)上有多个接口,同时使用也在同一 (IP) LAN 上的 IP 地址时导致的。影响传入流量。

    多个接口(或非预期接口)将发送针对其他接口上设置的 IP 的 ARP 回复。最后,根据时间、缓存逐出等情况,通常一个接口将处理所有传入流量,而不是每个接口处理自己的流量。这可能会随时间随机变化(缓存、计时器……),这是由于弱宿主模型在 Linux 中选择:认为 IP 属于主机而不是接口,并使用任何接口回答在任何接口上看到的 ARP 请求。

  • 主路由表上有多个到同一 LAN 的路由/接口,但当ip route源 IP 未设置时(例如:初始传出连接),仅使用“等价”中的一个接口(第一个显示为 )。如果关闭并打开此接口,路由的顺序甚至可能会改变,从而切换此默认接口。影响传出流量。

现在你可以同时解决这两个问题。根据流量情况,传入和传出接口甚至可能不匹配(甚至可能因为反向路径过滤而被阻止)。

解决这个问题可能有多种解决方案。但为了同时解决这两个问题,我认为使用策略路由和arp_filter是最好的一个:

1 - 允许您拥有同一子网上的多个网络接口,并有每个接口的 ARP根据内核是否从 ARP 的 IP 路由数据包退出该界面(因此你必须使用基于源的路由才能使其工作)。换句话说,它允许控制哪些卡(通常是 1 个)将响应 arp 请求。

因为它清楚地定义了会发生什么。其他解决方案是使用arp_announcearp_ignore但我不确定它们是否适用于您的情况,因为您还想将接口和 IP 绑定在一起。我将把它集成到您​​的系统配置中,由您自己决定。

因此,您必须绑定接口、MAC(ARP 流量)和 IP。几乎所有东西都是每个接口对称的。

将 MAC 处理与路由绑定(警告:这会中断连接,直到路由规则发挥作用):

sysctl -w net.ipv4.conf.ens1.arp_filter=1
sysctl -w net.ipv4.conf.ens2.arp_filter=1
sysctl -w net.ipv4.conf.ens3.arp_filter=1
sysctl -w net.ipv4.conf.ens4.arp_filter=1

添加规则(按固定优先级,即使不需要)以将 IP 绑定到路由表(将具有接口引用):

ip rule add pref 10001 from a.b.c.d lookup 1001
ip rule add pref 10002 from a.b.c.e lookup 1002
ip rule add pref 10003 from a.b.f.g lookup 1003
ip rule add pref 10004 from a.b.f.h lookup 1004

添加路由(从主表复制而来,但每个表只有一个接口,每个路由都有自己的默认路由,也将使用该接口)。a.b.l.0/21是将路由绑定到接口的 LAN 地址:

ip route add table 1001 a.b.l.0/21 dev ens1
ip route add table 1002 a.b.l.0/21 dev ens2
ip route add table 1003 a.b.l.0/21 dev ens3
ip route add table 1004 a.b.l.0/21 dev ens4
ip route add table 1001 default via a.b.m.n dev ens1
ip route add table 1002 default via a.b.m.n dev ens2
ip route add table 1003 default via a.b.m.n dev ens3
ip route add table 1004 default via a.b.m.n dev ens4

刷新 ARP 表中学习到的地址(可能为乱码):

ip neighbour flush dev ens1
ip neighbour flush dev ens2
ip neighbour flush dev ens3
ip neighbour flush dev ens4

通过运行重复地址检测 ARP 请求(询问谁有自己的 IP 并期望没有答案通过)强制 LAN 上的其他设备(如果不仅仅是 ISP 路由器)更新自己的乱码 ARP 表,这将充当免费 ARP 公告(这就是在接管 IP 时 pacemaker/corosync 集群节点所做的事情)。需要arping来自包的命令iputils。这些命令每个需要 5 秒,因此最好并行运行它们。

arping -c 5 -D -I ens1 -s a.b.c.d a.b.c.d &
arping -c 5 -D -I ens2 -s a.b.c.e a.b.c.e &
arping -c 5 -D -I ens3 -s a.b.f.g a.b.f.g &
arping -c 5 -D -I ens4 -s a.b.f.h a.b.f.h &
wait

现在一切都应该按预期运行:当 IP 已设置时,系统将使用特定路由表。当 IP 尚未设置时(例如初始传出 TCP 连接),主表仍将用于确定要使用的主 IP(我猜是 ens1 的 IP)。设置后,ARP 将符合特定路由表。由于它始终是每个步骤中使用的预期接口,因此它与严格反向路径过滤

确保主表不会随机指定默认使用哪个 IP:一个接口(ens1?)可能应该被赋予比其他接口更低的度量。否则,某些路由更改(例如:将接口设置为关闭然后打开)可能会重新排序路由并更改默认行为。默认路由应该位于此接口上。

此外。当关闭接口时,其自定义路由表(以及主路由表的相应部分)将被刷新。当设置接口时,不会在自定义表中添加任何条目。内核至少会在主表中添加 LAN 路由(除非使用noprefixroute),自定义表中不会这样做,而且无论如何也必须添加默认路由。您必须在配置中确保在重新设置接口时将表的条目放回原位:配置应针对每个接口,而不仅仅是在启动时运行一次。

相关内容