Iptables использование dns имен

Обновлено: 05.07.2024

IPTables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux. Для использования утилиты IPTables требуются привилегии суперпользователя (root).

Брандмауэр в Linux управляется программой iptables, которая имеет функции фильтрации IPv4

Показать статус.

Примерный вывод команды для неактивного файрвола:

Для активного файрвола:

  • L : Показать список правил.
  • v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
  • n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).

Отобразить список правил с номерами строк.

Вы можете использовать номера строк для того, чтобы добавлять новые правила.

Отобразить INPUT или OUTPUT цепочки правил.

Остановить, запустить, перезапустить файрвол.

Силами самой системы:

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

  • F : Удалить (flush) все правила.
  • X : Удалить цепочку.
  • t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
  • P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).

Удалить правила файрвола.

Чтобы отобразить номер строки с существующими правилами:

Получим список IP адресов. Просто посмотрим на номер слева и удалим соответствующую строку. К примеру для номера 3:

Или найдем IP адрес источника (202.54.1.1) и удалим из правила:

  • D : Удалить одно или несколько правил из цепочки.

Добавить правило в файрвол.

Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:

Чтобы вставить правило между 1 и 2 строкой:

Проверим, обновилось ли правило:

Вывод станет таким:

Сохраняем правила файрвола.

Восстанавливаем правила.

Устанавливаем политики по умолчанию.

Чтобы сбрасывать весь трафик:

После вышеперечисленных команд ни один пакет не покинет данный хост.

Блокировать только входящие соединения.

Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:

Пакеты исходящие и те, которые были запомнены в рамках установленных сессий — разрешены.

Сбрасывать адреса изолированных сетей в публичной сети.

Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 ©
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

Блокировка определенного IP адреса.

Чтобы заблокировать адрес взломщика 1.2.3.4:

Заблокировать входящие запросы порта.

Чтобы заблокировать все входящие запросы порта 80:

Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4:

Заблокировать запросы на исходящий IP адрес.

Чтобы заблокировать определенный домен, узнаем его адрес:

Вывод:
CIDR: 69.171.224.0/19

Заблокируем доступ на 69.171.224.0/19:

Также можно использовать домен для блокировки:

Записать событие и сбросить.

Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:

Проверим журнал (по умолчанию /var/log/messages):

Записать событие и сбросить (с ограничением на количество записей).

Чтобы не переполнить раздел раздутым журналом, ограничим количество записей с помощью -m. К примеру, чтобы записывать каждые 5 минут максимум 7 строк:

Сбрасывать или разрешить трафик с определенных MAC адресов.

Разрешить или запретить ICMP Ping запросы.

Разрешить для определенных сетей / хостов:

Разрешить только часть ICMP запросов:

  • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
  • iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT

iptables -A OUTPUT -i eth0 -p icmp --icmp-type 0 -j ACCEPT

Открыть диапазон портов.

Открыть диапазон адресов.

Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.

Ограничить количество параллельных соединений к серверу для одного адреса.

Для ограничений используется connlimit модуль. Чтобы разрешить только 3 ssh соединения на одного клиента:

Может такой сабж уже и был где-то, но я его ненашел в рунете, по-крайней мере. Суть проблеммы: стоит настроенный как надо iptables, но работает он по IP-адресам. Сейчас переходим на DHCP, т.е. соответственно нужно что-бы iptables понимал DNS-имена. Чего он НЕ делает. Как решить эту проблемму ?


Надо проверить /etc/resolv.conf на предмет nameserver

Открой 53 порт в обе стороны на DNS-server и пропиши адрес DNS-server'a в /etc/resolv.conf


И чего, он на каждый пакет будет у DNS-сервера добро спрашивать?

Дополнение к посту предыдущего оратора. 53 порт UDP протокола


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

>И чего, он на каждый пакет будет у DNS-сервера добро спрашивать?

не, он при запуске разресолвит и будет этими адресами пользоваться
а если в dhcp чего-нить поменяется, файрвол будет по старым адресам работаь будет пока не перезапустишь :)

Это почему он при запуске все разресолвит? Где такое сказано?

>Надо проверить /etc/resolv.conf на предмет nameserver Стоп. IPTABLES В ПРИНЦИПЕ НЕ может работать ни с одним DNS именем, хотя сервер "знает" эти хосты (они пингуются, коннектятся по ssh и ftp). В ряде источников написанно, что iptables работает только с IP. Это правда ?

