我们想要阻止 IP 范围,但同时只允许该范围内的一个 IP。通过搜索我们发现了这一点:
$ sudo iptables -A INPUT -s <ALLOWED_IP> -j ACCEPT
$ sudo iptables -A OUTPUT -d <ALLOWED_IP> -j ACCEPT
$ sudo iptables -I INPUT -m iprange --src-range <NOT_ALLOWED_RANGE> -j DROP
但它不起作用。我们也尝试颠倒顺序,但仍然不起作用:
$ sudo iptables -I INPUT -m iprange --src-range <NOT_ALLOWED_RANGE> -j DROP
$ sudo iptables -A INPUT -s <ALLOWED_IP> -j ACCEPT
$ sudo iptables -A OUTPUT -d <ALLOWED_IP> -j ACCEPT
我们可能做错了什么?
答案1
因此,正如评论中提到的,顺序很重要!
为了安全起见,netfilter 鼓励更改删除链iptables
的策略INPUT
,这样您就只允许您想要的 IP 地址或范围。
-I
要回答您的问题,您首先需要使用指示您要将规则放在顶部的标志来允许所需的 IP 地址。
iptables -I INPUT -s SOURCE_IP -j ACCEPT
iptables -A INPUT -m iprange --src-range SRC_RANGE/CIDR -j DROP
在iptables
第一条规则中适用,这意味着顶部的规则将始终获胜。
DENY (this rule wins)
|
ALLOW
答案2
-I
一般来说,对于这种情况没有真正需要使用选项。按以下顺序制定规则:
-A INPUT -s ALLOWED_IP -j ACCEPT
-A INPUT -s FORBIDDEN_IP_RANGE -j DROP
仅允许来自 中的连接,ALLOWED_IP
同时拒绝来自 中其他地址的连接FORBIDDEN_IP_RANGE
。
问题在于主题启动器-I
在错误的位置使用了选项 - 对于DROP
操作,因此在这两种情况下DROP
操作都被放置在顶部。
内容如下man iptables
:
-I, --insert chain [rulenum] 规则规范
在选定的链中插入一个或多个规则作为给定的规则编号。因此,如果规则编号为 1,则将一条或多条规则插入到链的头部。如果未指定规则编号,这也是默认值。
因此,-I
不使用规则编号就默认使用规则编号 1。您应该小心这种使用,因为它可能会破坏更复杂的防火墙配置的逻辑。