我目前正在完善 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
这也会阻止
eth1
ping 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_announce
和arp_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
以防止这种情况发生。