Да, может iptables ресолвить DNS-имена, вот из исх.кодов:
if (shostnetworkmask)
parse_hostnetworkmask(shostnetworkmask, &saddrs,
&(fw.ip.smsk), &nsaddrs);
if (dhostnetworkmask)
parse_hostnetworkmask(dhostnetworkmask, &daddrs,
&(fw.ip.dmsk), &ndaddrs);
Эти функции вызывают в конце концов глибсевую gethostbyname();
Т.е. сам iptables действительно ресолвит имена один раз и засовывает в цепочки уже разрешенные ip-адреса. Хотя в man написано, что писать DNS имена вместо IP это "really bad idea" (c) Почему?

А не проще написать скриптик, который будет сам резолвить DNS-имена и
передавать в Iptables. И при динамической смене адреса добавлять/удалять
новое правило.

Спосибо за советы, господа. Итак, что мы имеем:

>не, он при запуске разресолвит и будет этими адресами пользоваться >а если в dhcp чего-нить поменяется, файрвол будет по старым адресам >работаь будет пока не перезапустишь :)

>Т.е. сам iptables действительно ресолвит имена один раз и засовывает >в цепочки уже разрешенные ip-адреса.

Да, видимо так и есть.Все это говорит, что iptables нельзя использовать для динамических ip-адресов. Здесь видимо подсказка в самом названии сего продукта. Т.е работа идет только на уровне протокола IP, выше по стеку TCP/IP пакеты iptables просто не обрабатываются ! Это плохо. в сложившейся ситуации вижу следующие способы решения проблеммы:

1. >Я бы в настройках DHCP прописал все нужные IP и по ним резал. Это уже >не совсем автоматизация раздачи IP, но правки делаешь в одном месте, >а не по машинам юзеров.

Т.е. делаем несколько "блатных" IP адресов, с которых можно ходить в инет, статическими, остальные - динамическими. Видимо, пока самый реальный способ. Но не без минусов. Бывает так что обычным юзерам тоже надо в Инет.

2. Работать не с IP а MAC-адресами сетевых карт. Тоже негуд, т.к. зависимость от железок.

3. >А не проще написать скриптик, который будет сам резолвить DNS-имена и >передавать в Iptables. И при динамической смене адреса >добавлять/удалять >новое правило.

Так-так. Это будет демон, который будет висеть и периодически смотреть изменился ли IP адрес у хоста, и если изменился переписать правило. Геморой, порнография и не по уму. Изобретение велосипеда. Мне надоело каждый раз изобретать велосипед, а потом узнавать, что уже есть мотоцикл, который к тому же бесплатный. Может есть все-таки есть готовое решение ?

4. Использовать другой файрвол. Жалко расставаться с айптейблс, конечно, но может есть другой линуксовый файрволл, не имеющей этой проблеммы ?

Файрвол в системе linux контролируется программой iptables (для ipv4) и ip6tables (для ipv6). В данной шпаргалке рассмотрены самые распространённые способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.

1. Показать статус.

Примерный вывод команды для неактивного файрвола:

Для активного файрвола:

Где:
-L : Показать список правил.
-v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
-n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).

2. Отобразить список правил с номерами строк.

Вы можете использовать номера строк для того, чтобы добавлять новые правила.

3. Отобразить INPUT или OUTPUT цепочки правил.

4. Остановить, запустить, перезапустить файрвол.

Где:
-F : Удалить (flush) все правила.
-X : Удалить цепочку.
-t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
-P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).

5. Удалить правила файрвола.

Где:
-D : Удалить одно или несколько правил из цепочки.

6. Добавить правило в файрвол.

Вывод станет таким:

7. Сохраняем правила файрвола.

8. Восстанавливаем правила.

9. Устанавливаем политики по умолчанию.

10. Блокировать только входящие соединения.

11. Сбрасывать адреса изолированных сетей в публичной сети.

Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

12. Блокировка определенного IP адреса.

13. Заблокировать входящие запросы порта.

14. Заблокировать запросы на исходящий IP адрес.

Вывод:
CIDR: 69.171.224.0/19

15. Записать событие и сбросить.

Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:

16. Записать событие и сбросить (с ограничением на количество записей).

16. Сбрасывать или разрешить трафик с определенных MAC адресов.

17. Разрешить или запретить ICMP Ping запросы.

18. Открыть диапазон портов.

19. Открыть диапазон адресов.

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Где:
--connlimit-above 3 : Указывает, что правило действует только если количество соединений превышает 3.
--connlimit-mask 24 : Указывает маску сети.

Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man:
$ man iptables

Проверка правила iptables.

Автор статьи Platon Puhlechev aka iFalkorr разрешает печатать данный текст.

