永久阻止iptables中的域名

假设我想永久封锁Facebook。 要做到这一点,我遵循以下过程:

#host -ta www.facebook.com

示例输出:

www.facebook.com的地址是69.171.224.40

findCIDR

#whois 69.171.224.40 | grep CIDR

示例输出:

CIDR:69.171.224.0/19

为了防止传出访问www.facebook.com

方法1:

#iptables -I FORWARD -p tcp -d 69.171.224.0/19 -j DROP

方法2:

#iptables -I FORWARD -p tcp -d www.facebook.com -j DROP

这两种方法运作良好。 在方法1中 ,IP地址可能被改变,所以它不会永久封锁Facebook。 我不知道方法2是否永久封锁Facebook。 如果上述方法不是永久封锁域名的正确方法,我该怎么办?

使用鱿鱼下面的东西,如果你使用它做同样的事情。

# Mon to Fry time acl blockfacebooktime time MTWHF 8:30-8:30 # Domain name acl blockfacebookdotcom dstdomain .facebook.com 

方法2不会像你想像的那样工作。 你可以从iptables手册中读到这个:

 [!] -s, --source address[/mask] Source specification. Address can be either a network name, a hostname (please note that specifying any name to be resolved with a remote query such as DNS is a really bad idea), a network IP address (with /mask), or a plain IP address. 

当然,目标选项-d 。 这是因为iptables只会执行一次DNS查找,并在规则中使用检索到的IP。 所以,如果在此之后IP被改变,它将不起作用。

更好的方法是使用@neolixbuild议的代理服务器。 但是,您的用户可以尝试绕过您的代理,除非您有严格的规则来防止这种情况发生。

您可以使用自动脚本链来阻止域的所有IP。 即只列出域的所有IP并逐个阻止它们。 如果表中已经存在IP,插入将被跳过。 做如下:

 # nslookup www.facebook.com|grep "^Address: [1-9]"| while read l; do ip=$(sed "s/Address://" <<< "$l"); if [ -z "$(iptables -n -L FORWARD|grep $ip)" ]; then iptables -I FORWARD -j DROP -d $ip; echo Blocked $ip; fi; done 

这个脚本可以从cron调用,例如每分钟/小时,以更新地址。