Temat: [howto] Blokowanie facebooka
Poradnik jest bezpośrednią interpretacją tekstu shibby: https://openlinksys.info/forum/viewthre … d_id=19569
IPset (http://ipset.netfilter.org/) jest narzędziem pozwalającym używać tablic danych w regułach iptables. Brzmi to może skomplikowanie ale zastosowanie jest proste: np. mamy 500 adresów które chcemy zablokować w iptables. Możemy utworzyć 500 odpowiednich łańcuchów dla FORWARD i będzie to działać, ale bardzo spowolni działanie firewalla bo każdy z tych łańcuchów będzie musiał być przeszukany. Przy pomocy ipset możemy utworzyć tablicę 500 adresów w przestrzeni kernela a następnie doczepić do tego tylko jedną regułę iptables. Korzyści są namacalne w postaci szybkości działania.
Dane do ipset można podać "ręcznie", ale można także kazać dnsmasq aby sam rozwiązywał nazwy i dodawał adresy do ipset. Ten sposób został wykorzystany do blokowania właśnie facebooka - odwołując się do strony facebook.com następuje przełożenie nazwy na adres ip, dnsmasq daje go do ipset, a przy pomocy odpowiedniej reguły iptables korzystającej z ipset blokujemy ten ruch.
Zalety:
- szybkie działanie
- skuteczne działanie na poziomie adresu domeny
Wady:
- blokuje wszytko co na danym adresie pracuje, więc jest problem z wirtualnymi hostami (np. blokując google-analytics można zablokować tym samym youtube)
- komputery muszą używać serwera dns ma routerze (lub można wymusić żeby go używały)
Instalacja
Domyślnie w OpenWrt jest dnsmasq kompilowany bez wsparcia dla ipset. Normalną wersję należy odinstalować, a zainstalować jego pełną wersję:
# opkg update
# opkg remove dnsmasq
# opkg install dnsmasq-full
# /etc/init.d/dnsmasq enable
Instalujemy także pakiet ipset
# opkg install ipset
Następnie dodajemy odpowiednią regułę ipset:
# ipset create facebook hash:ip
(można to dodać np. do /etc/rc.local), oraz odpowiedni łańcuch do blokowana facebooka w iptables:
# iptables -I FORWARD -m set --match-set facebook dst,src -j REJECT
(to z kolei można dodać do /etc/firewall.user). Zostaje tylko poinformowanie dnsmasq że ma uzupełniać dane dla ipset rozwiązując nazwy domenowe facebook.com i fb.com:
# uci add_list dhcp.@dnsmasq[0].ipset='/fb.com/facebook'
# uci add_list dhcp.@dnsmasq[0].ipset='/facebook.com/facebook'
# uci commit
I restartujemy dnsmasq:
# /etc/init.d/dnsmasq restart
W komputerze w przeglądarce wpisujmy facebook.com - powinien pojawić się komunikat o odrzuceniu połączenia.
Możemy też na routerze zweryfikować czy ipset dostał adresy:
# ipset list
Name: facebook
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 8312
References: 4
Members:
31.13.93.3
173.252.120.6
69.171.230.5
173.252.74.22
...
oraz czy faktycznie łapie się to na łańcuchach iptables:
# iptables -v -L FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
18 2368 REJECT all -- any any anywhere anywhere match-set facebook dst,src reject-with icmp-port-unreachable
5988 4445K delegate_forward all -- any any anywhere anywhere