Я знаю, что здесь, на serverfault, это был очень часто задаваемый вопрос, тем не менее, у меня нет точного ответа (или я недостаточно читал: D), я также знаю, что некоторые из вас могут подумать, что это практика анти-менеджера (вероятно, так) но дело в том, что это нужно сделать ...
в настоящее время я применял политику блокировки iptables в сочетании с squid, но это не сработало, потому что нам нужен доступ к определенным сайтам Google или сервису Skype, и они доступны по https, а также обмениваются своими ip-адресами, очень сложно отслеживать ...
Мой друг порекомендовал мне Astaro, я его еще не видел, вы можете посоветовать инструмент, который выполняет фильтрацию / домен по сайту порта?
Редактировать вопрос
Есть ли способ заблокировать HTTPS-сайты по домену или лучший подход для этого? Astaro казался альтернативой, но в значительной степени выглядел как простой старый веб-прокси.
Уловка состоит в том, чтобы использовать Squid с аутентифицированными пользователями. SSL-трафик нельзя проксировать, если вы используете прозрачный прокси. Squid может работать в обоих направлениях одновременно (на разных портах):
http_port <ip>:3128 transparent
http_port <ip>:8080
Очевидно, вам придется добавить некоторые правила, чтобы разрешить и запретить аутентифицированным пользователям переходить туда, где это разрешено или запрещено. Тем не менее, пользователям, которые имеют прозрачный доступ в Интернет, будет запрещен доступ к HTTPS, если он заблокирован вашим брандмауэром.
Другой способ (более грязный) - получить разрешенные сайты из файла, получить их записи DNS и обновить / удалить правила, например:
Установите такое правило:
iptables -N SSL_FORWARD
iptables -A FORWARD -s <NET> -p tcp --dport 443 -j SSL_FORWARD
iptables -A FORWARD -s <NET> -p tcp --dport -j DROP
Это создаст новую цепочку SSL_FORWARD и отправит пакеты, приходящие из вашей сети, на порт 443 для оценки в этой новой цепочке. Если пакет не соответствует какому-либо правилу внутри этой цепочки, он будет отброшен.
Затем регулярно выполняйте этот небольшой скрипт:
# Flush SSL_FORWARD chain
iptables -F SSL_FORWARD
# Iterate through each line of this file, and then get
# it DNS records
for domain in `cat /path/to/allowed.domains`; do
for line in `dig ${domain} +short` ; do
[ -z "`echo ${line} | grep '^[0-9.]*$'`" ] && continue
iptables -A SSL_FORWARD -s <NET> -d ${line} -p tcp --dport 443 -j ACCEPT
done
done
Похожая ситуация со мной. Я использую сценарий bash для преобразования списка доменных имен, например:
www.youtube.com
www.vimeo.com
www.facebook.com
В список IP-адресов. Затем я отправил список IP-адресов в ipset
:
ipset -N Blacklist iphash
for ip in ${iplist[@]}; do
ipset -A Blacklist $ip
done
Наконец, я применяю IPset к iptables:
iptables -A FORWARD -p tcp --dport 443 -m set --match-set Blacklist dst -j DROP
Преимущество: Каждое утро задание cron повторно преобразовывает список доменов в список IP-адресов и обновляет Blacklist
set, и мне вообще не нужно трогать правило iptables. Сценарий обновления использует -F
вместо того -N
для своей первой строки.