Действие dnat для правила фильтра сетевых пакетов iptables
Записки IT специалиста
Основы iptables для начинающих. Часть 3. Таблица nat
- Автор: Уваров А.С.
- 25.07.2021
В качестве продолжения нашего цикла о брандмауэре iptables мы рассмотрим таблицу nat, в которой происходит преобразование сетевых адресов. С этой таблицей, также, как и с filter вы будете часто встречаться, выполняя такие привычные и повседневные задачи, как выход в интернет, проброс портов или перенаправление трафика. При этом действие механизма NAT более сложное и требует более глубокого понимания происходящих процессов, поэтому советуем уделить внимание в первую очередь теоретической части.
NAT (Network Address Translation, преобразование сетевых адресов) - это механизм работающий в IP-сетях и позволяющий преобразовывать IP-адреса транзитных пакетов. Протокол IP - маршрутизируемый протокол сетевого уровня (L3), предназначенный для передачи данных между сетями. Единицей передачи данных на уровне IP-протокола является пакет.
Сразу с этого места сделаем небольшое отступление, потому как с понятием "пакет" существует изрядная путаница, которая может приводить начинающих в некоторое замешательство. Начнем с того, что понятие пакет применимо только к протоколу IP сетевого уровня (L3). Пакет состоит из заголовка и полезной нагрузки. Заголовок, вместе с иной служебной информацией, содержит два важных поля: адрес отправителя (SRC IP) и адрес получателя (DST IP). Полезной нагрузкой IP-пакета является один из протоколов транспортного уровня (L4): TCP, UDP, GRE и т.д.
Следует четко запомнить: IP-заголовок содержит только адрес отправителя и адрес получателя, понятие порт в протоколе IP отсутствует. Порт появляется в заголовках транспортного протокола L4 (TCP, UDP), но информация об адресах источника и назначения там отсутствует. Но как быть, если где-то говорят о пакете на порт TCP 80? Это выражение следует понимать, как IP-пакет с полезной нагрузкой в виде TCP-сегмента с портом назначения 80. Также следует помнить, что у каждого транспортного протокола свой набор портов и одни и те же порты могут быть использованы одновременно с разными протоколами.
Теперь перейдем к самому понятию NAT, эта технология возникла тогда, когда потребовалось предоставить доступ к внешней сети узлам сети внутренней, не имеющим выделенного IP-адреса. По мере роста сетей при ограниченном количестве "белых" IP-адресов это становилось все большей проблемой и привело к совершенствованию механизма NAT.
Существует несколько видов NAT:
- Симметричный - когда все порты внутреннего адреса транслируются на порты внешнего адреса, при этом устройство становится полностью доступным из внешней сети.
- Динамический - когда порт внутреннего адреса случайным образом транслируется на порт одного из внешних адресов, причем для каждого нового соединения может быть использован отличающийся адрес
- Перегруженный - когда порты нескольких внутренних адресов транслируются на случайные порты единственного внешнего адреса.
Далее мы будем говорить именно о перегруженном NAT (NAPT, NAT Overload, PAT, маскарадинг), потому что в большинстве реализаций используется именно он, также следует отметить, что PAT (Port Address Translation, Трансляция порт-адрес) требует обязательного наличия открытого порта, что может вызвать проблемы с прохождением NAT для транспортных протоколов не использующих порты, например, GRE.
Вернемся к iptables, функции NAT реализованы в одноименной таблице nat (все таблицы обозначаются строчными буквами), которая содержит цепочки PREROUTING, POSTROUTING и OUTPUT. В первые две цепочки попадает весь трафик узла, в последнюю только собственный исходящий.
Обратите внимание, что все преобразования NAT выполняются либо до, либо после принятия решения о маршрутизации и фильтрации трафика брандмауэром, этот момент следует учитывать при построении правил фильтрации.
В таблице nat доступно два основных действия:
- SNAT - Source Network Address Translation - изменение адреса и порта источника пакета, доступен в цепочке POSTROUTING
- DNAT - Destination Network Address Translation - изменение адреса и порта назначения пакета, доступен в цепочках PREROUTING и OUTPUT
Таким образом изменить адрес и порт назначения мы можем только перед входом пакета в брандмауэр и до принятия решения о маршрутизации, а изменить адрес и порт источника можем только при выходе пакета из брандмауэра, после принятия решения о маршрутизации. Это еще одно важное правило, которое следует твердо запомнить: DNAT - на входе, SNAT - на выходе.
Более подробное знакомство мы начнем со SNAT, как мы уже говорили выше данное действие изменяет адрес и порт источника пакета, одно из основных практический применений - обеспечения доступа локальной сети в интернет. Давайте посмотрим, в чем состоит проблема и как SNAT помогает ее решить. Для использования в локальных сетях используются диапазоны частных или т.н. "серых" IP-адресов, их особенностью является то, что они не маршрутизируются в интернете, т.е. если маршрутизатору попадает такой пакет и для него нет отдельного маршрута - он будет отброшен. При этом внешний адрес у данной сети один и его как-то следует использовать для обращения к внешнему миру всех локальных ПК.
Что делает SNAT? Он заменяет адрес источника пакета внешним адресом, также, при необходимости, меняет и порт источника, что позволяет различать запросы, сделанные с одного и того же порта разных ПК, запись о выполненной трансляции заносится в специальную таблицу трансляций (она же таблица NAT). Получив ответ роутер находит запись в таблице трансляций и на ее основании изменяет адрес и порт назначения ответного пакета, после чего он прозрачно доставляется адресату в локальной сети.
В общем виде запись в iptables для SNAT будет выглядеть следующим образом:
Первое, на что следует обратить внимание - это ключ -t, который указывает используемую таблицу, если данный ключ не указан, то по умолчанию используется таблица filter. Запись добавляется в цепочку POSTROUTING и предписывает выполнить действие SNAT для всех пакетов, попадающих под критерий -o ens33, т.е. использующих в качестве исходящего внешний интерфейс ens33. Для SNAT обязательно указывается параметр --to-source, который используется для указания адреса, присваиваемому пакету, теперь именно этот адрес будет указываться в качестве исходящего.
Приведенное выше правило будет изменять адрес источника для всех исходящих пакетов без разбору, что не всегда корректно и безопасно, поэтому правилом хорошего тона считается явно задавать диапазон адресов для преобразования:
Также мы можем выполнять трансляцию адресов не для всего трафика, а выборочно, указывая необходимые порты и протоколы, скажем только для SSH:
Частным случаем SNAT является действие MASQUERADE (маскарадинг), его основным отличием является то, маскарадинг самостоятельно получает IP-адрес от заданного сетевого интерфейса и не требует его явного указания. Это удобно если на внешнем интерфейсе используется динамический IP-адрес. Вторая особенность MASQUERADE в том, что при остановке интерфейса таблица трансляций полностью очищается и все текущие соединения разрываются. Причина такого поведения в том, что при следующем запуске интерфейса имеется возможность получить новый IP-адрес и все текущие записи сразу окажутся неверны.
Можно ли использовать MASQUERADE со статическим внешним адресом? Можно, но следует учитывать, что данное действие дает более высокую нагрузку на систему, так как определяет адрес внешнего интерфейса для каждого пакета, и в данном случае предпочтительно использовать SNAT.
Маскарадинг, также, как и SNAT, можно использовать только в цепочке POSTROUTING, и типичная запись будет выглядеть так:
Оба этих действия также позволяют явно указывать исходящий порт или диапазон портов для трансляции, для SNAT это делается в параметре --to-source через двоеточие, а в MASQUERADE используется специальная опция --to-ports:
Теперь вернемся к порядку прохождения пакетов по таблицам и цепочкам. Как несложно заметить - цепочка POSTROUTING таблицы nat является завершающим этапом обработки трафика, после которого он покидает брандмауэр. Это говорит о том, что в правилах фильтрации следует использовать только исходные адреса и порты источников, до трансляции. Новые адреса в брандмауэр не попадают.
Второе основное действие в таблице nat - это DNAT - или изменения адреса и порта назначения пакета. Это действие применимо в цепочках PREROUTING и OUTPUT, т.е. на самом входе в брандмауэр, раньше таблицы nat пакеты попадают только в mangle. На практике DNAT применяется в основном для проброса портов, типовой пример:
Данное правило изменит адрес назначения всех пакетов пришедших на внешний интерфейс ens33 по протоколу tcp с портом назначения TCP-сегмента 3389 на адрес внутреннего сервера 192.168.100.1. Изменение номера порта при этом не производится. Если же вы используете нестандартный порт, то правило будет выглядеть несколько иначе:
При выполнении проброса портов обязательным критерием должен быть указан входящий интерфейс (как в правиле выше) или адрес этого интерфейса, в противном случае преобразованию будут подвергаться все пакеты, в том числе и проходящие из внутренней сети наружу. При использовании адресов вместо интерфейсов правило будет иметь следующий вид:
А теперь давайте попробуем разобраться как оно вообще работает. Некий узел XXX.XXX.XXX.XXX отправляет пакет на внешний адрес нашего роутера 198.51.100.1, адресом источника будет являться адрес узла, адресом назначения - внешний адрес роутера. Получив такой пакет брандмауэр находит нужное правило и изменяет адрес назначения пакета на внутренний адрес целевого узла, т.е. на 192.168.100.1 и отправляет его в локальную сеть.
Узел назначения видит, что ему пришел пакет от удаленного узла XXX.XXX.XXX.XXX и он формирует ответный пакет с этим адресом в качестве назначения, а в качестве источника подставляет собственный адрес. Так как удаленный узел не принадлежит локальной сети данный пакет будет направлен основному шлюзу, т.е. назад нашему роутеру. А так как на шлюзе в любом случае включен либо SNAT, либо MASQUERADE, то локальный адрес источника будет заменен адресом внешнего интерфейса и такой пакет будет отправлен назад удаленному узлу.
Наблюдательный читатель сделает здесь два вывода. Первый - DNAT не использует таблицу трансляций, второй - уже имеющийся на роутере SNAT или MASQUERADE автоматически выполняет обратное преобразование. Таким образом удаленный узел общается только с внешним адресом роутера и не имеет ни малейшего представления о сети за ним, а локальный узел продолжает считать, что работает с удаленным узлом напрямую, все необходимые трансляции NAT делает прозрачно и на лету.
Частным случаем DNAT является REDIRECT, это действие позволяет перенаправлять пакеты на другой порт текущего узла. Это удобно при прозрачном проксировании, либо перенаправлении трафика. Например, перехватим все DNS-запросы и направим их локальному DNS-серверу, развернутому на этом же узле:
Где 192.168.100.2 - внутренний адрес нашего роутера, остальные критерии мы сознательно не будем комментировать, если вы внимательно изучили предыдущие статьи цикла, то должны без труда прочитать условие.
Мы же перейдем к не менее интересной теме последующего движения пакетов. Давайте еще раз внимательно изучим схему выше. Действие DNAT в цепочке PREROUTING выполняется до решения о маршрутизации, а, следовательно, пакеты могут претерпевать "чудесные превращения". Непонимание этого момента приводит ко многим грубым ошибкам в настройке брандмауэра и неработоспособным конфигурациям.
Допустим у нас с внешнего адреса 198.51.100.1 и порта 3390 сделан проброс на внутренний адрес 192.168.100.1 и порт 3389, но нормально закрытый брандмауэр блокирует подключения. Что нам нужно сделать? Правильно, открыть порт. Если долго не думать, то вырисовывается такой набор правил:
На первый взгляд все правильно: мы "открыли" порт 3390 для внешних подключений, а затем перенаправили соединения с него на внутренний узел. Однако это грубая ошибка. Почему? Давайте разбираться.
И снова схема движения пакетов! Так, что мы видим? А видим мы то, что пакет первым делом попадает в цепочку PREROUTING таблицы nat и именно здесь у него будут изменены адрес и порт назначения. После чего пакет из локального, предназначенного данному узлу, превратится в транзитный и вместо цепочки INPUT таблицы filter пойдет в цепочку FORWARD и приведенное выше правило никогда не сработает.
А как будет правильно?
Обратите внимание, что вместе с локальным адресом в качестве критерия мы используем именно локальный порт - 3389, а не проброшенный 3390, так как DNAT изменит как адрес назначения, так и порт.
Аналогично, действие REDIRECT превращает транзитные пакеты в локальные и при возникновении такой необходимости фильтровать мы их должны уже не в цепочке FORWARD, а в INPUT.
Коротко отдельно коснемся цепочки OUTPUT, вопреки распространенному мнению, это вход в брандмауэр, а не выход. Сюда поступают исходящие пакеты от локальных служб узла и последовательно проходят таблицы mangle - nat -filter. Поэтому если вы фильтруете исходящий трафик после преобразования сетевых адресов, то следует учитывать уже новые адреса и порты назначения. Единственное, что не меняется - это статус пакета, он остается локальным и не при каких обстоятельствах не попадет в цепочку FORWARD, даже если после всех преобразований сетевых адресов он попадает под критерии транзитного.
В данной статье мы рассмотрели только базовые возможности таблицы nat в самых простых конфигурациях, но именно прочное усвоение базовых принципов позволяет успешно изучать более сложные схемы, которых мы обязательно коснемся в наших будущих публикациях.
Действие dnat для правила фильтра сетевых пакетов iptables
Основная задача файрвола (межсетевого экрана) фильтрация и обработка пакетов, проходящих через сеть. При анализе входного пакета файрвол принимает решение о судьбе этого пакета: выбросить пакет (DROP), принять пакет (ACCEPT) или сделать с ним еще что-то.
В Linux файрвол является модулем ядра, называемым netfilter и представляет собой набор хуков (hooks) для работы с сетевым стеком. Интерфейсом для модификации правил, по которым файрвол обрабатывает пакеты, служит утилита iptables для IPv4 и утилита ip6tables для IPv6.
Всю работу по фильтрации трафика выполняет ядро системы. Iptables не является демоном и не создает новых процессов в системе. Включение или выключение iptables это всего лишь отправка сигнала в ядро. Большая скорость фильтрации достигается за счёт анализа только заголовков пакетов.
К основным возможностям iptables относиться:
- фильтрация трафика на основе адресов отправителя и получателя пакетов, номеров портов;
- перенаправление пакетов по определенным параметрам;
- организация доступа в сеть (SNAT);
- проброс портов из глобальной сети в локальную (DNAT);
- ограничение числа подключений;
- установление квот трафика;
- выполнение правил по расписанию;
Процесс работы iptables
В iptables используется три вида таблиц:
- mangle – используется для внесения изменений в заголовок пакета;
- nat – используется для трансляции сетевых адресов;
- filter – для фильтрации трафика;
Таблица mangle
Основное назначение таблицы mangle - внесение изменений в заголовок пакета. В этой таблице могут производиться следующие действия:
- установка бита Type Of Service;
- установка поля Time To Live;
- установка метки на пакет, которая может быть проверена в других правилах;
Цепочки в таблице mangle:
- PREROUTING — используется для внесения изменений в пакеты на входе в iptables, перед принятием решения о маршрутизации;
- POSTROUTING — используется для внесения изменений в пакеты на выходе из iptables, после принятия решения о маршрутизации;
- INPUT — используется для внесения изменений в пакеты, перед тем как они будут переданы локальному приложению;
- OUTPUT — используется для внесения изменений в пакеты, поступающие от приложения внутри iptables;
- FORWARD — используется для внесения изменений в транзитные пакеты;
Таблица nat
Таблица используется для преобразования сетевых адресов (Network Address Translation) и когда встречается пакет, устанавливающий новое соединение. В этой таблице могут производиться следующие действия:
- DNAT (Destination Network Address Translation) – преобразование адреса назначения в заголовке пакета;
- SNAT (Source Network Address Translation) – изменение исходного адреса пакета;
- MASQUERADE – используется в тех же целях, что и SNAT, но позволяет работать с динамическими IP-адресами;
Цепочки в этой таблице:
- PREROUTING – используется для внесения изменений в пакеты на входе в iptables;
- OUTPUT – используется для преобразования адресов в пакетах, перед дальнейшей маршрутизацией;
- POSTROUTING – используется для преобразования пакетов, перед отправкой их в сеть;
Таблица filter
Таблица используется для фильтрации пакетов. В этой таблице есть три цепочки:
- INPUT – цепочка для входящих пакетов;
- FORWARD – цепочка для пересылаемых (транзитных) пакетов;
- OUTPUT – цепочка для исходящих пакетов;
Пакет, проходящий через эти цепочки, может подвергаться действиям: ACCEPT, DROP, REJECT, LOG.
Подытожим, прибывший пакет проходит по цепочке правил. Каждое правило содержит условие и цель (действие). Если пакет удовлетворяет условию то он передается на цель, в противном случае к пакету применяется следующее правило в цепочке. Если пакет не удовлетворил ни одному из условий в цепочке, то к нему применяется действие по умолчанию.
Цепочка | Таблица | ||
---|---|---|---|
filter | nat | mangle | |
INPUT | + | + | |
FORWARD | + | + | |
OUTPUT | + | + | + |
PREROUTING | + | + | |
POSTROUTING | + | + |
Утилита iptables
Восстановление правил из файла
Каждое правило в iptables — это отдельная строка, сформированная по определенным правилам и содержащая критерии и действия. В общем виде правило имеет такой формат:
- t table — задает имя таблицы, для которой будет создано правило;
- command — команда, которая определяет действие iptables — добавить правило, удалить правило и т. д.;
- match — задает критерии проверки, по которым определяется, попадает ли пакет под действие правила или нет;
- target/jump — какое действие должно быть выполнено при выполнении критерия;
- -A - добавление правила в цепочку, правило будет добавлено в конец цепочки;
- -D - удаление правила из цепочки;
- -R - заменить одно правило другим;
- -I - вставить новое правило в цепочку;
- -L - вывод списка правил в заданной цепочке;
- -F - сброс всех правил в заданной цепочке;
- -Z - обнуление всех счетчиков в заданной цепочке;
- -N - создание новой цепочки с заданным именем;
- -X - удаление цепочки;
- -P - задает политику по умолчанию для цепочки;
- -E - переименование пользовательской цепочки;
Примеры команд iptables
Пакеты можно фильтровать по таким параметрам:
Источник пакета
Для фильтрации по источнику используется опция -s . Например запретим все входящие пакеты с узла 192.168.1.95:
Можно использовать доменное имя для указания адреса хоста:
Также можно указать целую под сеть:
Также вы можете использовать отрицание (знак !). Например, все пакеты с хостов отличных от 192.168.1.96 будут уничтожаться:
Разрешаем хождение трафика по localhost:
Логируем попытки спуфинга с префиксом "IP_SPOOF A: " и дропаем соединение
Адрес назначения
Для этого нужно использовать опцию -d . Например запретим все исходящие пакеты на хост 192.168.1.95:
Запретить доступ к ресурсу
Как и в случае с источником пакета можно использовать адреса под сети и доменные имена. Отрицание также работает.
Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp или номер протокола (из /etc/protocols).
Разрешаем входящие эхо-запросы
Порт источника
Разрешаем все исходящие пакеты с порта 80:
Заблокировать все входящие запросы порта 80:
Для указания порта необходимо указать протокол (tcp или udp). Можно использовать отрицание.
Открыть диапазон портов
Порт назначения
Разрешить подключения по SSH
Разрешаем получать данные от DHCP-сервера
Разрешаем rsync с определенной сети
Разрешаем IMAP/IMAP2 трафик
Разрешаем mysql для локальных пользователей
Разрешить CUPS (сервер печати, порт 631) для пользователей внутри локальной сети
Разрешить синхронизацию времени NTP для пользователей внутри локальной сети
Разрешить исходящий Google Talk
Port Forwarding
Для примера направим трафик с порта 442 на 22, это значит что входящие ssh-соединения могут быть принятыми с порта 422 и 22.
Также надо разрешить входящие соединения с порта 422
Как и в случае с портом источника нужно указать протокол. Можно использовать отрицание.
Действия над пакетами
Для указания действия (цели) с пакетом служит опция -j . Основные действия:
Разница между DROP и REJECT (источник) DROP – просто закрывает соединение и не отправляет ничего в ответ отправителю. Как итог имеем "мертвое"" соединение, которое потом убивается по таймауту. Но зато при сканировании закрытых портов, они будут помечаться как filtered, что потенциально говорит, что что-то всё-таки слушает порт. И так, что же всё-таки использовать? На мой взгляд, лучше DROP, так как при больших атаках, вы просто перекроете себе кислород, отвечая всем «host is unreachable«. Этот ответ будет потреблять больше ресурсов, нежели мёртвое соединение (при желаении время таймаута можно сократить).В качестве действия можно указать и имя пользовательской цепочки. Например перекинем все пакеты с локальной сети в цепочку, где будет производиться дополнительная проверка:
Пример базового набора правил
В большинстве случаев конечному пользователю (рабочая станция) достаточно выполнить такую последовательность команд:
В iptables есть возможность подключать модули, для этого используется опция -m .
Модуль limit предназначен для ограничения нагрузки, например:
Разрешаем поддерживать открытыми уже установленные соединения
Другие правила
Список текущих правил
- L - показать список правил;
- v - отображать дополнительную информацию; * n - отображать ip адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение);
- -line-numbers - вывод номеров строк;
Очистка всех правил
Очистка правил в цепочке
Удаления пятого правила в цепочке INPUT:
Удалить правило, в котором адрес источника (192.168.1.15)
Защита от DDoS с помощью iptables
DoS-атаки (атаки отказ в обслуживании) - это вид злонамеренной деятельности, основная задача которой вывести компьютерную систему из рабочего состояния и правильного выполнения возложенных на нее функций. Т.е. довести до состояния "зациклевания", что грозит простоями, потерей посетителей/клиентов и убытками. DoS-атаки подразделяются на два вида итсочник:
Сбор информации о сетевых соединениях
Просмотр открытых соединений
Количество подключений к 80 порту
TCP-дамп подключений (на какой домен чаще всего идут запросы)
SYN-флуд можно проверить через подсчет числа полуоткрытых TCP-соединений
Защита от разных видов флуда.
Или с помощью iptabels:
SYN-флуд. Один из распространенных способов не только забить канал связи, но и ввести сетевой стек операционной системы в такое состояние, когда он уже не сможет принимать новые запросы на подключение. Основан на попытке инициализации большого числа одновременных TCP-соединений через посылку SYN-пакета с несуществующим обратным адресом. После нескольких попыток отослать ответный ACK-пакет на недоступный адрес большинство ОС ставят неустановленное соединение в очередь. И только после n-ой попытки закрывают соединение. Так как поток ACK-пакетов очень велик, вскоре очередь оказывается заполненной, и ядро дает отказ на попытки открыть новое соединение. Наиболее умные DoS-боты еще и анализируют систему перед началом атаки, чтобы слать запросы только на открытые жизненно важные порты. Идентифицировать такую атаку просто: достаточно попробовать подключиться к одному из сервисов.
Оборонительные мероприятия обычно включают в себя:
Увеличение очереди "полуоткрытых" TCP-соединений:
Уменьшение времени удержания "полуоткрытых" соединений:
Ограничение максимального числа "полуоткрытых" соединений с одного IP к конкретному порту:
UDP-флуд. Типичный метод захламления полосы пропускания. Основан на бесконечной посылке UDP-пакетов на порты различных UDP-сервисов. Легко устраняется за счет отрезания таких сервисов от внешнего мира и установки лимита на количество соединений в единицу времени к DNS-серверу на стороне шлюза:
Определившись с IP виновника начинаем дропать по IP-адресам
Или сразу по подсетям:
Для ограничения количества одновременных подключений к серверу для клиента по IP используется модуль connlimit. Ограничим количество параллельных подключений по SSH до трех, для одного клиента
- --connlimit-above 10 - условие для проверки одновременных подключенийне более 10;
- --connlimit-mask 24 - группировка хостов по длине префикса (для IPv4 это число должно быть 0 и 32;
Также ограничить количество подключений в единицу времени можно с помощью модуля limit.
Как сохранять ip клиента, используя DNAT и SNAT в iptables?
Я хочу сделать так, чтобы при подключении на хост1, он (хост1) перенаправлял соединение на хост2. Ответ от хост2 должен отправляться на хост1, а хост1 уже отправлял ответ клиенту.
Схематично это выглядит так:
клиент->хост1->хост2
хост2->хост1->клиент
У меня получилось этого добиться такими правилами на хост1:
Но есть одна проблема: Когда соединение устанавливается, приложение на хост2 думает, что айпи клиента - это хост1. А я хочу, чтобы айпи клиента сохранялось на хост2. Но при этом, чтобы хост2 отвечал не напрямую клиенту, а через хост1.
Совет поднять прокси сервер вместо использования DNAT мне не подходит, потому что я все это делаю для защиты от DDOS уровня L4-L7. Я хочу все сомнительные соединения напрявлять на хост2, который мне не так важен. Но если использовать прокси сервер, то это не имеет смысла, т.к. пакеты попадут на сокет прокси на хост1. А я как раз хочу избежать попадание пакетов на сокет на хост1.
Буду рад любым ответам. Я понимаю, что я могу вообще сейчас делать фигню, по этому прошу не оскорблять, а указать на ошибку.
IPtables DNAT-перенаправление (проксирование)
Ничего не вышло. Обунилил правила iptables. Попробовал так: Без результатов.27.04.16 00:09:23
Правила корректные. Счетчики netfilter пакеты считают?
ValdikSS ★★★★★ ( 27.04.16 00:59:44 )iptables -t filter -I FORWARD -s IP2 -p tcp --sport 25565 -j ACCEPT
Если по умолчанию стоит ACCEPT в FORWARD, то вообще эту строчку не надо.
А прописан ли 1-й сервер у 2-го как роутер? Если не прописан, то попробуй так:
iptables -t nat -I PREROUTING -d IP1 -p tcp --dport 25565 -j DNAT --to-destination IP2:25565
iptables -t nat -I POSTROUTING -d IP2 -p tcp --dport 25565 -j SNAT --to-source
slamd64 ★★★★★ ( 27.04.16 07:55:05 )Последнее исправление: slamd64 27.04.16 07:55:15 (всего исправлений: 1) Nurmukh ★★★ ( 27.04.16 09:16:39 )
вы че ваще не догоняете чо такое нат, это подмена адреса в пакете чтобы шлюзом сочлинить локалки с инетом, жесть воще перекидывать с внешнего на внешний ип натом - это анекдот.
ssh-туннель тебе нужен
axelroot ★ ( 27.04.16 12:41:31 ) Ответ на: комментарий от axelroot 27.04.16 12:41:31перекидывать с внешнего на внешний ип натом
Очень. Очень. Очень полезная возможность.
slamd64 ★★★★★ ( 27.04.16 16:32:09 ) Ответ на: комментарий от slamd64 27.04.16 16:32:09никаких мостов внешний-внешний
axelroot ★ ( 27.04.16 16:50:39 ) Ответ на: комментарий от axelroot 27.04.16 16:50:39Вот, например. хммм. недоступен некий сайт(IP1) из твоей локации по какой-то причине. Но из другой локации этот сайт вполне открывается. Регистрируем в этой другой локации VPSку(IP2) за 5 баксов в месяц, а на ней пишем:
iptables -t nat -I PREROUTING -d IP2 -p tcp --dport 80 -j DNAT --to-destination IP1:80
iptables -t nat -I POSTROUTING -d IP1 -p tcp --dport 80 -j SNAT --to-source IP2
А если IP2 ещё и у себя в hosts прописать, то ваще красота - открываться будет по доменному имени. :)
slamd64 ★★★★★ ( 27.04.16 18:09:12 ) Ответ на: комментарий от slamd64 27.04.16 18:09:12полный бред, причем здесь виртуалки локации, в описанном случае прокси нужен а не нат.
axelroot ★ ( 28.04.16 11:59:23 ) Ответ на: комментарий от axelroot 28.04.16 11:59:23Да делай что хочешь, кто ж тебе мешает. Гвозди можно и микроскопом забивать. Чем бы дитё не тешилось - главное, чтобы руки помыло до и после.
iptables DNAT!
Никак не пойму как реализовать DNAT в iptables. Вот полностью открыл все что можно:
iptables -P FORWARD ACCEPT iptables -A FORWARD -i $INET_IFACE -j ACCEPT iptables -A FORWARD -i $LAN_IFACE -j ACCEPT
iptables -t nat -A PREROUTING -d $INET_IP -p tcp --dport 80 \ -j DNAT --to-destination 192.168.1.2:80
Конекчусь на $INET_IP:80. А пакеты все равно на 192.168.1.2:80 не переадресуются. В чем проблема никак не поуму. Даже лог делал PREROUTING выполняется, а если делать лог FORWARD то туда ничего не приходит.
anonymous15.11.06 11:19:42
Привет. Непонятно почему после -P . ACCEPT, стоит еще куча -j ACCEPT. Здесь, вроде, все верно. Что говорит iptables-save и route?
Настройка NAT, DNAT в Linux с помощью iptables
Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.
Как это выглядит
И так что же мы имеем:
сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
имеющийся по умолчанию в Debian Lenny firewall — netfilter/iptables
локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (232), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT — он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.
Теперь, когда мы знаем что такое NAT и для чего он нужен, можно приступать непосредственно к настройке сервера.
транзитный трафик
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети — я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И хотя сейчас все работает, у всех есть интернет и все работает, некоторым всё же нужен прокси сервер. Я не буду рассказывать о настройке squid, я покажу правило которое позволит сделать его «прозрачным». В сквид надо лишь прописать волшебное слово transparent в нужном месте и он начнём корректно обрабатывать свалившееся на него запросы.
Пишем
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.
Итого
Как мы видим все действительно просто! Главное это понять принцип функционирования сети и не боятся настраивать и читать большие мануалы.
Надеюсь мне удалось собрать воедино информацию достаточную для начала вашей дружбы с программными маршрутизаторами на основе Linux.
Основы iptables на примере Debian глазами младенца
Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.
Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.
Поехали, потихонечку.
- сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
- имеющийся по умолчанию в Debian Lenny firewall — netfilter/iptables
- локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (2 32 ), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT — он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.
Теперь, когда мы знаем что такое NAT и для чего он нужен, можно приступать непосредственно к настройке сервера.
транзитный трафик
настраиваем iptables
по мелочам.
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети — я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто — надо всего лишь добавить DNAT правило в наш iptables.
Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) — сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP
Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.
Основы iptables на примере Debian глазами младенца
Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.
Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.
Поехали, потихонечку.
- сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
- имеющийся по умолчанию в Debian Lenny firewall — netfilter/iptables
- локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (2 32 ), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT — он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.
Теперь, когда мы знаем что такое NAT и для чего он нужен, можно приступать непосредственно к настройке сервера.
транзитный трафик
настраиваем iptables
по мелочам.
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети — я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто — надо всего лишь добавить DNAT правило в наш iptables.
Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) — сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP
Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.
Читайте также: