Как сделать фильтрацию доменов в Linux?


12

Желательно что-то похожее на iptables. По сути, я хочу сделать домен фильтрации / белый список / черный список, как я бы с IP-адреса в iptables. Есть какие-нибудь рекомендации, как это сделать?


что / почему вы пытаетесь заблокировать? Вы пытаетесь фильтровать исходящий / входящий HTTP или SMTP или NTP? Для разных сценариев могут использоваться разные инструменты.
Крик

1
Вот пара советов, которые могут вам помочь: denyhosts.sourceforge.net/faq.html и fail2ban.org/wiki/index.php/Main_Page .
Рамеш

1
@josten в идеале вы должны использовать HTTP-прокси, такой как Squid . Блокирование доменных имен в iptablesможет быть сделано, но это может быть рискованным
Creek

Ответы:


8

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

# iptables -I FORWARD -p udp --dport 53 -m string --hex-string "|03|www|08|facebook|03|com" --algo bm -j DROP

С другого хоста внутри локальной сети:

# host www.facebook.com
www.facebook.com A record not found, try again

По сути, вы говорите каждому DNS-пакету ( udp/53) с шестнадцатеричной строкой www.facebook.com toотбрасывания. Обратите внимание, что при этом пропадет разрешение имен, а не сам трафик http.

Шестнадцатеричные числа, разделенные с помощью pipe ( |03|www|08|facebook|03|com), представляют собой .символ точки на запросах DNS. В нем будет указано, сколько из следующих символов будет представлять каждую часть полного доменного имени (хост, домен, домен верхнего уровня). Пример:

хост: mail.google.com

шестнадцатеричное представление: 04 6d 61 69 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d

"Визуальное представление: 04mail06google03com

Получение пакета с помощью tcpdump:

# tcpdump -i eth0 -X dst port 53

15:50:11.643672 IP xxx.xxx.xxx.xxx:xxx > ns4.google.com.domain: 16530 A? mail.google.com. (33)
        0x0000:  4500 003d 779a 4000 4011 b390 c949 4742  E..=w.@.@....IGB
        0x0010:  d8ef 260a 8424 0035 0029 0fc0 4092 0000  ..&..$.5.)..@...
        0x0020:  0001 0000 0000 0000 046d 6169 6c06 676f  .........mail.go
        0x0030:  6f67 6c65 0363 6f6d 0000 0100 01         ogle.com.....

Но помните:

  • Если вы пытаетесь отфильтровать более специфический трафик, такой как smtp, ftp или http, прокси этого протокола должен быть лучше.
  • Вы «угоняете» DNS-запросы и не блокируете домен. Пользователи не такие тупые;)

Источники: здесь и здесь


почему тип алгоритма БМ?
Гаурав

Алгоритм Бойер-Мур - en.wikipedia.org/wiki/...

4

Может быть, ответ на ваш вопрос слишком поздно, но недавно мне нужно было решить аналогичную проблему, и Google привел меня сюда

После неудачных поисков я написал небольшую утилиту на C, которая перехватывает DNS-ответы, сравнивает доменное имя в нем с заданным регулярным выражением и перечисляет совпадающие IP-адреса. Вот оно: https://github.com/vmxdev/sidmat/

Вам не нужно настраивать собственный DNS-сервер, утилита может перехватывать ответы DNS с любого сервера.

Например, чтобы увидеть IP-адреса facebook.com (и поддоменов), которые разрешены прямо сейчас, вы можете запустить

# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...

где eth0 - сетевой интерфейс на маршрутизаторе (или где проходят ответы DNS)

Вы можете легко интегрировать его с iptables (или iptables с ipset)

Но:

  • Утилита действительно проста. Он не выполняет много проверок, поэтому злоумышленник может обмануть его
  • этот метод бесполезен, если пользователи не используют DNS для разрешения имен

3

Для внесения в черный список самым простым способом, вероятно, является использование dnsmasq

устанавливать dnsmasq

$ sudo apt-get install dnsmasq

и добавьте эту строку в /etc/dnsmasq.conf

address=/facebook.com/127.0.0.1

Это заблокирует facebook.com и все его субдомены.

Примечание: для Ubuntu смотрите этот пост .


1

Если выполняется локальное кэширование bind9, оно часто реализуется dummy-block

zone "facebook.com" { type master; file "dummy-block"; };

и dummy-blockфайл:

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                          2         ; Serial
                     604800         ; Refresh
                      86400         ; Retry
                    2419200         ; Expire
                     604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
*       IN      A       127.0.0.1   

Смотрите также:

Запуск BIND9 и ISC-DHCP с facebook.comпримером.

Простой DNS-подход для блокирования веб-рекламы

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.