电脑A有两个物理接口:
- eno0 → 192.168.1.1/24
- eno1 ⇒ 192.168.2.1/24
计算机B只有一个物理接口:
- eno0 ⇒ 192.168.2.2/16(注意异常小的子网掩码——我们会说它是由恶意用户设置的)
计算机A的eno1通过哑交换机连接到计算机B的eno0。
当我ping 192.168.1.1
在计算机B上运行时,它可以工作!怎么可能?
/proc/sys/net/ipv4/ip_forward
在两台计算机上都是 0。
两台计算机上的 iptables FORWARD 策略都是 DROP,并且 FORWARD 表中没有规则。
这两台计算机未连接到任何其他网络。
两台计算机都运行 6.1.9-arch1-1 内核。
更重要的是:如何配置计算机 A 来防止这种行为?我不希望 192.168.2.0/24 网络上的计算机能够访问托管在 192.168.1.1 地址上的服务。
答案1
设计 TCP/IP 堆栈有两种基本方法,称为强大的主机模型和一个弱宿主模型。使用弱主机模型更容易获得高性能,因此 Linux 默认采用弱主机模型。
从历史上看,这些术语也被称为强端系统(ES)模型和弱端系统模型, 分别。
您正在寻找的行为(= 系统仅在分配给数据包进入的接口的特定 IP 地址上应答传入数据包)特定于强大的主机模型,如果你想要的话,需要一些配置。
如果你用关键词“强主模式”搜索本站,您会发现许多问题以及有关如何设置的详细答案。
答案2
由于计算机 B 认为该 IP 地址位于给定子网的链路上,因此它会在该接口上发送 ARP 请求。
默认情况下,Linux 应答系统上配置的所有 IP 地址的 ARP 请求,无论接口如何。
如果这不是您想要的,您需要配置net.ipv4.conf.all.arp_filter
或net.ipv4.conf.eno1.arp_filter
sysctl 条目(记录在内核文档)。将其设置为 1 将限制 arp 到接口上的地址。
如果您假设计算机 B 具有 192.168.1.1 的静态 ARP 条目(或具有正确的子网并以 192.168.2.1 作为网关),则前面的条目将无济于事。我认为您需要设置防火墙来阻止这些请求。由于 IP 地址归计算机 A 所有,因此计算机 A 认为这些数据包是 INPUT 而不是 FORWARD,无论它们来自哪个接口。
答案3
您所描述的内容不依赖于 iptables、转发、...
网络掩码、网关和路由是这里的问题。正如你所说,计算机有 16 位网络掩码。这意味着网络 192.168.XX 上的所有计算机都在他的“本地”网络上。对网络上的计算机执行 Ping 操作不会通过网关,而是直接到达该网络中的适配器。根据您的网络掩码 192.168.1.1 位于 192.168.2.1 适配器网络上,因此它将 ping 直接发送到该适配器。
如果您在一个适配器上收到流量并且必须将其转发到另一个(或相同的)适配器上,则转发很重要,但在您的情况下没有转发。