Желательно что-то похожее на iptables
. По сути, я хочу сделать фильтрацию доменов/белые списки/черные списки, как я бы сделал с IP-адресами в iptables
. Есть ли какие-либо рекомендации, как это сделать?
решение1
Если вы отбрасываете трафик с помощью разрешения имен с помощью правил 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
be dropped. Обратите внимание, что это приведет к отказу от разрешения имен, а не самого http-трафика.
Шестнадцатеричные числа, разделенные вертикальными чертами ( |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.@[email protected]
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-запросы, а не блокируете домен. Пользователи не настолько тупы ;)
решение2
Возможно, ответ на ваш вопрос уже запоздал, но недавно мне нужно было решить похожую проблему и гугл привел меня сюда
После безуспешных поисков я написал небольшую утилиту на языке 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 см.эта почта.
решение4
При запуске локального кэширования 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
примером.