Правило 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