Iptables отличный инструмент в руках администратора. Если нужно легко и просто защититься в десктопной Ubuntu, то стоит знать, что есть удобная консольная надстройка над iptables под названием UFW, а к ней есть графическая программа GUFW. Сделать свою Ubuntu ещё более защищённой поможет видеоматериал.

У меня есть сервер Debian со статическим IP-адресом. Я хочу настроить его так, чтобы при подключении к этому серверу через определенный порт он перенаправлял этот трафик в мою домашнюю сеть.

У меня это работает с использованием iptables, например, так:

Проблема в том, что моя домашняя сеть имеет динамический IP. Как только это изменится (что происходит достаточно часто), это перестанет работать.

Однако для моего домашнего IP-адреса настроено динамическое DNS-имя.

Можно ли в любом случае использовать iptables, чтобы он всегда перенаправлял этот трафик на IP-адрес, к которому относится мое динамическое DNS-имя?

2 ответа 2

IPTables не поддерживает оперативное разрешение DNS, поскольку оно связано с проблемами безопасности, производительности и реализации.

Если кто-то сможет изменить записи DNS для вашего домена, это повлияет на правила IPTables.

Если бы IPTables выполнял поиск DNS для каждого входящего пакета или даже пакета инициализации соединения, это было бы очень медленно.

Кроме того, если существует несколько записей A для доменного имени, какую из них будет использовать IPTables?

Чтобы выполнить то, что вы ищете, вам необходимо внедрить систему, в которой хост, на котором выполняются IPTables, будет периодически проверять IP-адрес вашего динамического имени хоста, а затем соответствующим образом изменять его правила.

Другой альтернативой может быть наличие программного обеспечения на вашем компьютере в домашней сети, которое отслеживает текущий общедоступный IP-адрес, а затем отправляет его на ваш сервер IPTables, который перенастраивает IPTables.

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

По причинам, хорошо объясненным Теро Киканеном, iptables - не инструмент для выполнения того, что вы хотите. Вы должны использовать вместо ssh .

hostA ваш локальный компьютер;

hostB ваш сервер Debian;

hostC ваш домашний компьютер.

Например, если вы хотите переслать ваш ssh- сеанс, вам нужно добавить на ПК hostA следующую строку в ваш файл .ssh/config:

и убедитесь, что у вас есть учетные данные для входа в hostC на hostA. Теперь из hostA вы можете подключиться к hostC следующим образом:

В этом вам не нужно использовать IP-адреса, неразрешенные имена в порядке. Кроме того, вы можете добавить всевозможные параметры (такие как порт, файл криптографического ключа, пользователь и т.д.) Либо в файл команд прокси, либо в интерфейс командной строки (это зависит от того, используется ли параметр для соединения B-> C, или для подключения A-> B соответственно).

Таким же образом вы можете переадресовать данный порт (portA) на hostA на другой порт (portC) на hostC через посредство hostB следующим образом:

Еще раз, не нужно использовать IP-адреса, подойдут простые имена. Еще одним важным преимуществом ssh является то, что все коммуникации автоматически шифруются, поэтому никто не сможет увидеть, что вы делаете.

Наконец, если вы не знаете, как дать (бесплатно!) имя ПК без статического IP-адреса (hostC), просто проверьте noip, это тривиально.

Всем привет. решил разобраться в конфигурировании фаервола iptables, т.к он применяется в одной небольшой сети где через сквид раздает инет итд. Но там частенько происходят различного плана глюки и поэтому было принято решение разобраться в некоторых моментах и перенастроить.

Начать я решил с днс форвардинга.

Скажем в случае если фаер настраивается по политике, запрещено все что не разрешено и на всех клиентских компах у меня в роли днс сервера будет прописан маршрутизатор. Достаточно ли для реализации этого iptables ? Может это делается как то иначе ?

я вижу себе это примерно таким образом

и вот дальше у меня вопрос, пользоваться таблицей filter и прописывать форвардинг или же здесь надо исолпьзовать SNAT и DNAT ?

1. для серфинга через прокси сервер dns не нужен
2. если все таки нужно раздавать днс то тут два варианта
1) поднимать свой днс сервер (bind, djbdns и др)
2) использовать прозрачный днс сервер (dnsmasq)

что до iptables, то одних "установленных" соединений не достаточно, нужно пускать и "новые" пакеты
по моему лучше сделать так:
iptables -A INPUT -m state --state ESTABLISHED,RELATES -j ACCEPT
потом открывать порты уже буз указания состояния пакета

и советую разобраться какой протокол и для какой цели используется в dns

Всем привет. решил разобраться в конфигурировании фаервола iptables, т.к он применяется в одной небольшой сети где через сквид раздает инет итд. Но там частенько происходят различного плана глюки и поэтому было принято решение разобраться в некоторых моментах и перенастроить.

