Назад | Перейти на главную страницу

Постоянная блокировка домена в iptables

Предположим, я хочу навсегда заблокировать 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, например каждую минуту / час, чтобы обновлять адреса.