Настройка исходящих запросов к DNS в iptables

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
no avatar

Автор темы
z2y9x5
Сообщения: 36
Зарегистрирован: 09 июл 2021, 06:13
Благодарил (а): 12 раз
Поблагодарили: 6 раз
Контактная информация:

Настройка исходящих запросов к DNS в iptables

#1

06 дек 2022, 16:06

Столкнулся с такой проблемой - не могу настроить разрешение на исходящие dns-запросы. То есть ситуацию, когда наш сервер обращается во внешний мир за dns-адресами. Перелопатил половину гугла, но ничего толком не помогло. Условный ping ya.ru идет только если убить правила файервола. Сам конфиг ниже.

Много где указано что DNS хитрая штука, и принимая запросы по UDP на порт 53 он может вернуть ответ на какой угодно порт от 1024 до 65536... Непонятно как настроить iptables, чтобы он ОТВЕТНЫЕ udp пакеты от dns принимал, но не открывал при этом все udp порты вообще :)

Если есть другие замечания по конфигу, тоже высказывайтесь.

Код: Выделить всё

#!/bin/bash

# путь до iptables
IPT=/usr/sbin/iptables

# сброс всех правил
$IPT -F

# по умолчанию удалять все пакеты
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# разрешить loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT ! -i lo -s 127.0.0.0/8 -j DROP

# разрешить пинг
$IPT -A INPUT  -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A INPUT  -p icmp --icmp-type echo-reply -j ACCEPT
$IPT -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

# разрешить входящий ssh
$IPT -A INPUT  -p tcp --dport 4200 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 4200 -m state --state ESTABLISHED     -j ACCEPT

# разрешить входящие соединения к mariadb
$IPT -A INPUT  -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 3306 -m state --state ESTABLISHED     -j ACCEPT

# разрешить веб-сервер
$IPT -A INPUT  -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED     -j ACCEPT

# Разрешить исходящие DNS-запросы
$IPT -A INPUT  -p udp --sport 53 -j ACCEPT
$IPT -A OUTPUT -p udp --dport 53 -j ACCEPT

# разрешить серверы обновлений
# ru.archive.ubuntu.com (mirror.yandex.ru)
$IPT -A INPUT  -s ru.archive.ubuntu.com -p tcp -m state --state ESTABLISHED     -j ACCEPT
$IPT -A OUTPUT -d ru.archive.ubuntu.com -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT

Аватара пользователя

slant
Сообщения: 4469
Зарегистрирован: 21 июн 2017, 18:09
Решено: 95
Благодарил (а): 51 раз
Поблагодарили: 1966 раз
Контактная информация:

Настройка исходящих запросов к DNS в iptables

#2

06 дек 2022, 16:38

Основная ошибка - нет строки, которая разрешает принимать ответы на соединения которые инициированы с нашей стороны. Это автоматически решает вопрос с приемом как DNS, так и кучи всего остального, нужного именно нам.

По сути дела, стандартный фаервалл для десктопа можно свести к двум правилам такого вида:

"Разрешить любые исходящие соединения которые инициированы мной"
"Принимать входящие соединения-ответы на соединения которые инициированы мной".
Эта вторая строчка в вашем варианте будет выглядеть как-то так (дословно не помню, проверьте):

$IPT -A INPUT -d <ваш IP> --match state --state ESTABLISHED,RELATED --jump ACCEPT

Но т.к. ваш IP, скорее всего, может меняться по желанию провайдера - то ключ -d может быть удобнее заменить на -i <имя вашего сетевого интерфейса на котором линк к провайдеру>

Или даже еще проще, без проверки получателя:
$IPT -A INPUT --match state --state ESTABLISHED,RELATED --jump ACCEPT

Это практически так же безопасно, т.к. match будет проверять получателя сравнивая с исходным отправителем. (Да, для udp тоже, т.к. RELATED.) И пропускать только то, что является прямым и не совсем прямым (udp) ответом.

Далее только дописывать исключения.

P.S. Самый простой-удобный, IMHO, способ настройки firewall'а из консоли - поставить пакет arno-iptables-firewall и настроить через него, там через подробно откомментированный текстовый конфиг это делается. Только nat в конфиге не нужно указывать, если машина не должна попутно маршрутизатором работать для локалки.

no avatar

Автор темы
z2y9x5
Сообщения: 36
Зарегистрирован: 09 июл 2021, 06:13
Благодарил (а): 12 раз
Поблагодарили: 6 раз
Контактная информация:

Настройка исходящих запросов к DNS в iptables

#3

06 дек 2022, 17:11

slant, Разрешить все исходящие и все ответы на исходящие, это ок. Но все же интересен вариант для параноиков, когда все что явно не разрешено, запрещено. Как в таком случае прописать строки? :)

Аватара пользователя

slant
Сообщения: 4469
Зарегистрирован: 21 июн 2017, 18:09
Решено: 95
Благодарил (а): 51 раз
Поблагодарили: 1966 раз
Контактная информация:

Настройка исходящих запросов к DNS в iptables

#4

06 дек 2022, 17:39

z2y9x5 писал(а):
06 дек 2022, 17:11
Как в таком случае прописать строки?
Никак. В таком случае остается полагаться на RFC по которому DNS сервер обязан уметь ответить на 53-й порт, и разбираться когда это необходимо делать т.к. другие недоступны.

А совсем-совсем параноикам вообще нет смысла обращаться куда попало за DNS - им нужно выбрать какой-то доверенный, прописать разрешение обращаться только к нему (по адресу), а в самом ресолвере еще проверку по сертификату повесить. И вообще - жесткий dns-over-tls настроить, т.к. стандартный протокол - открытый, кто хочет может видеть, и кто угодно может "модернизировать" запрос-ответ.

no avatar

Автор темы
z2y9x5
Сообщения: 36
Зарегистрирован: 09 июл 2021, 06:13
Благодарил (а): 12 раз
Поблагодарили: 6 раз
Контактная информация:

Настройка исходящих запросов к DNS в iptables

#5

07 дек 2022, 09:05

slant, dns сервак, как и тот с которым я мучаюсь, находятся в одной локальной сети. То есть разрешить на этот айпи все udp? :)

Аватара пользователя

slant
Сообщения: 4469
Зарегистрирован: 21 июн 2017, 18:09
Решено: 95
Благодарил (а): 51 раз
Поблагодарили: 1966 раз
Контактная информация:

Настройка исходящих запросов к DNS в iptables

#6

07 дек 2022, 13:28

z2y9x5 писал(а):
07 дек 2022, 09:05
То есть разрешить на этот айпи все udp?
Тот вариант что я описал выше подходит для 95% случаев. Лучше него, без продвинутого разбора содержимого пакетов, пока не придумано насколько мне известно. И просто открывать все udp пусть и для одного адреса - тоже не лучше
А если это локалка - в большинстве случаев не то что параноидальный - даже обычный firewall не нужен, если система в актуальном состоянии. Не винда, чай.

Ответить

Вернуться в «Системные утилиты»

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и 6 гостей