阻止 ping 到不同子网中的接口

阻止 ping 到不同子网中的接口

我目前正在完善 DD-WRT 路由器上的防火墙规则。具体来说,我的问题是关于这条规则的:

iptables -I INPUT -i eth1.10 -d ! 192.168.10.0/28 -j DROP

我想知道是否可以以某种方式在接口级别强制执行规则,以便接口仅响应直接发送到 eth1.10 (192.168.10.1/28) 接口的 ICMP 请求。如果没有这条规则,eth1 (192.168.1.1/24) 也可以通过 eth1.10 进行 ping 操作,这在我看来是一个安全缺陷。编辑澄清:路由器在这两个子网之间路由。我将路由器背面的四个端口分开,这样我就可以将服务器插入路由器的端口 4。然后我将端口 4 与 eth1.10 关联,eth1 连接到其他 3 个端口,这些端口供 LAN 使用。我想将网络192.168.1.0与192.168.10.0完全隔离...

# SwitchPort Setup script
swconfig dev switch0 set enable_vlan 1 
swconfig dev switch0 vlan 1 set ports "2 3 4 6"
swconfig dev switch0 vlan 10 set ports "1 6t" 
swconfig dev switch0 set apply 
vconfig add eth1 10
ifconfig eth1.10 192.168.10.1 netmask 255.255.255.240

答案1

(我承认我不理解所有开关设置,但这与问题无关。)

您当前的规则,在filter/INPUT中阻止来自eth1.10的数据包到达路由器的拥有192.168.10.0/28以外的IP,因此确实达到了不允许来自eth1.10的IP访问192.168.1.1的预期效果。

  • 为什么需要它?

    这是因为具有多个接口的 Linux 系统会将其 IP 视为一个池,并且可以在其任何接口上使用其任何 IP。这里不涉及路由(转发)。我知道处理这个问题的唯一方法是iptables' 过滤器/输入。

  • 如何避免必须在此规则中指定 IP 以保持其通用性?

    有一个具体的iptables 扩展match 可以做到这一点,但它必须在逻辑粘合的附加链中使用两次:addrtype有或没有它的--limit-iface-in选项。因此,您可以替换您的规则并拥有仅取决于接口名称的规则:

    iptables -N dropotherlocalips
    iptables -A dropotherlocalips -i eth1.10 -m addrtype --dst-type LOCAL --limit-iface-in -j RETURN
    iptables -A dropotherlocalips -i eth1.10 -m addrtype --dst-type LOCAL -j DROP
    iptables -I INPUT -j dropotherlocalips
    

    第一条规则仅匹配同一接口上的本地 IP 并返回(即不执行任何操作)。第二条规则丢弃任何本地 IP,因此最终丢弃不在同一接口上的本地 IP。

    请注意,如果您希望此规则更通用并在任何方面都有效,您可以-i eth1.10在 dropotherlocalips 中删除:

    iptables -A dropotherlocalips -m addrtype --dst-type LOCAL --limit-iface-in -j RETURN
    iptables -A dropotherlocalips -m addrtype --dst-type LOCAL -j DROP
    

    这也会阻止eth1ping 192.168.10.1。

我想将网络192.168.1.0与192.168.10.0完全隔离...

您必须(但您已经这样做了,不是吗?)还为此添加过滤器/转发规则,例如:

iptables -I FORWARD -i eth1.10 -d 192.168.1.0/24 -j DROP

我在这里看不到如何避免在规则中声明 LAN,除非 eth1.10 被禁止任何目的地,但根本不需要路由。或者 FORWARD 可以有 DROP 策略,并且只允许在规则中明确写入的路由/转发。

根据这些规则,192.168.1.0/24 在 eth1.10 的 IP 级别上完全不可用,包括 192.168.1.1。


额外,挑剔一下: ARP仍然可以让eth1.10的局域网知道192.168.1.1的存在。

上述规则不会阻止 eth1.10 后面的主机知道(例如通过暴力扫描)通过 ARP 方式发现 192.168.1.1 的存在,且未被过滤iptables。这仍然是因为 Linux 即使在应答 ARP 时也将其所有 IP 视为一个池(在默认arp_filter设置,但另见下文arp_announcearp_ignore)。所以使用琶音从 192.168.10.0/28 的 Linux 系统(到达路由器的 eth1.10),接口 eno1(请调整名称):

$ ping -c2 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.

--- 192.168.1.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 10ms

$ ip neighbour
192.168.10.1 dev eno1 lladdr b6:f2:aa:82:21:d4 REACHABLE
$ arping -c2 -I eno1 192.168.1.1
ARPING 192.168.1.1 from 192.168.10.10 eno1
Unicast reply from 192.168.1.1 [B6:F2:AA:82:21:D4]  0.552ms
Unicast reply from 192.168.1.1 [B6:F2:AA:82:21:D4]  0.552ms
Sent 2 probes (1 broadcast(s))
$ 

由于 MAC 地址相同,这意味着 192.168.1.1 位于 192.168.10.1 的主机:路由器上。

避免这种情况的最小设置(当不需要复杂的路由配置时arp_filter)将在路由器上进行:

echo 1 > /proc/sys/net/ipv4/conf/eth1.10/arp_ignore=1

(或者sysctl -w net.ipv4.conf.eth1/10.arp_ignore=1

那是来自arp_ignore:

1 - 仅当目标 IP 地址是传入接口上配置的本地地址时才回复

你也可以使用arp_filter=1(只有当您已经使用和附加表时才值得ip rule,因为您可能无论如何都必须这样做)或者甚至使用过滤 ARP 请求arptables以防止这种情况发生。

相关内容