我想尝试在我的计算机上屏蔽 Facebook。
我开始使用 /etc/hosts,但它不能捕获所有子域名,因此我进行了一些研究,发现这(以及许多类似的解决方案)导致了这样的陈述
/usr/bin/whois -h whois.radb.net '!gAS32934' | head -n -1 | tail -n -1 | /usr/bin/xargs --max-args=1 | /usr/bin/xargs -I {} --max-args=1 iptables -A OUTPUT -d {} -j REJECT
[编辑] 我在这里做的是,我首先使用
whois -h whois.radb.net '!gAS32934'
获取 Facebook 注册的所有 IP 范围,如建议的那样这篇文章。然后我进行一些修剪,以删除结果开头和结尾处不需要的字符。这给了我一个 ip 范围列表,以空格分隔。然后使用 xarg,我将这些 ip 范围分开,并为每个 ip 范围构建一个语句,例如
iptables -A OUTPUT -d {} -j REJECT
其中{}
被实际范围替换。我使用REJECT
,而不是DROP
因为 1. 它要快得多 2. 因为我确实想禁止连接,所以这对我来说似乎是正确的。[/编辑]
现在如果我尝试,ping facebook.com
我会得到
From myname (xxx.xxx.xxx.xxx) icmp_seq=1 Destination Port Unreachable
这正是我所期望的。但如果我使用浏览器 (Firefox) 打开 facebook.com,网站仍然会打开,这不是我所期望的。我尝试重新加载并打开另一个我以前没有尝试过的 Facebook 域名 (facebook.de),以排除浏览器缓存的问题,但这没有帮助。
因为我经常看到DROP
而不是REJECT
我也尝试过,但结果并没有改变。
现在的问题是,如果相应的 IP 被阻止,浏览器为什么可以加载网页?如果 ping 被阻止,浏览器如何通过?很明显,我遗漏了一些东西,但我不知道那是什么。
答案1
获取主机ip:
host -t a facebook.com
查找 CIDR
whois 173.252.120.68 | grep CIDR
并阻止子网
iptables -A OUTPUT -p tcp -d 173.252.120.68/18 -j DROP
并阻止域名:
iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP