Предположим, я хочу навсегда заблокировать Facebook. Для этого я выполнил следующие процессы:
#host -t a www.facebook.com
Пример вывода:
www.facebook.com имеет адрес 69.171.224.40
Найдите CIDR
#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 навсегда или нет. Если описанные выше подходы не являются правильным способом заблокировать домен навсегда, как я могу это сделать?
Используя следующую вещь, Squid, если вы его используете, сделайте то же самое.
# 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 будет изменен.
Лучше всего использовать прокси-сервер, как предлагает @neolix. Однако ваши пользователи могут попытаться обойти ваш прокси, если у вас нет действительно строгих правил для предотвращения этого.
Вы можете использовать цепочку автоскриптов для блокировки всех 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
, например каждую минуту / час, чтобы обновлять адреса.