我对 IPTABLES 还很陌生,但我已经编写了一个脚本,可以从输入文件 blacklist.txt 中阻止多个 Amazon EC2 的 IP 范围:
...
54.66.0.0/16
54.67.0.0/16
...
我还有一个单独的 whilelist.txt 文件,其中包含友好 IP 地址(这里是任意的),包括:
54.66.1.1
54.67.1.2
下面是我正在运行的 bash 脚本的简化版本,用于阻止黑名单 IP 并允许白名单 IP:
#!/bin/sh
TABLENAME="EC2LIST"
iptables -N $TABLENAME
# Block These
while read ip; do
# Create the drop rule
iptables -t filter -A $TABLENAME -s $ip -j DROP
done <~/ec2block/blacklist.txt # The blacklist location
# Delete matching rules from blacklist
while read ip; do
# Remove any matching explicit whitelisted IPs from Blacklist
# This will fail if explicit record doesn't exit. Ommitted check for existence.
iptables -t -D $TABLENAME -s $ip -j DROP
# Accept this incoming IP
iptables -A INPUT -i eth0 -s $ip -j ACCEPT
done <~/ec2block/whitelist.txt # Edit this location if needed
# Drop incoming packets from EC2LIST
iptables -I INPUT -j $TABLENAME
我是否可以保证具有 ACCEPT 规则且位于 DROP 规则阻止范围内的 IP 将被接受?
有没有更好、更可接受的方法来做到这一点?我一直在寻找 ACCEPT 规则与 DROP 规则的优先级,但找不到太多。
一台服务器是 CentOS,另一台在 Gentoo 上实现。我不记得哪个是哪个,但必须使用:
service iptables save
以下是输出的示例
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
EC2LIST all -- anywhere anywhere
ACCEPT all -- ec2-54-66-1-1.ap-southeast-2.compute.amazonaws.com anywhere
ACCEPT all -- ec2-54-67-1-2.ap-southeast-2.compute.amazonaws.com anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain EC2LIST (1 references)
target prot opt source destination
DROP all -- ec2-54-66-0-0.ap-southeast-2.compute.amazonaws.com/16 anywhere
DROP all -- ec2-54-67-0-0.us-west-1.compute.amazonaws.com/16 anywhere
答案1
Iptables 的规则是按顺序处理的。当一条规则匹配时,处理停止。如果您使用嵌套链(即 EC2LIST),如果嵌套链中没有匹配项,则嵌套链“返回调用链”。
您可以(也应该)利用这一点。如果您有一个符合 REJECTED 规则的 IP,并且想要将其列入白名单,请在 REJECT/DROP 之前为其添加 ACCEPT 规则。
答案2
感谢 jurez,我找到了答案。如果我要添加接受和降低规则添加到同一列表,在 DROP 规则之前添加的 ACCEPT 规则将优先。
操作顺序可能不完全正确或不符合惯例,但如果我试图允许123.123.123.123但阻止其余的123.123.0.0到123.123.255.255:例如。
iptables -A EC2BLOCK -i eth0 -s 123.123.123.123 -j ACCEPT
iptables -t filter -A EC2BLOCK -s 123.123.0.0/16 -j DROP
iptables -I INPUT -j EC2BLOCK