Write by lyc at 2020-8-31
iptables的黑白名单机制

1.链的默认 policy

  • 当链的默认策略设置为 ACCEPT 时:如果对应的链中没有配置任何规则,就表示接受所有的报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被接受。
  • 当链的默认策略设置为 DROP 时:如果对应的链中没有配置任何规则,就表示拒绝所有报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被拒绝。

1.1 黑名单机制 policy=ACCEPT

当链的默认策略设置为 ACCEPT 时,按照道理来说,我们在链中配置规则时,对应的动作应该设置为 DROP 或者 REJECT,因为默认策略已经为 ACCEPT 了,如果我们在设置规则时,对应动作仍然为 ACCEPT ,那么所有报文都会被放行了,因为不管报文是否被规则匹配到都会被ACCEPT,所以就失去了访问控制的意义。

当链的默认策略为 ACCEPT 时,链中的规则对应的动作应该为 DROP 或者 REJECT ,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是”黑名单”机制。

1.2 白名单机制 policy=DROP (不推荐)

当链的默认策略为 DROP 时,链中的规则对应的动作应该为 ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是”白名单”机制。

1.3 黑白名单机制的特征:

白名单机制似乎更加安全一些,黑名单机制似乎更加灵活一些:

  • 黑名单机制,我们就要把所有人都当成好人,只拒绝坏人。
  • 白名单机制,我们就要把所有人都当做坏人,只放行好人。

2.policy=DROP 白名单机制存在的问题

问题:

如果我们把默认的 policy 设置为 DROP

  • 在对应的链中没有设置任何规则时,这样使用默认策略为 DROP 是非常不明智的,因为管理员也会把自己拒之门外。
  • 即使对应的链中存在放行规则,当我们不小心使用 iptables -F 清空规则时,放行规则被删除,则所有数据包又都无法进入,这个时候就相当于给管理员挖了个坑

解决:使用 policy=ACCEPT 的白名单机制

我们如果想要使用”白名单”的机制,最好将链的默认策略保持为 ACCEPT,然后将”拒绝所有请求”这条规则放在链的尾部,将”放行规则”放在前面,这样做,既能实现”白名单”机制,又能保证在规则被清空时,管理员还有机会连接到主机,示例如下:

1
2
3
4
5
6
7
8
9
10
11
# chain的默认规则ACCEPT
$ iptables -t filter -P INPUT ACCEPT

# 继续配置需要放行的报文规则
$ iptables -I INPUT -p tcp --dport 22 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 80 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 443 -j ACCEPT
....

# 最后再INPUT链的尾部,配置一条拒绝所有
$ iptables -A INPUT -j REJECT