Может ли iptables разрешать DNS-запросы только для определенного имени домена?

У меня есть iptables, блокирующий весь UDP-трафик на данный момент, однако я хочу разрешить только определенные DNS-запросы.

В качестве примера можно использовать google.com.

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

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --string "google.com" --algo bm -j ACCEP Т

Я также попробовал --dport 53 вместо --sport. Нет кубиков.

Если кто-нибудь знает, как это можно сделать или посмотреть, где я поступил неправильно, ваша помощь будет оценена!

Спасибо, Jarred

Ответ 1

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

Если вы посмотрите на содержимое пакета запросов DNS в wirehark или аналогичном, вы обнаружите, что символ точки не используется. Каждая часть имени домена является подсчитанной строкой, поэтому фактические байты запроса для google.com будут:

06 67 6f 6f 67 6c 65 03 63 6f 6d

Первый байт (06) - это длина google, за которым следуют 6 символов ASCII, затем байт счета (03) для длины com, за которым следует... вы получаете идею.

Чтобы соответствовать этому в iptables, используйте следующее:

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --hex-string "|06|google|03|com" -algo bm -j ACCEPT

Параметр --hex-string анализирует предоставленную строку, ища шестнадцатеричные значения, разделенные парами вертикальных баров. Все, что находится за пределами вертикальных полос, интерпретируется как текст ASCII.

Если вы перечислите таблицу OUTPUT после добавления записи, вы найдете что-то по строкам:

ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain STRING match  "|06676f6f676c6503636f6d|" ALGO name bm TO 65535

Вы можете слегка настроить правило и ускорить его, ограничив диапазон поиска с помощью параметров --from и --to.

Ответ 2

Я обнаружил, что не является надежным для строк с точками.

Это будет работать:

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT