1.需求
过滤指定的域名、网站:如www.baidu.com, www.bilibili.com
2.实现方案
方案1:字符串过滤
iptables -A FOWARD -m string --algo kmp --string “bilibili.com” -j DROP
方案缺点: 需要过滤所有报文,网络速率下降20%~50%
方案2:过滤dns请求报文
通过域名访问网站都需要通过dns解析,即过滤udp.port = 53的报文即可
参考博文:iptables拦截域名_使用iptables封锁对某个域名的DNS查询_文强孙的博客-CSDN博客
iptables -A FOWARD -p udp --dport 53 -m string --string "www.baidu.com" --algo bm -j #请参考博文,和DNS协议
iptables -A FOWARD -p udp --dport 53 -m string --hex-string "|03|www|05|baidu|03|com|" --algo bm -j DROP
iptables -A INPUT -p udp --dport 53 -m string --hex-string "|03|www|05|baidu|03|com|" --algo bm -j DROP
方案缺点: 不能过滤 hosts中用户配置的域名ip
3.注意事项
对于路由器
1.对于dhcp获取动态地址的设备,dns服务是网关(如192.168.1.1, 192.168.2.1),需要过滤INPUT链
2.对于手动设置静态ip的设备, dns服务器223.5.5.5, 8.8.8.8, 需要过滤FORWARD链
3.我的做法是,新建链DNS_FILETER,同时添加到INPUT, FOWARD链中
4.其它问题与思考
1.如何过滤网站的子项,如B站舞蹈区 www.bilibili.com/dance
2.是否有更好的方案,欢迎大家讨论留言。