如何完全阻止像 Facebook 這樣的網站?
我正在嘗試阻止從我的家庭系統(Ubuntu)訪問 Facebook。我可以將 facebook.com 添加到
/etc/hosts
,但這只會阻止訪問 facebook.com。還有很多其他方式我可以使用 facebook,例如 mbasic.facebook.com、m.facebook.com、touch.facebook.com、IP 地址等等。我想我可以使用瀏覽器擴展來阻止它,但我更喜歡系統範圍的塊。我查看了這個試圖使用 iptables 解決這個問題的問題,但沒有成功 - 執行此命令後我仍然可以訪問 facebook.com(我從 whois 173.252.120.6 | grep CID 獲得範圍):
sudo iptables -A OUTPUT -p tcp --destination-port 80 -d 173.252.64.0/18 -j REJECT
所以我的問題本質上是:我如何阻止一個網站,比如 facebook.com,以各種方式(不一定是 100% 萬無一失),它不能在系統上以任何方式訪問?
這取決於您希望該塊有多萬無一失,以及您對系統的控製程度。由於您談論您的“家庭系統”並修改 /etc/hosts,我假設您具有合法的 root 訪問權限,並且不需要完全防彈。
阻止對整個域的訪問的最簡單方法是設置本地 DNS“遞歸解析器”並專門配置這些域。基本上,您設置了一個 DNS 伺服器(這當然可以在同一台主機上執行),將您的本地系統指向它,並告訴該 DNS 伺服器返回精心設計的響應,例如
facebook.com
域(或zone,因為它是已知的)在 DNS 術語中)。對於那些,您沒有設置地址記錄,這將導致任何嘗試解析 facebook.com 下的任何主機名以返回“找不到主機”。您可以設置這樣的 DNS 伺服器來自行完成所有名稱解析,或者將它不知道的任何內容(通過其配置)轉發到其他 DNS 伺服器;後一種配置通常被稱為“轉發”解析器。
這適用於特定域(www.facebook.com、m.facebook.com、touch.facebook.com、whatever.somewhere.facebook.com)下的所有名稱訪問,但不適用於 DNS 中不相關的名稱(www.facebook.com)。如果要轉到 Facebook,facebook.example.com 仍然可以使用)。它也不會阻止通過 IP 地址訪問。但是,它確實使首先找到 IP 地址變得不那麼容易(
host
或者nslookup
同樣會說“未找到”)。如果這個想法只是為了避免意外瀏覽到特定的已知域,那麼這可能就足夠了。如果這個想法是完全阻止訪問,那麼它是行不通的。
**要實際設置它,**您首先需要決定是否需要一個本地的、完全配置的解析器,或者是否需要一個轉發解析器。兩者都有優點和缺點,但現在,我將向您展示如何配置轉發解析器,因為這更有可能滿足您的案例需求。
有許多不同的 DNS 伺服器包可用,但也許 *nix 世界中最知名的(當然是最知名的之一)是 BIND,目前是第 9 版。你沒有說你正在執行哪個確切版本的 Ubuntu ,所以我會測試一下你正在執行 14.04/trusty,這是目前的 Ubuntu LTS 版本。其他不應有顯著差異。
要安裝 BIND,請打開終端視窗並發出命令(提示時需要提供密碼)
sudo apt-get update sudo apt-get install -u bind9
查看第二條命令提供的要安裝的軟體包列表,確保它看起來合理,然後確認安裝。
軟體本身現在已安裝,需要進行配置。主要配置文件是/etc/bind/named.conf;在編輯器中打開它(我
gedit
在這裡使用,但任何文本編輯器都可以):sudo gedit /etc/bind/named.conf
記下塊中
directory
設置的值。options
然後,將整個配置文件替換為以下內容:options { directory "** PAST VALUE GOES IN HERE **"; forwarders { ** YOUR UPSTREAM DNS SERVER IPS HERE, SEE BELOW ** }; forward only; allow-transfer { "none"; }; allow-query { "localhost"; }; allow-update { "none"; }; };
對於
directory
,使用過去的值(所以這可能是directory "/etc/bind";
但不要相信我的話)。因為
forwarders { }
格式稍微複雜一些。在這裡,*按 IP 地址列出您的 ISP(或其他上游)DNS 伺服器,*每個 IP 地址後跟一個分號。您可能可以在 /etc/resolv.conf 中找到這些。請注意,如果您有一個 NAT 路由器或類似的路由器,它很可能也提供 DNS 轉發服務,如果是這樣,您想在此處使用路由器的 IP 地址。例如,如果您的上游 DNS 伺服器是 192.168.100.1 和 192.168.200.1,那麼這將forwarders { 192.168.100.1; 192.168.200.1; };
包括括號內外的最後一個分號(它們有不同的用途,您現在不需要完全理解;只需相信我,他們都需要在那裡)。**編輯任何與 BIND 相關的配置文件後,**執行命令sudo rndc reload
觸發重新載入配置。如果您的防火牆配置嚴格,則需要允許本地流量通過 TCP和UDP、本地埠 53 訪問您的系統。例如:
sudo iptables -A INPUT -i lo -p udp --dport 53 -j ACCEPT sudo iptables -A INPUT -i lo -p tcp --dport 53 -j ACCEPT
現在確保將系統的名稱解析器功能指向此 DNS 伺服器。這可能通過直接編輯 /etc/resolv.conf 以將
nameserver
指令替換為指向 127.0.0.1 的單個指令來實現,但您可能需要單獨詢問,因為我不太熟悉 Ubuntu 的方式做事。他們可能有一個 GUI,並且 /etc/resolv.conf 可能會自動重寫,例如在啟動時。這為您提供了一個非常基本的轉發 DNS 解析器設置。**要阻止對特定域的訪問,**這在 DNS 術語中意味著您為這些名稱授權地服務於一個空白區域,請將
zone { }
節添加到您的 BIND 配置文件中,指向db.empty
為方便起見bind9
包提供的文件。例如,要阻止facebook.com
(包括裸名)下的所有內容,請添加:zone "facebook.com" { type master; file "db.empty"; };
再次執行
sudo rndc reload
以載入它。您現在應該無法訪問 facebook.com 下的任何主機名。**如果您搞砸了,**那麼只需重置您的網路 DNS 設置以使用您的上游 DNS 伺服器,或者撤消對 /etc/bind/named.conf 的最新更改並重新載入配置。您可以
//
在一行的任意位置(引號內除外)將該行的其餘部分變成註釋;這是一個很好的方法,例如,暫時退出更改。玩得開心!