Начать я решил с днс форвардинга.

Скажем в случае если фаер настраивается по политике, запрещено все что не разрешено и на всех клиентских компах у меня в роли днс сервера будет прописан маршрутизатор. Достаточно ли для реализации этого iptables ? Может это делается как то иначе ?

Для ограничения всего на маршрутизаторе iptables достаточно. Насколько удобно через него делать днс-форвардинг - не знаю. Обычно ставиться промежуточный dns-proxy (можно и кэширующий). Лично я использую pdnsd.

я вижу себе это примерно таким образом

Это хмм что? разрешение использовать днс для маршрутизатора? если да то насчет --sport 53 в строке iptables -A INPUT -p UDP -s $DNS -m state --state ESTABLISHED --sport 53 -j ACCEPT не уверен. Я бы просто разрешил уже установленные соединения. Но если вы проверяли и это работает то почему бы и нет. И днс работает через UDP.

и вот дальше у меня вопрос, пользоваться таблицей filter и прописывать форвардинг или же здесь надо исолпьзовать SNAT и DNAT ?

Таблица filter только для фильтрации(т е запрещения и разрешения) - как вы в ней собираетесь форвардинг прописать?(под форвардингом лично я подразумеваю перенаправление пакетов, например действием REDIRECT). Или вы имеете в виду правила для цепочки FORWARD?
Если вы хотите перебрасывать запросы днс от клиентов к провайдеру то надо пользоваться DNAT в цепочке PREROUTING. Но я бы на вашем месте подумал о кэширующем днс.

1. для серфинга через прокси сервер dns не нужен
2. если все таки нужно раздавать днс то тут два варианта
1) поднимать свой днс сервер (bind, djbdns и др)
2) использовать прозрачный днс сервер (dnsmasq)

что до iptables, то одних "установленных" соединений не достаточно, нужно пускать и "новые" пакеты
по моему лучше сделать так:
iptables -A INPUT -m state --state ESTABLISHED,RELATES -j ACCEPT
потом открывать порты уже буз указания состояния пакета

и советую разобраться какой протокол и для какой цели используется в dns

Для ограничения всего на маршрутизаторе iptables достаточно. Насколько удобно через него делать днс-форвардинг - не знаю. Обычно ставиться промежуточный dns-proxy (можно и кэширующий). Лично я использую pdnsd.

Таблица filter только для фильтрации(т е запрещения и разрешения) - как вы в ней собираетесь форвардинг прописать?(под форвардингом лично я подразумеваю перенаправление пакетов, например действием REDIRECT). Или вы имеете в виду правила для цепочки FORWARD?

да речь шла о цепочке форвард.

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

Установил и настроил BIND, работает как кеширующий - все ок.

Теперь настраиваю под него iptables

вот таким образом работает. все ли я учел?

Установил и настроил BIND, работает как кеширующий - все ок.

Теперь настраиваю под него iptables

вот таким образом работает. все ли я учел?


1. iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP - это зачем - у вас же политика DROP
2. DNS в основном по udp работает - хотя в IANA прописано 53 TCP и UDP. Можно оставить а можно tcp выкинуть.
3. iptables -A OUTPUT -d $NET -j ACCEPT - это куда разрешение? Если в ответы в сеть то наверно лучше просто разрешить уже установленные соединения для цепочки OUTPUT - iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
4. Я бы просто разрешил в цепочке INPUT уже установленные соединения а не только от $DNS_1 - iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT - для других правил может пригодиться - не днс единым


по переменным $net - подсеть офиса 192.168.1.0/24, то бишь все компы кот будут смотреть инет через сервер
$Serv - Ip самого копмьютера
$DNS_1 - Днс сервер (в конечном итоге будет провайдера, пока просто сетевой)

3. следовательно это разрешения на все соединения в внутреннюю сеть.

Вопрос между делом, для squid в iptables надо прописывать какие либо разрешения ?


по переменным $net - подсеть офиса 192.168.1.0/24, то бишь все компы кот будут смотреть инет через сервер
$Serv - Ip самого копмьютера
$DNS_1 - Днс сервер (в конечном итоге будет провайдера, пока просто сетевой)

3. следовательно это разрешения на все соединения в внутреннюю сеть.

Вопрос между делом, для squid в iptables надо прописывать какие либо разрешения ?

Для сквида нужно прописывать пока почти все то же самое в принципе.
И не забывайте что $Serv у вас будет разным для внутреннего и внешнего интерфейсов.

Читайте также: