正文共:1111 字 18 图,预估阅读时间:1 分钟

我们刚刚测完了iptables配置URL黑名单过滤(如何通过iptables配置URL过滤黑名单?),整体效果还算不错。但是,在很多时候,可能我们还会用到白名单,也就是默认拒绝所有请求,仅允许匹配白名单域名的请求通过。

首先,这个动作就比较简单,仅需要将DROP(丢弃)动作调整为ACCEPT(接受)就可以了。但是,我们还是要考虑一下这中间的数据处理逻辑问题。

接着上次的实验结果来看。

iptables配置文件 配置白名单 iptables加白名单_HTTPS

我们现在拒绝了所有访问guotiejun.com相关HTTP页面和HTTPS页面的请求,还拒绝了所有访问sdwan.guotiejun.com相关HTTPS页面的请求。那如果我们单独加一条放通访问https://i.guotiejun.com页面的规则会怎样呢?操作命令如下:

iptables -I FORWARD -p tcp --dport 443 -m string --string i.guotiejun.com --algo bm -j ACCEPT

iptables配置文件 配置白名单 iptables加白名单_数据中心_02

再次测试,发现访问成功。

iptables配置文件 配置白名单 iptables加白名单_数据中心_03

查看规则匹配情况,也可以看到命中了ACCEPT的转发策略。

iptables配置文件 配置白名单 iptables加白名单_iptables配置文件 配置白名单_04

首先判断是不是最长匹配的关系,我们将拒绝https://*guotiejun.com*的策略移动到允许https://i.guotiejun.com策略上面。

iptables配置文件 配置白名单 iptables加白名单_HTTPS_05

然后清空缓存,刷新页面。

iptables配置文件 配置白名单 iptables加白名单_无法访问_06

请求失败,无法访问。再看一下策略匹配情况。

iptables配置文件 配置白名单 iptables加白名单_数据中心_07

可以发现,最上面的策略有报文命中,第二条策略没有被命中。这么看,策略是按照顺序依次匹配的,和匹配长度没有关系。

为了验证,我们先删除之前的策略,再重新配置几条策略。删除策略可以将前面插入命令中的-I参数修改为-D,例如:

iptables -D FORWARD -p tcp --dport 443 -m string --string i.guotiejun.com --algo bm -j ACCEPT
iptables -D FORWARD -p tcp --dport 443 -m string --string guotiejun.com --algo bm -j DROP

iptables配置文件 配置白名单 iptables加白名单_数据中心_08

也可以使用-F命令,能够逐个删除指定表或链中的所有规则;如果没有指定任何链,则表中所有链的规则都将被删除。例如:

iptables -t filter -F FORWARD

iptables配置文件 配置白名单 iptables加白名单_HTTPS_09

然后我们依次配置4条规则,分别是拒绝所有HTTPS、接受https://i.guotiejun.com、拒绝https://*guotiejun.com*、接受https://sdwan.guotiejun.com。

iptables -I FORWARD -p tcp --dport 443 -j DROP
iptables -I FORWARD -p tcp --dport 443 -m string --string i.guotiejun.com --algo bm -j ACCEPT
iptables -I FORWARD -p tcp --dport 443 -m string --string guotiejun.com --algo bm -j DROP
iptables -I FORWARD -p tcp --dport 443 -m string --string sdwan.guotiejun.com --algo bm -j ACCEPT

iptables配置文件 配置白名单 iptables加白名单_数据中心_10

理论上讲,结果应该是只有最上面的https://sdwan.guotiejun.com可以访问,其他所有页面均被拒绝,接下来我们验证一下。

iptables配置文件 配置白名单 iptables加白名单_数据中心_11

但结果是所有的HTTPS页面均无法访问,我们查看一下策略匹配情况。

iptables配置文件 配置白名单 iptables加白名单_iptables配置文件 配置白名单_12

发现只有拒绝所有的策略被命中了,其他策略都没有命中,难道是不带target扩展的匹配方式不一样?我们将拒绝所有的命令也调整一下,所有的域名中肯定要带点号,我们就替换成如下命令:

iptables -I FORWARD -p tcp --dport 443 -m string --string . --algo bm -j DROP

iptables配置文件 配置白名单 iptables加白名单_HTTPS_13

再次测试一下。

iptables配置文件 配置白名单 iptables加白名单_iptables配置文件 配置白名单_14

这就比较神奇了,第一条策略被命中了,但是页面还是无法打开。

iptables配置文件 配置白名单 iptables加白名单_iptables配置文件 配置白名单_15

分析过程,可以看到状态是200,正常,但是无法加载资源。我们把最下面的策略移除试一下。

iptables配置文件 配置白名单 iptables加白名单_数据中心_16

这次就正常了,看来还是最后一条策略匹配的太过分了。那如果我们把默认规则调整为匹配.com呢?

iptables -I FORWARD -p tcp --dport 443 -m string --string .com --algo bm -j DROP

iptables配置文件 配置白名单 iptables加白名单_iptables配置文件 配置白名单_17

现在测试就正常了,规则匹配也是正常的。

iptables配置文件 配置白名单 iptables加白名单_无法访问_18

那不是.com的域名怎么办呢?

还记得我们之前有一篇介绍过域名的文章吗(域名.com是什么意思?95%的人都不知道吧?)?顶级域名主要包括.gov、.edu、.com、.mil、.org以及ISO-3166“国家名称表示代码”标准中标识国家/地区的英文两字母代码后缀。

不过5个顶级域名加上247个国家/地区代码,要添加252个规则,貌似有点多。不知道各位专家有没有什么好的解决方法?