Ответ 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
.