Правило Iptables для блокировки всех веб-запросов к domain.com

Я знаю, что это не лучшее решение, и это не рабочий сервер, однако я все еще пытаюсь отбросить запросы к домену, если он не соответствует строке домена.

Пока это работает, если я применяю правило само по себе, но оно не будет работать в сочетании с другими правилами. Я предполагаю, что Iptables чувствителен к порядку.

   iptables -P INPUT DROP
   iptables -P OUTPUT DROP
   iptables -P FORWARD DROP

   # Allow unlimited traffic on loopback
   iptables -A INPUT -i lo -j ACCEPT
   iptables -A OUTPUT -o lo -j ACCEPT

   # Allow full outgoing connection but no incomming stuff
   iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
   iptables -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

   # Block sites
   iptables -I INPUT -p tcp --dport 80 -j ACCEPT 
   iptables -I INPUT 1 -p tcp --dport 80 -m string --string ! "sub.domain.com" --algo kmp -j DROP

   iptables -A INPUT -i eth0 -j DROP
   iptables -A OUTPUT -j DROP

3 ответа

Iptables определенно чувствителен к порядку правил. Первый матч решает судьбу пакета.

Может случиться так, что у вас есть правило, соответствующее и принимающее ESTABLISHED пакеты перед правилом DROP строки. Очень часто правило ESTABLISHED является одним из первых правил в настройке iptables.

Соединение получает состояние ESTABLISHED сразу после первого пакета SYN, если я не ошибаюсь. И пакет SYN не содержит имя заголовка узла с "sub.domain.com". Только пакет с запросом GET будет содержать это, и он уже будет соответствовать правилу ESTABLISHED.

Решением было бы поместить строку DROP перед УСТАНОВЛЕННОЙ.

Сказав это, ваше решение является довольно необычным и может даже поставить сервер на некоторое затруднение, если по какой-либо причине объем этих заблокированных запросов станет высоким. Соединение установлено, но затем клиент отключается. Сервер будет ждать, пока какое-то время не прекратит работу. Я не совсем то, что произойдет, но будьте осторожны.

Я предположил, что вы по какой-то причине не можете изменить конфигурацию сервера, чтобы заблокировать эти специфические соединения. В Apache это просто кусок пирога, устанавливающий такой контроль.

Используйте Squid для ограничения всего домена, который вы хотите по протоколу http, легко настроить

и для протоколов https используйте: iptables -A FORWARD -m string --string "facebook.com" --algo bm --from 1 --to 600 -j REJECT

Это не будет делать то, что вы хотите. Вы можете эффективно ограничить доступ к хосту с помощью iptables. В вашем случае ограничьте доступ к IP-адресу сервера, на котором размещен сайт. Это по-прежнему разрешает доступ к другим доменам, размещенным на этом сервере.

Вы можете использовать прокси как squid в режиме прозрачного прокси и используйте ACL для ограничения доступа к сайту, который вы разрешаете. Используйте правило DNAT, чтобы перенаправить все HTTP-доступы к вашему прокси. Такое правило должно перенаправлять веб-трафик на прокси-сервер через порт 3129:

iptables -t nat -A PREROUTING -p tcp --dport 80 ! -d 127.0.0.1 -j DNAT --to-destination $SQUID:3129
Другие вопросы по тегам