Iptables masquerade nat: Настройка iptables, разбираемся вместе. | LinuxBlog.РФ

Содержание

Настройка iptables, разбираемся вместе. | LinuxBlog.РФ

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

 

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

Что бы правильно составлять правила брандмауэра нужно понимать как вообще идут пакеты и что с ними происходит.

Порядок движения транзитных пакетов

Шаг Таблица Цепочка Примечание
1 Сетевой интерфейс (например, eth0)
2 mangle
PREROUTING
Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
3 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке.
4 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет — локальному приложению или на другой узел сети.
5 mangle
FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle.
6 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
7 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Здесь же выполняется и маскарадинг (Masquerading).
9 Выходной сетевой интерфейс (например, eth2).

 

Для локального приложения(входящие пакеты)

Шаг Таблица Цепочка Примечание
1 Входной сетевой интерфейс (например, eth0)
2 mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
3 nat PREROUTING Преобразование адресов (Destination Network Address Translation).
4 Принятие решения о маршрутизации.
5
mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь вносятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
6 filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
7 Локальный процесс/приложение (т.е., программа-сервер или программа-клиент)

 

От локальных процессов(исходящие пакеты)

Шаг Таблица Цепочка Примечание
1 Локальный процесс (т.е., программа-сервер или программа-клиент).
2 Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше — на какой адрес, через какой сетевой интерфейс и пр.
3 mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия.
4 nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
5 Filter OUTPUT Здесь фильтруется исходящий траффик.
6 mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
7 nat POSTROUTING Здесь выполняется Source Network Address Translation. Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP.
8 Сетевой интерфейс (например, eth0)

 

Как мы поняли есть основные три таблицы :

  • mangle — Данная таблица предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов (поля TTL и TOS).
  • filter — основная таблица для фильтрации пакетов, используется по умолчанию. Собственно в этой таблице и происходит фильтрация пакетов.
  • nat — обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора. Здесь задаются правила для маршрутизации.

Для  таблицы nat применимы действия:

Действие DNAT (Destination Network Address Translation) производит преобразование адресов назначения в заголовках пакетов. Другими словами, этим действием производится перенаправление пакетов на другие адреса, отличные от указанных в заголовках пакетов.

SNAT (Source Network Address Translation) используется для изменения исходных адресов пакетов. С помощью этого действия разделить единственный внешний IP адрес между компьютерами локальной сети для выхода в Интернет. В этом случае брандмауэр, с помощью SNAT, автоматически производит прямое и обратное преобразование адресов, тем самым давая возможность выполнять подключение к серверам в Интернете с компьютеров в локальной сети.

Маскировка (MASQUERADE) применяется в тех же целях, что и SNAT, но в отличие от последней, MASQUERADE дает более сильную нагрузку на систему. Происходит это потому, что каждый раз, когда требуется выполнение этого действия — производится запрос IP адреса для указанного в действии сетевого интерфейса, в то время как для SNAT IP адрес указывается непосредственно. Однако, благодаря такому отличию,

MASQUERADE может работать в случаях с динамическим IP адресом, т.е. когда вы подключаетесь к Интернет, скажем через PPP, SLIP или DHCP.

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE 

Выполнить MASQUERADE для всех пакетов идущих из сети 10.8.0.0  на интерфейс eth0. Для понятности , допустим у нас две сетевые карточки и две сети. Нам надо что бы сеть 10.8.0.0/24(первая сетевая карточка) могла выйти скажем в интернет через eth0(вторая сетевая карточка)

  • raw — Предназначена для выполнения действий с пакетами до их обработки системой.

Собственно таблица по умолчанию filter.

Далее мы должны задать какой именно тип пакет будем фильтровать.

  • INPUT — обрабатывает трафик, поступающий непосредственно самому хосту.
  • FORWARD — позволяет фильтровать транзитный трафик.
  • OUTPUT —  позволяет фильтровать трафик, исходящий от самого хоста.

Действие с пакетом.

  • ACCEPT — пропуск пакета. Пакет покидает текущую базовую цепочку и следует дальше.
  • REJECT — заблокировать пакет и сообщить его источнику об отказе.
  • DROP — заблокировать пакет, не сообщая источнику об отказе. Более предпочтительна при фильтрации трафика на интерфейсах, подключенных к интернету, так как понижает информативность сканирования портов хоста злоумышленниками.
  • LOG — сделать запись о пакете в лог файл.

Получается у нас цепочка [таблица — filter] — [ трафик — INPUT ] — [действие — DROP] логика действий только кажется сложной. Думаю мы с вами на примерах разберемся и станет все просто.

Команд iptables:
  • -A  добавить правило в конец цепочки.
  • -D  удалить правило.
  • -I   вставить правило с нужным номером.
  • -L  вывести все правила в текущей цепочке.
  • -S  вывести все правила.
  • -F  очистить все правила.
  • -N создать цепочку.
  • -X  удалить цепочку.
  • -P  установить действие по умолчанию.

Начнем разбираться на конкретных примерах.

iptables -A INPUT -p tcp —dport 80 -j ACCEPT

-A добавить новое правило , INPUT для входящих пакетов, -p протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp,
mh,  — — dport порт назначения 80(опция только для протокола), -j выбрать действие, если правило подошло, ACCEPT разрешить. То есть разрешить входящий трафик по протоколу tcp на порт 80.

Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например:

iptables -A INPUT -s ! 192.168.0.50 -j DROP

-s адрес источника — имя хоста(www.help.com), IP-адрес или подсеть в нотации CIDR(192.168.0.1/16) , ! инверсия , DROP запретить. Запретить весь входящий трафик , кроме источника 192.168.0.50 ( если бы не было ! , то запретить только с 192.168.0.50)

iptables -A INPUT -s  192.168.0.50 -j DROP

Запретить входящий трафик с ip — 192.168.0.50.

Список критериев  правил:

  • -p  Протокол,  протокол также можно указать с помощью номера или названия согласно перечислению, приведенному в /etc/protocols. Значение «любой протокол» можно указать с помощью слова all или числа 0.  Так же для протокола есть дополнительные параметры: —sport(—source-port) Позволяет указать исходящий порт (или их диапазон). —dport(—destination-port) Позволяет указать порт назначения (или их диапазон).
  • -s  Определяет адрес отправителя. В качестве адреса может выступать IP-адрес (возможно с маской),  доменное имя (в последних двух случаях перед добавлением правила в цепочку имя резольвится в IP-адрес).
  • -i  Определяет входящий сетевой интерфейс. Если указанное имя интерфейса заканчивается знаком «+» (например, eth+), то критерию соответствуют все интерфейсы, чьи названия начинаются на указанное имя(etho,eth2).
  • -d  Определяет адрес получателя. Синтаксис аналогичен -s.
  • -o  Определяет исходящий сетевой интерфейс. Синтаксис аналогичен -i.

Так же критерия можно комбинировать.

iptables -A INPUT -i eth0 -s 192.168.0.0 -j DROP

Запретить входящие пакеты с интерфейса   eth0  и ip 192.168.0.0. А на интерфейс eth2 пакеты пройдут.

А что делать если вы за ранние не знаете какой порт открывать, например хотите что бы FTP сервер работал в пассивном режиме. Модуль conntrack о состоянии соединения поможет, а конкретней критерий — ctstate.  Модуль подключается тэгом -m.

iptables -A INPUT -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -m conntrack —ctstate NEW -p tcp —dport 21 -j ACCEPT # Разрешаем открывать соединения на 21 TCP-порт.

Возможные состояния:

  • NEW — соединение не открыто, то есть пакет является первым в соединении.
  • ESTABLISHED — пакет относится к уже установленному соединению. Обычно такие пакеты принимаются без дополнительной фильтрации, как и в случае с RELATED.
  • RELATED — пакет открывает новое соединение, логически связанное с уже установленными, например, открытие канала данных в пассивном режиме FTP. Соединение получает статус RELATED если оно связано с другим соединением, имеющим признак ESTABLISHED.
  • INVALID — Признак INVALID говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса.

iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

State идеологический предшественник  conntrack, имеет единственный параметр —state, аналогичный параметру —ctstate модуля conntrack (но, в отличие от него, не поддерживающий состояния DNAT и SNAT).

Кратко рассмотрим таблицу таксировщика, которую можно найти в файле /proc/net/ip_conntrack. Здесь содержится список всех активных соединений.

tcp 6 300 ESTABLISHED src=128.*.*.* dst=194.*.*.* sport=52524 dport=2223 src=194.*.*.* dst=128.*.*.* sport=2223 dport=52524 [ASSURED] mark=0 use=2

Первое как понятно это протокол, потом десятичное число(что значит не знаю),потом идет время жизни соединения. Далее состояние ESTABLISHED то есть соединение уже установлено, бывает еще UNREPLIED что значит что ответного трафика еще не было. Далее расположены адреса отправителя и получателя, порт отправителя и получателя. Далее все наоборот соответственно, ASSURED этот флаг сообщает о том, что соединение установлено уверенно и эта запись не будет стерта по достижении максимально возможного количества трассируемых соединений.

Некоторые особенности протоколов .

TCP соединение всегда устанавливается передачей трех пакетов, которые инициализируют и устанавливают соединение, через которое в дальнейшем будут передаваться данные. Сессия начинается с передачи SYN пакета, в ответ на который передается SYN/ACK пакет и подтверждает установление соединения пакет ACK.

Как только трассировщик увидел первый (SYN) пакет, то присваивает ему статус NEW. Как только через трассировщика проходит второй пакет (SYN/ACK), то соединению присваивается статус ESTABLISHED.

С протоколом UDP немного все по другому этот протокол не предусматривает установления и закрытия соединения, но самый большой недостаток — отсутствие информации об очередности поступления пакетов. Но с точки зрения трасировщика все так же как с TCP. Первому пришедшему пакету присваивает ему статус NEW. Как только вы отправляете ответный пакет присваивается статус ESTABLISHED. Единственное отличия что статут ASSURED присваиваться только когда обменялись уже несколькими пакетами.

Логирование применений правил.

iptables дает возможность вести логи отдельных пакетов и событий. Для этого применяется действие LOG.

iptables -A INPUT -p tcp  —syn -j LOG —log-level info —log-prefix «INPUT packets «

—log-level Используется для задания уровня журналирования (log level). Полный список уровней вы найдете в руководстве (man) по syslog.conf. Обычно, можно задать следующие уровни: debug, info, notice, warning, warn, err, error, crit, alert, emerg и panic. Логи пишутся в файл syslog.

—log-prefix Ключ задает текст (префикс), которым будут предварять все сообщения iptables. Сообщения со специфичным префиксом затем легко можно найти, к примеру, с помощью grep. Префикс может содержать до 29 символов, включая и пробелы.

Jun 1 17:12:20 debian kernel: [605663.391139] INPUT packets IN=eth0 OUT= MAC=02:1e:6d:00:e2:1c:00:01:e8:11:73:69:08:00 SRC=125.94.12.95 DST=194.87.239.104 LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=38690 PROTO=TCP SPT=12557 DPT=23 WINDOW=1460$ RES=0x00 SYN URGP=0
Популярные команды управления iptables.

iptables -L -n —line-numbers  Посмотреть список правил.

-n номер портов и ip в цифровом варианте.

—line-numbers номер строки.

iptables -F  Полностью  сбросить правила.

iptables -P INPUT ACCEPT     Правила по умолчанию для  таблицы INPUT .
iptables -P OUTPUT ACCEPT Правила по умолчанию для  таблицы OUTPUT.
iptables -P FORWARD DROP Правила по умолчанию для  таблицы FORWARD.

iptables -D INPUT 1 Удаление правила по его номеру в цепочке.

iptables -D INPUT -s 123.45.67.89 -j DROP Удаление правила на основе того, что оно делает.

iptables -I INPUT … Вставка (insert) правила в начало цепочки.

iptables -I INPUT 3 … Или можно указать конкретную позицию.

REDIRECT

Действие REDIRECT предназначено для перенаправления пакетов с одного набора портов на другой внутри одной системы, не выходя за пределы хоста.
Работает REDIRECT только в цепочках PREROUTING и OUTPUT таблицы nat. Таким образом, область применения сводится только к перенаправлению . Чаще всего это используется для прозрачного прокси, когда клиент из локальной сети коннектится на 80 порт, а шлюз редиректит пакеты на локальный порт прокси:

iptables -t nat -A PREROUTING -p tcp —dport 80 -j REDIRECT —to-port 3128

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

iptables-save > /etc/iptables Сохранить текущий настройки в файл iptables.

iptables—restore > /etc/iptables Загрузить правила из файла.

Способ сохранять и загружать правила на ваше усмотрение. Мы с вами познакомились только с основами теории iptables, возможности настройки конечно гораздо больше. Более подробно о которых расскажем в другой статье.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Маскарадинг (masquerading) и трансляции ip-адресов (NAT)

Автор оригинала Иван Н. Песин. Но так как статья морально устарела, то она будет взята лишь за основу. (Претензии автора принимаются).


Маскарадинг (masquerading) и трансляции ip-адресов (NAT)

Проблема маскарада (masquerading) и трансляции ip-адресов в Линуксе.

Что это такое,что там можно и что нельзя.

Каждому Linux админу рано или поздно приходится сталкиваться с проблемой маскарада (masquerading) и трансляции ip-адресов на Линуксе (кроме тех у кого есть куча реальных адресов и они раздают их всем компам в локальной сети :-)). Если у Вас есть локальная сеть, подключенная к сети Интернет через linux сервер, то без маскарада не обойтись.

Начнем, пожалуй, с определений.

  • Маскарад (masquerade) и трансляция адресов (NAT) в мире Linux не являются синонимами.
  • Маскарад — замена адреса на адрес машины, выполняющей маскарад.
  • Трансляция адресов — замена адреса на любой указанный.

Если вы используете ОС Linux с ядром 2.0 или 2.2, Вам нужно будет опустить глаза
вниз — в конце этой статьи находится авторское описание настроек ipfwadm и ipchains.
Я же опишу настройку NAT, masquerading для ОС Linux с ядром 2.4- 2.6, где используются
iptables. Для чего это вообще нужно? Вы имеете сеть с адресами:

10.0.0.0-10.255.255.255 — сеть класса А
172.16.0.0 — 172.31.255.255 — сеть класса B
192.168.0.0-192.168.255.255 — сеть класса С

Эти сети зарезервированы для использования в локальных сетях (intranet) и в сети
Интернет не используются. Допустим ваш компьютер в локальной сети с ip 192.168.0.2
получает доступ к Интернет через сервер с внутренним ip адресом 192.168.0.1 (eth2)
и внешним адресом 111.111.111.111 (eth0). Если пакет с вашего компьютера будет иметь
ваш адрес источника (192.168.0.2), то он просто не придет обратно, так как
удаленный хост не будет знать по какому маршруту отослать его обратно.
Для того, чтобы этого не случилось и придуманы NAT и masquerading.

Итак как работает маскарад.

Ваш пакет (например на www.ibm.com) проходит через сервер и в нем сервер меняет
адрес источника НА СВОЙ АДРЕС, через который как раз и раздается интернет в локальной
сети (111.111.111.111). Пакет приходит на www.ibm.com и хост отвечает по адресу
в пакете (111.111.111.111). Так как Ваш сервер запомнил, что пакет для www.ibm.com
посылали вы, то он принимает пакет и отдает его вашему компьютеру. Вот и все, пакет
ушел и вернулся.

Включается маскарад в iptables очень просто:

iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
из локальной сети 192.168.0.0/24)

iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
в локальную сеть 192.168.0.0/24)

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
(и последняя команда — ей вы включили маскарад для сети 192.168.0.0/24).

Еще вам нужно проверить чтобы был включен forward ip в вашем ядре. Сделать это
можно командой

cat /proc/sys/net/ipv4/ip_forward

если Вы получили 1 на выходе значит все в порядке, если 0, тогда вам нужно
включить ip forward командой

echo 1 >/proc/sys/net/ipv4/ip_forward

Как работает NAT ?

Ваш пакет (например на www.ibm.com) проходит через сервер и в нем адрес источника
меняется НА УКАЗАННЫЙ АДРЕС (мы же укажем адрес сервера 111.111.111.111, и тогда).
Пакет приходит на www.ibm.com и хост отвечает по адресу в пакете (111.111.111.111).
Пакет приходит на Ваш сервер и происходит обратная замена.

Включается NAT в iptables так:

iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
из локальной сети 192.168.0.0/24)

iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
в локальную сеть 192.168.0.0/24)

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT —to-source 111.111.111.111
(и последняя команда — ей вы включили трансляцию адресов сети 192.168.0.0/24
на адрес 111.111.111.111).

Еще вам нужно проверить чтобы был включен forward ip в вашем ядре. Сделать это
можно командой

cat /proc/sys/net/ipv4/ip_forward

если Вы получили 1 на выходе значит все в порядке, если 0, тогда вам нужно
включить ip forward командой

echo 1 >/proc/sys/net/ipv4/ip_forward

Вот собственно и все.

Дальше идет статья Ивана Песина

Решение проблемы маскарада, на ядрах разных версий отличается, и потому
мы разделим нашу повесть на две части, ядра версии от, если не ошибаюсь,
2.0.29 до 2.2.9ас, и от 2.2.10 до 2.4.0. Ядра версии 2.4.х я обсуждать не буду,
потому как там имеется вполне сносное описание. Итак,

Ядра версий 2.0.29 — 2.2.9

Для функции маскарада в этих версиях необходим пакет ipfwadm либо ipchains,
зависит от версии. Установив их можно приступать к осмысленным действиям.
Очень тривиальная задача решается следующим образом:

ipchains -A forward -i ethX -s 192.168.1.0/24 -j MASQ

результатом этой команды будет замена исходных адресов пакетов из сети
192.168.1.0 класса С, при маршрутизации их через интерфейс ethX, на адрес машины
на которой выполнены команды.

Перейдем теперь к более сложным случаям. Допустим, вам необходимо, в зависимости
от адреса источника/назначения маскарадить под разными адресами. Как же это выполнить?
Тут нам придется обратиться к нестандартным средствам.

Для начала посмотрим урл

http://www.suse.de/~mha/HyperNews/get/linux-ip-nat.html.

Хотя там написано не очень много, зато содержательно. После прочтения остается лишь
вытащить соответствующий архив с программой и патчем ядра. Пропатчив ядро, его надо
перекомпилировать (прочитать почитайки обязательно!) с соответствующими изменениями
в конфигурации. Устанавливаем скомпилированное ядро, при этом не забываем про «ядро
на всякий случай» (рабочее ядро, которое вы будете загружать, если новое ядро
не загрузится). После перезагрузки станет возможным использование команды ipnatadm.
Название говорит само за себя ;). Теперь легко можно изобразить команды вроде:

ipnatadm -O -i -b -S 192.168.1.1/24 -M 207.46.230.219
ipnatadm -O -i -b -S 192.168.1.2/24 -M 207.46.230.229

ну и так далее, думаю, разобраться можно. Есть еще полезная опция -W, позволяющая
задавать интерфейс. Да, не забудьте, что псевдонимы интерфейсов не понимаются ни
ipchains, ни ipfwadm, ни ipnatadm. Перейдем теперь к теме

Ядра версий 2.2.10 — 2.4.0

На этих версиях, к сожаленью, программа ipnatadm предательски перестает функционировать.
Почему предательски? Потому что удается пропатчить ядро, скомпилировать, загрузиться
и даже приконнектиться с помощью telnet, например. Но при попытке выполнить, допустим,
даже вышеописанные команды, интерфейс подвисает. Ну что ж, значит нужно искать другие
ходы.

Внимательно прочитав информацию, размещенную на сайте с ipnatadm, можно обнаружить
любопытный факт. А именно то, что один наш земляк Алексей Кузнецов, пишет часть ядра,
которая, в том числе, ведает маршрутизацией и маскарадом. Из этого прямо следует,
что функциональность этого кода огромна, а документация — м-да, хромает, мягко
выражаясь. Сам Кузнецов советует разбирать исходники ядра — для тех, кто сможет,
захочет, имеет время, и т.д. и т.п.

Ну а я попробую, насколько это возможно, сжато рассмотреть стандартный и нестандартные
методы маскарада, и NAT. Стандартный случай: необходимо маскарадить исходящие пакеты
хоста 192.168.1.1 в 207.46.230.219. Подход к решению этой задачи полностью аналогичен
случаю с более ранними ядрами. Необходимо лишь учесть, что в системах с этими ядрами
утилиты ipfwadm нет, вместо нее используется ipchains. Сразу перейдем к рассмотрению
более сложных случаев. Допустим, как и в предыдущем примере, пакеты с разных машин,
необходимо транслировать в разные адреса.

Тут придется прибегнуть к утилите ip из пакета iproute. Изобразим следующие команды:

ip rule add from 192.168.1.1 nat 207.46.230.219
ip rule add from 192.168.1.2 nat 207.46.230.229

кроме того:

ip route add nat 207.46.230.219 via 192.168.1.1
ip route add nat 207.46.230.229 via 192.168.1.2

Результатом этих действий будет маскарад и демаскарад адресов 192.168.1.1
и 192.168.1.2, соответственно в 207.46.230.219 и 229.

Вот такие пирожки. Это все теория и стандартные случаи, давайте рассмотрим более
интересный и совсем реальный пример. Имеется сеть на ~250 машин, линукс красная
шапочка версии 6.2, в роли маршрутизатора, и выполняющий маскарад внутренних машин
под адрес, допустим, 207.46.230.219. Линукс включен в машину провайдера витой парой,
из сетевой в сетевую. Кроме того, провайдер, естественно, не желает тратить отдельный
ip-адрес на сетевую в которую включен наш линукс.

Вопрос: как это реализовать на линуксе? Вообще-то весьма просто. Для начала объясним
линуксу, как посылать пакеты на машину провайдера. Она находиться не в одной
логической сети с нами, а потому изначально линукс не знает как туда попасть.
Для этого укажем:

route add -host 192.168.100.1 eth2

что означает: машина 192.168.100.1 подсоединена непосредственно к интерфейсу eth2.
Далее, укажем, что все пакеты, предназначенные для интернета отсылать через машину
провайдера:

route add default gw 192.168.100.1

и остается лишь прописать правила маскарада. Допустим, я хочу, что бы машины
с адресами 192.168.1.101-105 ходили в интернет, а другие нет:

ipchains -A forward -s 192.168.1.101 -j MASQ
ipchains -A forward -s 192.168.1.102 -j MASQ
ipchains -A forward -s 192.168.1.103 -j MASQ
ipchains -A forward -s 192.168.1.104 -j MASQ
ipchains -A forward -s 192.168.1.105 -j MASQ

ipchains -A forward -j REJECT -l

Ну вот, в общем, на сегодня и все.

Настройка iptables от простого к сложному. Часть 3.

Давайте посмотрим, как работать с тем, что называют iptables routing, или перенаправлением пакетов при помощи iptables.
В первой и второй частях мы рассматривали настройку iptables, касающуюся блокировки пакетов, а теперь посмотрим, как не блокировать их, а направлять туда, куда нам нужно.

Маскарадинг (или маскирование)

Маскарадинг — это метод обработки пакетов, при котором пакеты передаются через некоторую машину, работающую как шлюз. Эта машина при пересылке пакетов помечает их, чтобы знать, какой машине в сети вернуть полученный ответ. Таким образом, несколько машин из внутренней сети могут обращаться к внешней сети, а извне это будет выглядеть так, как будто обращения идут от той самой машины, являющейся шлюзом. Маскарадинг связан в первую очередь с NAT (Network Address Translation), пакеты при трансляции адресов маскируются, чтобы ответ вернулся именно к источнику запроса.
Например, у нас есть некоторая локальная сеть с адресами 192.168.0.0/24, в этой сети есть шлюз с адресом 192.168.0.1, имеющий два сетевых интерфейса, eth0 и eth2. eth0 — внешний, подключенный к провайдеру, например, с адресом 192.168.100.25, eth2 — внутренний, подключенный к локальной сети, тот самый, на котором адрес 192.168.0.1. Необходимо обеспечить работу всех клиентов из локальной сети в сети Интернет таким образом, чтобы это было для них прозрачно.
В таком случае в первую очередь необходимо включить форвардинг пакетов между сетевыми интерфейсами шлюза, чтобы пропускать трафик из внутренней сети наружу. Есть два варианта, как это можно сделать. Первый — раскомментировать в файле /etc/sysctl.conf строчку

net.ipv4.ip_forward=1

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

echo "1" >/proc/sys/net/ipv4/ip_forward

Этот способ заработает без перезагрузки. Можно использовать оба, а можно в скрипте, например, использовать при загрузке правил iptables только второй.
После этого мы можем задать правило для адресной трансляции:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d ! 192.168.0.0/24 -j MASQUERADE

Это правило после обработки пакетов осуществит маскирование, если пакеты из внутренней сети направлены куда-то в другую подсеть. Если нам нужно маскировать пакеты для конкретной подсети, к примеру, из одной локальной подсети (192.168.2.0/24) в другую (192.168.0.0/24), то мы можем создать следующее правило:

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 192.168.0.0/24 -j MASQUERADE

Перенаправление пакетов на другой порт

Перенаправление портов можно использовать для самых разных задач. Например, перенаправление пользователей из разных сетей на разные экземпляры веб-сервера, перенаправление порта на другой, если изменился порт какого-то сервиса, настройка прозрачного проксирования и так далее. Общая идея в том, что пакеты с определенного порта перенаправляются на другой порт на том же сетевом интерфейсе той же самой машины, либо на loopback’е.
Для перенаправления порта, например, 80, с внешнего интерфейса на порт 80 на loopback-интерфейсе мы можем использовать правило

iptables -t nat -A PREROUTING -d 192.168.0.1/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80

Это правило позволит перенаправить пакеты на loopback, изменив назначение пакета путем трансляции адреса (Destination NAT), и после этого можно будет их отфильтровать в цепочке, которая будет задана для loopback-интерфейса. Естественно, нужно будет сделать и обратную трансляцию:

iptables -t nat -A POSTROUTING -s 127.0.0.1/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.1

Таким образом, происходит обратный процесс, при этом изменяется Source NAT, то есть, транслируется адрес источника соединения.

Форвардинг портов на другую машину

По сути форвардинг портов на другую машину не отличается от форварда портов в пределах одной машины, но по существу это не одно и то же, поскольку пакеты будут передаваться не в пределах одной машины, как в случае с loopback-интерфейсом, когда фактически пакеты транслируются в пределах сетевого стека. Обычно форвардинг портов производится с определенного порта внешнего интерфейса на определенный порт машины во внутренней сети, поэтому между сетевыми интерфейсами должен быть настроен форвардинг. Например, проброс порта 3389 для работы удаленного рабочего стола (RDP) с внешнего сетевого интерфейса (192.168.100.25) на порт 3389 на одну из машин во внутренней сети (192.168.0.15):

iptables -t nat -A PREROUTING -d 192.168.100.25/32 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.15:3389
iptables -t nat -A POSTROUTING -s 192.168.0.15/32 -p tcp -m tcp --dport 3389 -j SNAT --to-source 192.168.100.25

Таблица форвардинга

При настройке iptables мы уже использовали таблицу форвардинга, но единственное, что мы делали — это очищали правила командой

iptables -F FORWARD

В этой таблице не рекомендуется фильтровать трафик, рекомендуется ее использовать только для перенаправления трафика. Фильтрацию необходимо выполнять либо до форвардинга, либо уже после. В таблице FORWARD вы определяете, куда должны форвардиться пакеты, а куда нет. Например:
— разрешить форвардинг между eth0 и eth2
— разрешить форвардинг между eth0 и eth3
— запретить форвардинг между eth2 и eth3
Правила в таком случае могут выглядеть так:

iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth3 -j ACCEPT
iptables -A FORWARD -i eth3 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth3 -j DROP
iptables -A FORWARD -i eth3 -o eth2 -j DROP

либо еще короче:

iptables -A FORWARD -i eth2 -o eth3 -j DROP
iptables -A FORWARD -i eth3 -o eth2 -j DROP

Разница между DROP и REJECT

При сбросе пакетов используют обычно две цели — DROP и REJECT, при этом нужно понимать, почему вы используете именно этот вариант. Основное различие состоит в том, что при использовании DROP не будет отправлен ICMP-ответ, по которому можно будет определить, что в соединении отказано. Оно просто не пройдет. Когда вы используете REJECT, то вы явно получите ответ, что в соединении отказано. Поэтому при составлении таблиц правил iptables лучше использовать REJECT, а когда вы окончательно определитесь с конфигурацией, можно изменить REJECT на DROP.

[wysija_form id=»2″]

  • Нажмите здесь, чтобы поделиться контентом на Facebook. (Открывается в новом окне)
  • Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)
  • Нажмите, чтобы поделиться на Reddit (Открывается в новом окне)
  • Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Tumblr (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Pinterest (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Pocket (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
  • Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Skype (Открывается в новом окне)

Linux iptables NAT проброс портов

Конфигурация для SendOS Fedora Redhat Suse Ubuntu

Если у вас две сетевые карты eth0, eth2

Допустим:

  • eth0 подключен к локальной сети
  • eth2 подключается к сети общего пользования (или ppp0)

Masquerading

1) Чтобы включить nat для eth0 для всех пользователей локальной сети

Если вы используете службу iptables, используйте следующий метод

 # echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

Чтобы сохранить изменения выполните:

 # iptables-save > /etc/sysconfig/iptables 

или

 # service iptables save
# service iptables restart

Это позволит работать Маскарадингу в системе.

Теперь вы можете настроить eth0 как шлюз для локальной сети.

Если вы не используете сервис iptables

Измените файл /etc/rc.local и добавьте в него следующие строки:

 # echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE 

Затем выполните файл ./rc.local

2) Как включить nat для eth0 для указанного пользователя сети

 # echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s x.x.x.x(ip of local user system1) -o eth2 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s x.x.x.x(ip of local user system2) -o eth2 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

Перенаправление портов

1) Чтобы перенаправить внешний 80-портовый трафик на порт 3128

 # iptables -t nat -A PREROUTING -i eth2 -p tcp –dport 80 -j REDIRECT –to-port 3128 

2) Перенаправить внешний трафик порта rdp на любой локальный системный rdp-порт.

 # iptables -t nat -A PREROUTING -t nat -p tcp -d x.x.x.x(eth2 ip) –dport 3389 -j DNAT –to x.x.x.x(ip of any local network system):3389  

или

# iptables -t nat -A PREROUTING -t nat -p tcp -d x.x.x.x(eth2 ip) –dport 3382 -j DNAT –to x.x.x.x(ip of any local network system):3389

Исходя из вашего требования, вы можете изменить порт и ip

Настройка Iptables (примеры) Часть 2

Продолжение статьи Настройка Iptables (примеры) Часть 1

Действия

Переходы

Для организации перехода пакета из текущей цепочки в другую (определенную пользователем), просто используйте действие -j имя_цепочки. В случае применения в этой цепочке к пакету действия RETURN (см. ниже), пакет вернется в исходную цепочку и продолжит ее прохождение начиная со следующего правила. Также, существует довольно редко используемое действие «безвозвратного перехода» -g имя_цепочки. В таком случае, после прохождения пакетом этой цепочки либо при применении в этой цепочке к пакету действия RETURN, пакет вернется к месту последнего перехода по -j. Если таких переходов не было, к пакету сразу будет применено действие по умолчанию для базовой цепочки.

Заметим, что не стоит пытаться перейти в базовую цепочку (например, -j OUTPUT), в текущую цепочку (во избежание зацикливания), а также в цепочку, определенную в другой таблице.

Встроенные действия

Как уже было сказано выше, каждое встроенное действие реализует какую-либо одну операцию, например, ACCEPT пропускает пакет, MARK меняет его маркировку, MASQUERADE обеспечиват маскарадинг соединения. Наиболее общими действиями являются: ACCEPT, DROP и REJECT — базовые операции фильтрации. Более подробно они рассмотрены ниже, при описании таблицы filter. RETURN — обеспечивает возврат из текущей цепочки. В частности, если из цепочки A правилом номер 3 пакет был направлен в цепочку B, то применение к нему в цепочке B действия RETURN приведет к его переход обратно в цепочку A, и он продолжит ее прохождение со следующего правила (номер 4). Например, предположим, что у нас есть объединенная через один свич подсеть 10.134.0.64/26, к которой наш компьютер подключен через интерфейс eth2. Тогда защиту от спуфинга (подделки адресов отправителя) через проверку MAC-адреса можно обеспечить следующим образом:

sysctl net.ipv4.ip_forward = 1 # Разрешаем шлюзу передавать транзитный трафик
iptables -F # Очищаем все цепочки таблицы filter
iptables -N check_ours_sp00f # Создаем цепочку, в которой будут проверяться MAC-адреса
iptables -A check_ours_sp00f -s 10.134.0.67 -m mac --mac-source 00:1D:60:2E:ED:A5 -j RETURN
iptables -A check_ours_sp00f -s 10.134.0.68 -m mac --mac-source 00:1D:60:2E:ED:CD -j RETURN
iptables -A check_ours_sp00f -s 10.134.0.69 -m mac --mac-source 00:1D:60:2E:ED:D7 -j RETURN
iptables -A check_ours_sp00f -s 10.134.0.70 -m mac --mac-source 00:1D:60:2E:ED:E0 -j RETURN
# Аналогичным образом проверяем все адреса нашей подсети
# И в конце обязательно добаляем правило для НЕ прошедших проверку
iptables -A check_ours_sp00f -j DROP
iptables -N check_ours # Создаем цепочку, которая будет описывать логику работы с нашей подсетью
iptables -A check_ours ! -i eth2 -j DROP # С других интерфейсов пакеты от них придти не могут
iptables -A check_ours -j check_ours_sp00f # Прогоняем их через проверку на спуфинг
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Как обычно, пропускаем все, что идет по
установленным соединениям
iptables -A INPUT -s 10.134.0.64/26 -j check_ours # Тех, кто претендует на звание своих, прогоняем через
проверку
# Прошедшим проверку разрешаем пользовать нащей проксей и самбой, а также соединяться по ssh
iptables -A INPUT -s 10.134.0.64/26 -m multiport --dports 22,8080,139,445 -j ACCEPT
iptables -P INPUT DROP # Остальных блокируем
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Как обычно, пропускаем все, что идет
по установленным соединениям
iptables -A FORWARD -s 10.134.0.64/26 -j check_ours # Проверка
iptables -A FORWARD -s 10.134.0.64/26 -j ACCEPT # Прошедшим проверку разрешеам передавать через нас
транзитный трафик
iptables -P FORWARD DROP # Остальных блокируем
iptables -P OUTPUT ACCEPT # Исходящий трафик разрешаем

В демонстрационных целях этот пример был слегка упрощен (вместо повтора правил с критерием -s 10.134.0.64/26 эти правила логичнее было бы вынести в отдельные цепочки) но, тем не менее, наглядно показывает принципа работы действия RETURN. Все новые входящие пакеты с обратным адресом из подсети 10.134.0.64/26 проходят двойную проверку в цепочке check_ours. Первый этап проверки — соответствие интерфейса. Ведь к нашей подсети, по условию задачи, мы подключены только интерфейсом eth2. Если пакет якобы из этой подсети придет с любого другого интерфейса, он будет заблокирован. Второй этап проверки заключается в последовательном чтении списка соответствующих IP- и MAC-адресов (цепочка check_ours_sp00f). Каждое правило этой цепочки, кроме последнего, выделяет пакеты от одного конкретного хоста нашей подсети. К пакетам, прошедшим проверку, применяется операция RETURN, выводящая пакет из этой цепочки. Если же пакет не подошел ни по одному из этих правил, он считается не прошедшим проверки и блокируется последним правилом -j DROP. Для прошедших же проверку пакетов дальнейшая судьба зависит от того, кому они адресованы. Если они идут через наш хост вы другие подсети, то они пропускаются. Если же они адресованы непосредственно нашему хосту, то пропускаются только соединения на некоторые TCP-порты (прокси, SSH, SMB).

LOG — позволяет записывать информацию о пакетах в журнал ядра (см. syslog).
Например, если в предыдущем примере перед строкой

iptables -A INPUT -s 10.134.0.64/26 -m multiport --dports 22,8080,139,445 -j ACCEPT
мы добавим строку

iptables -A INPUT -s 10.134.0.64/26 -m multiport --dports 22,8080,139,445 -j LOG --log-level INFO --log-prefix "Newconnection from ours: "
то для каждого нового соединения к нашему хосту из нашей подсети в системном журнале будет появляться запись примерно такого вида:

Jul 16 20:10:40 interdictor kernel: New connection from ours: IN=eth2 OUT=
MAC=00:15:17:4c:89:35:00:1d:60:2e:ed:a5:08:00 SRC=10.134.0.67
DST=10.134.0.65 LEN=48 TOS=0x00 PREC=0x00 TTL=112 ID=38914 DF PROTO=TCP SPT=31521 DPT=8080
WINDOW=65535 RES=0x00 SYN URGP=0

Такая запись содержит очень много полезной информации. Начинается она с даты и времени получения пакета. Затем идет имя нашего хоста (interdictor) и источник сообщения (для сообщений фаервола это всегда ядро). Потом идет заданный нами префикс (New connection from ours:), после чего следуют данные о самом пакете: входящий интерфейс (определен для цепочек PREROUTING, INPUT и FORWARD), исходящий интерфейс (определен для цепочек FORWARD, OUTPUT и POSTROUTING), далее — сцепленные вместе MAC-адреса источника и назначения (сначала идет адрес назначения, в данном случае это наш интерфейс eth2 с маком 00:15:17:4C:89:35, затем адрес источника, в нашем случае это 00:1D:60:2E:ED:A5, завершается всегда двумя байтами 08:00), потом IP-адреса источника (10.134.0.67) и получателя (10.134.0.65, это наш хост), а затем идет различная техническая информация. Например, протокол (TCP), порты источника и назначения (31521 и 8080 соответственно), TOS и TTL, длина пакета (48 байт), наличие флага SYN и т. д.

Параметр —log-prefix позволяет задать поясняющую надпись, упрощающую поиск сообщений в системных журналах. Параметр —log-level определяет уровень важности лог-сообщения, от которого зависит, в частности, в какой именно из журналов будет записано это сообщение. За более подробными сведениями обратитесь к документации по вашему демону системного лога.

ULOG — позволяет передавать информацию об обработанных пакетах специальным демонам, таким, как ulogd. Такой подход позволяет эффективно управлять информацией от трафике, в частности, заносить ее в базы данных, такие как MySQL, PostgreSQL или SQLite. Впоследствии эти данные могут быть проанализированы и визуализованы с помощью таких средств, как NuLog.

NFLOG — более универсальный вариант ULOG, обеспечивающий передачу информации о пакете не напрямую в netlink-сокет (как это делает ULOG), а специальной подсистеме — logging backend. Например, бэкенд nfnetlink_log обеспечивает передачу данных в netlink-сокет, то есть с ним NFLOG работает аналогично ULOG.

NFQUEUE — во многом похоже на ULOG, но передает специальному демону не информацию о пакете, а сам пакет целиком. Применяется, в частности, для организации работы l7-filter-userspace.

Например, если демон l7-filter был запущен командой

l7-filter -f /etc/l7-filter.conf -q 2

то передать ему на обработку все входящие и локально сгенерированные пакеты можно командами

iptables -t mangle -F # На всякий случай очищаем таблицу mangle
iptables -t mangle -A PREROUTING -j NFQUEUE --queue-num 2
iptables -t mangle -A OUTPUT -j NFQUEUE --queue-num 2

Опция —queue-num позволяет указать номер очереди пакетов. Он должен быть совпадать с номером, указанным при запуске демона l7-filter (параметр -q).

QUEUE — устаревшая версия NFQUEUE. Не имеет параметров, так как работает только с очередью номер 0. Выше были рассмотрены действия «общего назначения», то есть не привязанные по своей специфике к таблицам. Далее, при рассмотрении отдельных таблиц, будут описываться действия, специфичные для каждой таблицы. Термин «специфичные» надо понимать так: совсем не обязательно, что действие, специфичное для одной таблицы, будет в принципе недопустимо в другой, но в любом случае использование этого действия в других таблицах будет «плохим тоном» — ведь таблицы и действия четко разделены по назначению. Не стоит «забивать гвозди микроскопом».

Порой эта разница бывает довольно тонкой. Например, если действие NFQUEUE передает пакеты демону l7-filter-userspace (который занимается маркировкой пакетов на основе анализа их содержимого), то правильнее будет разместить вызов такого действия в таблице mangle. Если же оно передает пакеты демону nufw (который обеспечивает разрешение или запрещение трафика на основе авторизации пользователя), то логичнее разместить это действие в таблице filter.

Кроме того, существуют и ограничения, наложенные непосредственно в коде iptables. Например, действия таблицы nat жестко защищены от употребления за ее пределами. Другой пример: действие REDIRECT можно применять только в цепочках PREROUTING и OUTPUT таблицы nat, то есть ограничения могут быть не только на таблицы, но на отдельные цепочки. Данная статья ни в коем случае не претендует на полноту изложения, поэтому, перед тем как использовать какое-либо действие, обязательно ознакомьтесь с документацией, прилагающейся к вашей версии iptables.

Терминальные и нетерминальные действия

Терминальными называются действия, которые прерывают прохождение пакета через текущую базовую цепочку. То есть если к пакету в рамках некоторого правила было применено терминальное действие, он уже не проверяется на соответствие всем следующим правилам в этой цепочке (и в тех цепочках, из которых она была вызвана, если это пользовательская цепочка). Терминальными являются все действия, специфичные для таблиц filter и nat. Из приведенных выше в этом разделе — ACCEPT, DROP, REJECT, NFQUEUE, QUEUE.
Например,

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: "

Второе из приведенных правил (логгирование) никогда не будет срабатывать, так как все пакеты, удовлетворяющие этому критерию (входящие TCP-пакеты на порт 80), будут пропущены по первому из этих правил, и до второго просто не дойдут. Нетерминальными, соответственно, являются действия, не прерывающие процесс прохождения пакета через цепочки. Нетерминальными являются действия, специфичные для таблицы mangle, а из перечисленных выше — LOG, ULOG и NFLOG.

Например,

iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: "
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Теперь все входящие на TCP-порт 80 пакеты будут сначала заноситься в лог, и только потом пропускаться.

Действие RETURN с точки зрения такой классификации занимает промежуточное положение — оно может прервать прохождение пакета через отдельную цепочку (или несколько цепочек, если для перехода в них использовалась опция -g, а не -j), но совсем не обязательно, чтобы это приводило к завершению обработки пакета в рамках текущей базовой цепочки.

Таблица mangle содержит следующие цепочки:

PREROUTING — позволяет модифицировать пакет до принятия решения о маршрутизации.
INPUT — позволяет модифицировать пакет, предназначенный самому хосту.
FORWARD — цепочка, позволяющая модифицировать транзитные пакеты.
OUTPUT — позволяет модифицировать пакеты, исходящие от самого хоста.
POSTROUTING — дает возможность модифицировать все исходящие пакеты, как сгенерированные самим хостом, так и транзитные.

Заметим, что все цепочки таблицы mangle пакеты проходят раньше, чем одноименные цепочки таблиц nat и filter. Это позволяет классифицировать и маркировать пакеты и соединения в цепочках этой таблицы. Впоследствии эти маркировки могут быть использованы в цепочках двух других таблиц при принятии решений о фильтрации и трансляции адресов.

Действия

Допустимыми действиями в этой таблице являются:

TOS — изменяет поле TOS данного пакета. Поддерживаются опции —set-tos (установить поле TOS в заданное значение), а также —and-tos, —or-tos и —xor-tos, комбинирующие текущее значение поля TOS с заданным в правиле значением по соответствующему логическому правилу и записывающие результат как новое значения поля TOS.

TTL — изменяет поле TTL данного пакета. Поддерживаются опции —set-ttl (установить поле TTL в заданное значение), а также —ttl-inc и —ttl-dec (соответственно увеличить или уменьшить текущее значение поля TTL на заданное значение).

MARK — устанавливает или изменяет маркировку пакета. Поддерживает опции —set-mark, —and-mark, —or-mark и —xor-mark, аналогичные опциям действия TOS. Важно понимать, что маркировка пакета не хранится в его заголовке или содержимом, и поэтому действует только в пределах одного хоста. Также нужно отличать маркировку пакета от маркировки соединения. Маркировка пакетов может применяться для их дальнейшей обработке фаерволом (критерии mark и connmark), а также для классификации трафика фильтрами шейпинговой подсистемы tc (лексема handle mark fw).

CONNMARK — устанавливает или изменяет маркировку соединения. Поддерживает те же опции, что и MARK, а также дополнительные опции —restore-mark (копирует маркировку соединения в маркировку пакета) и —save-mark (копирует маркировку пакета в маркировку соединения).

SECMARK — устанавливает для пакета контекст безопасности SELinux (единственная допустимая опция —selctx).

CONNSECMARK — позволяет скопировать контекст безопасности SELinux с отдельного пакета на соединение в целом (опция —save) и наоборот (опция —restore).

CLASSIFY — устанавливает CBQ-класс пакета для его последующей обработки шейпером (опция —set-class).

Таблица nat предназначена для операций stateful-преобразования сетевых адресов и портов обрабатываемых пакетов.

Цепочки

Таблица nat содержит следующие цепочки:

PREROUTING — в эту цепочку пакеты попадают до принятия решения о маршрутизации. По сути, термин «решение о маршрутизации» подразумевает деление трафика на входящий (предназначенный самому хосту) и транзитный (идущий через этот хост на другие хосты). Именно на данном этапе нужно проводить операции проброса (DNAT, REDIRECT, NETMAP).

OUTPUT — через эту цепочку проходят пакеты, сгенерированные процессами самого хоста. На данном этапе при необходимости можно повторить операции проброса, так локально сгенерированные пакеты не проходят цепочку PREROUTING и не обрабатываются ее правилами. См. пример для действия DNAT ниже.

POSTROUTING — через эту цепочку проходят все исходящие пакеты, поэтому именно в ней целесообразно проводить операции маскарадинга (SNAT и MASQUERADE).

Действия

Допустимыми действиями в таблице nat являются:

MASQUERADE — подменяет адрес источника для исходящих пакетов адресом того интерфейса, с которого они исходят, то есть осуществляет маскарадинг. Такая операция позволяет, например, предоставлять доступ в Интернет целым локальным сетям через один шлюз. Допустим, у нас есть локальная сеть 192.168.1.0/255.255.255.0 с несколькими компьютерами, имеющими адреса 192.168.1.2, 192.168.1.3 и т. д. Адрес 192.168.1.1 имеет внутренний (подключенный к локальной сети) сетевой интерфейс шлюза, назовем этот интерфейс eth2. Другой его интерфейс, назовем его eth0, подключен к сети Интернет и имеет адрес, допустим, 208.77.188.166. Тогда, чтобы обеспечить выход хостов из этой локальной сети в интернет, на шлюзе достаточно выполнить следующие команды

sysctl net.ipv4.ip_forward = 1 # Разрешаем шлюзу передавать транзитный трафик
iptables -F FORWARD # На всякий случай очистим цепочку FORWARD
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешаем проходить пакетам по уже
установленным соединениям
iptables -A FORWARD -m state --state NEW -i eth2 -s 192.168.1.0/24 -j ACCEPT # Разрешаем исходящие
соединения из локальной сети к интернет-хостам
iptables -P FORWARD -j DROP # Весь остальной транзитный трафик — запрещаем.
iptables -t nat -F POSTROUTING # На всякий случай очистим цепочку POSTROUTING таблицы nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # Маскарадим весь трафик, идущий через eth0

Теперь, если один из хостов локальной сети, например, 192.168.1.2, попытается связаться с одним из интернет-хостов, например, 204.152.191.37 (kernel.org), при проходе его пакетов через шлюз, их исходный адрес будет подменяться на внешний адрес шлюза, то есть 208.77.188.166. С точки зрения удаленного хоста (kernel.org), это будет выглядеть, как будто с ним связывается непосредственно сам шлюз. Когда же удаленный хост начнет ответную передачу данных, он будет адресовать их именно шлюзу, то есть 208.77.188.166. Однако, на шлюзе адрес назначения этих пакетов будет подменяться на 192.168.1.2, после чего пакеты будут передаваться настоящему получателю. Для такого обратного преобразования никаких дополнительных правил указывать не нужно — это будет делать все та же операция MASQUERADE. Простота трансляции сетевых адресов является одним из важнейших достоинств stateful-фильтрации.

Если же такой трансляции не производить, удаленный хост просто не сможет ответить на адрес 192.168.1.2, так как адресные пространства локальных сетей изолировано от адресного пространства Интернета. В мире могут существовать миллионы локальных сетей 192.168.1.0/255.255.255.0, и в каждой может быть свой хост 192.168.1.2. Эти сети могут и не быть связаны с Интернетом. Но если они с ним связаны — то только благодаря механизмам трансляции сетевых адресов.

SNAT (Source Network Address Translation) — работает аналогично MASQUERADE, однако позволяет указать адрес «внешнего» интерфейса (опция —to-source). Такой подход позволяет экономить процессорное время шлюза, так как в случае с MASQUERADE для каждого пакета адрес внешнего интерфейса определяется заново. Таким образом, если в предыдущем примере внешний адрес шлюза 208.77.188.166 является статическим (то есть никогда не меняется), команду
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
целесообразно заменить на

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 208.77.188.166

Однако, в случае, если внешний адрес шлюза динамический, то есть меняется в начале каждой новой сессии, правильнее будет использовать именно MASQUERADE.

Дополнительно, если на внешнем интерфейсе шлюза «висит» несколько статических адресов, например, 208.77.188.166, 208.77.188.167 и 208.77.188.168, можно использовать балансировку между этими адресами:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 208.77.188.166-208.77.188.168

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

DNAT (Destination Network Address Translation) — подменяет адрес назначения для входящих пакетов, позволяя «пробрасывать» адреса или отдельные порты внутрь локальной сети.
Возвращаясь к предыдущему примеру, предположим, что нам нужно «пробросить» внешний адрес шлюза 208.77.188.166 на хост 192.168.1.2, то есть все, кто будет обращаться по внешнему адресу шлюза 208.77.188.166, должны попадать на хост 192.168.1.2. Это достигается следующими командами:

sysctl net.ipv4.ip_forward = 1 # Разрешаем шлюзу передавать транзитный трафик
iptables -t nat -F PREROUTING # На всякий случай очистим цепочку PREROUTING таблицы nat
iptables -t nat -A PREROUTING -d 208.77.188.166 -j DNAT --to-destination 192.168.1.2 # Пробрасываем
208.77.188.166 на 192.168.1.2
iptables -F FORWARD # На всякий случай очистим цепочку FORWARD
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешаем проходить пакетам по уже
установленным соединениям
iptables -A FORWARD -m state --state NEW -d 192.168.1.2 -j ACCEPT # Разрешаем входящие соединения к
192.168.1.2
iptables -P FORWARD -j DROP # Весь остальной транзитный трафик — запрещаем.

В лучших традициях stateful-фаерволинга, подменяются не только адреса назначения для входящих пакетов (208.77.188.166 -> 192.168.1.2), но и адреса источника для исходящих пакетов (192.168.1.2 -> 208.77.188.166), поэтому для интернет-хостов создается полное впечатление, что они общаются именно с 208.77.188.166.

Однако, при всей своей простоте и наглядности, этот пример имеет два недостатка. Во-первых, из нашей локальной сети 192.168.1.0/24 адрес 208.77.188.166 может быть недоступен, так как 192.168.1.2, увидев, что запрос исходит из его сети, может отправить ответ непосредственно отправителю (например, 192.168.1.3), минуя сам шлюз. Отправитель же будет ждать ответа от 208.77.188.166, и просто проигнорирует ответ от 192.168.1.2. Впрочем, эта проблема легко исправляется добавлением SNAT’а для пробрасываемых пакетов:

iptables -t nat -A POSTROUTING -d 192.168.2.1 -j SNAT --to-source 192.168.1.1

Теперь, с точки зрения 192.168.1.2, к нему будет обращаться только сам шлюз (192.168.1.1), поэтому ответ также пойдет через шлюз, где будет корректно оттранслирован.

Вторым недостатком предложенного примера является некорректная обработка запросов с самого шлюза. Ведь пакеты, генерируемые локальными процессами, не проходят цепочку PREROUTING. Поэтому правило DNAT нужно также добавить и в цепочку OUTPUT таблицы nat:

iptables -t nat -A OUTPUT -d 208.77.188.166 -j DNAT --to-destination 192.168.1.2

Разумеется, исходящие соединения к 192.168.1.2 и ответы на них должны быть разрешены соответственно в цепочках OUTPUT и INPUT таблицы filter.

iptables -F INPUT # Очищаем цепочку INPUT
iptables -A INPUT --state ESTABLISHED,RELATED -j ACCEPT # Разрешаем входящие пакеты по уже установленным соединениям
iptables -P INPUT DROP # Все остальные входящие пакеты — запрещаем
iptables -F OUTPUT # Очищаем цепочку OUTPUT
iptables -P OUTPUT ACCEPT # Разрешаем исходящие пакеты без всяких ограничений

Кроме того, при помощи действия DNAT можно пробрасывать не только сразу весь IP-адрес, но и отдельные TCP- или UDP-порты. Например, если в предыдущем примере мы в каждое из правил

iptables -t nat -A PREROUTING -d 208.77.188.166 -j DNAT --to-destination 192.168.1.2
iptables -t nat -A POSTROUTING -d 192.168.2.1 -j SNAT --to-source 192.168.1.1
iptables -t nat -A OUTPUT -d 208.77.188.166 -j DNAT --to-destination 192.168.1.2

добавим

-p tcp --dport 80

то мы «пробросим» не сам адрес 208.77.188.166, а только его TCP-порт 80 (HTTP). Обращения на все остальные TCP- и UDP-порты, а также ICMP-пакеты, поступившие на адрес 208.77.188.166, будут обрабатываться шлюзом, и лишь входящие TCP-соединения на порт 80 будут передаваться на 192.168.1.2.

Как и SNAT, DNAT поддерживает указание диапазонов адресов для подмены. Таким образом можно, например, балансировать нагрузку между несколькими серверами.

REDIRECT — подменяет номер порта в TCP- или UDP-пакете, а также подменяет адрес назначения на свой собственный. Например,

iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 80 -j REDIRECT --to-port 8080

позволяет «завернуть» все исходящие из локальной сети TCP-соединения на порт 80, на TCP-порт 8080 шлюза. Если этот порт обслуживается специально настроенным прокси-сервером, то можно организовать «прозрачное проксирование» — клиенты из локальной сети даже не будут подозревать, что их запросы идут через прокси-сервер. Разумеется, входящие соединения из локалки на TCP-порт 8080 должны быть разрешены в таблице filter.

Другой полезный пример:

iptables -t nat -A PREROUTING -i eth0 -s 213.180.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 8000

«заворачивает» все входящие из Интернета, а точнее подсети 213.180.0.0/255.255.0.0 TCP-соединения на порт 80, переадресуя их на порт 8000 того же сервера (где, например, может работать специальный веб-сервер). Как обычно, входящие соединения на TCP-порт 8000 должны быть разрешены в таблице filter.

SAME — в зависимости от цепочки (PREROUTING или POSTROUTING) может работать как DNAT или SNAT. Однако, при указании (в параметре —to-ip) одного или нескольких диапазонов IP-адресов, определяет для каждого нового соединения подставляемый адрес не случайно, а базируясь на IP-адресе клиента. Таким образом, адрес для подмены остается постоянным для одного и того же клиента при повторных соединениях (что не выполняется для обычных DNAT/SNAT). В некоторых случаях это бывает важным.

NETMAP — позволяет «пробросить» целую сеть. Например, для шлюза, стоящего между сетями 192.168.1.0/24 и 192.168.2.0/24 можно организовать следующий проброс:iptables -t

nat -A PREROUTING -s 192.168.1.0/24 -d 192.168.3.0/24 -j NETMAP --to 192.168.2/24

Теперь, при обращении, например, хоста 192.168.1.3 на IP-адрес 192.168.3.2 он будет попадать на 192.168.2.2 (при условии, что такой транзитный трафик разрешен на шлюзе в цепочке FORWARD таблицы filter, а также на хостах сети 192.168.1.0/24 наш шлюз прописан в качестве шлюза для подсети 192.168.3.0/24).

MIRROR — довольно интересная игрушка. Меняет местами адрес источника и назначения и высылает пакет обратно. Создано исключительно для демонстрационных целей. Однако, может, например, применяться для защиты от сканирования портов — в результате атакующий сканирует свои собственные порты. Однако наличие двух встречных MIRROR’ов на двух хостах может повлечь бесконечное блуждание одних и тех же пакетов, забивающее канал. Поэтому применяйте это действие с осторожностью.

Настройка Iptables (примеры) Часть 3

Простейший Nat в linux с помощью iptables

Очень часто бывает нужен простой Nat чтобы дать нескольким другим компьютерам доступ в сеть. Конечно, можно поставить squid или vpn сервер, но зачем, когда можно более просто, и лаконично дать доступ? Этот небольшой пост как раз об этом. Когда я был «мал да зелен», и приобрёл второй компьютер, я зачем-то сразу полез ставить squid. Опыта было мало, а сделать нужно было. В итоге после недели мучений, я это дело бросил. Опыта и знаний явно не хватало. С iptables я тогда был незнаком, поэтому оставил это дело, и решил купить роутер, но тут один знакомый админ со стажем, подсказал мне как легко, и просто можно «раздать» сеть.

Для начала, включим форвардинг в ядре если не включен:

su
echo 1 \> /proc/sys/net/ipv4/ip\_forward

Для того, чтобы ядро загружалось всегда с включенным форвариднгом надо открыть файл /etc/sysctl.conf (от супер пользователя — root), и в него добавить или изменить имеющуюся строчку:

Фактически сам nat делается одной командой:

sudo iptables -t nat -I POSTROUTING -s 192.168.8.1 -j MASQUERADE

Этой командой мы делаем «полный nat» для компьютера с адресом 192.168.8.1. Полный в том смысле, что всё, что видит сервер (тот, на котором nat), то видит и клиент. Если компьютеров несколько, и находятся они в одной подсети, то можно указать диапазон адресов с помощью маски:

sudo iptables -t nat -I POSTROUTING -s 192.168.8.0/255.255.255.0 -j MASQUERADE

Маска 255.255.255.0 разрешает 254 адреса (0 в данном случае адрес сети, 255 — broadcast адрес). Т.е. все адреса от 192.168.8.1 до 192.168.8.254. Для расчёта диапазона адресов, рекомендую использовать какой либо из интернет калькуляторов. Например этот.

В случае если сервер видит несколько сетей, а необходимо дать доступ к одной, то это можно сделать так:

iptables -t nat -A POSTROUTING -o eth2 -s 192.168.8.0/255.255.255.0 -j MASQUERADE

На компьютере «клиенте», чтобы появилась сеть, необходимо в качестве шлюза по умолчанию (gateway), указать адрес nat сервера.

Рекомендую использовать этот способ только в домашней локальной сети. В общественной сети легко можно подменить ip адрес.

Настройка маскарадинга (NAT) в Ubuntu — IT Blog

Для примера выполню настройку маскарадинга IPv4 (NAT) на Ubuntu Server.
Сначала нужно включить поддержку пересылки пакетов в /etc/sysctl.conf, чтобы трафик мог ходить между разными сетевыми интерфейсами.
Проверим текущее состояние:

sysctl net.ipv4.conf.all.forwarding
cat /proc/sys/net/ipv4/ip_forward

Если оно равно 0, то включим следующей командой:

sysctl -w net.ipv4.conf.all.forwarding=1

Чтобы после перезапуска системы оно не сбросилось, откроем файл /etc/sysctl.conf например в редакторе nano (Ctrl+X для выхода, y/n для сохранения или отмены изменений):

nano /etc/sysctl.conf

И добавим строку:

net.ipv4.conf.all.forwarding=1

При необходимости можно очистить существующие NAT правила:

iptables -t nat --flush

Теперь осталось в iptables добавить правило, например:

iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -j SNAT --to-source 172.16.16.94

Где, 192.168.99.0/24 внутренняя сеть, а 172.16.16.94 адрес через который нужно идти в интернет, аналогично прописываются другие внутренние сети.
Напомню маску для частных сетей:

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

Если IP адрес на внешнем сетевом интерфейсе меняется (динамический), тогда вместо SNAT укажем MASQUERADE:

iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -j MASQUERADE

Не забываем сохранить добавленные правила iptables.
Например можно открыть файл конфигурации сетевых интерфейсов (его содержимое подгружается при запуске системы):

nano /etc/network/interfaces

И в конце добавлять правила iptables, например укажу маскарадинг этой сети сразу на несколько IP адресов, а также с указанием сетевого интерфейса:

post-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o eth4 -j SNAT --to-source 172.16.90.1-172.16.90.5 --persistent

Или добавим в файл:

nano /etc/rc.local
/sbin/iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o eth4 -j SNAT --to-source 172.16.90.1-172.16.90.5 --persistent

Рекомендую указывать исходящий сетевой интерфейс, если его не указать, то локальный трафик будет возвращаться в сеть под NAT IP.
Если исходящий интерфейсов несколько, допустим балансируется нагрузка через BGP и т.д., то укажем двумя правилами:

/sbin/iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o eth4 -j SNAT --to-source 172.16.90.1-172.16.90.5 --persistent
/sbin/iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o eth5 -j SNAT --to-source 172.16.90.1-172.16.90.5 --persistent

Смотрите также мои статьи:
Модули NAT для VPN, FTP, SIP
Разница между MASQUERADE и SNAT
Настройка IPTables
Решение ошибки «nf_conntrack: table full, dropping packet»
Использование Linux ISG

IP Masquerading (NAT) с использованием iptables

1 План выступления

  • iptables против ipchains
  • Цель (или: моя цель)
  • Путь пакета через iptables
  • «Классический» маскарадинг (SNAT)
  • Подделка DNS (с DNAT)
  • Разное
  • Межсетевой экран с iptables (если будет время)
  • Вопросы, на которые я надеюсь ответить

Не рассматривается: изменение пакетов (изменение TOS, TTL и флагов)

2 Различия между iptables и ipchains

  • Тот же автор (Расти Рассел) и в основном пахнет одинаково
  • Самое важное: ВПЕРЕД отдельно от ВХОДА и ВЫХОДА
  • Изменения в синтаксисе
  • Маскарадинг обрабатывается «отдельно»

3 ipchains и iptables не работают вместе

  • Если модуль ipchains находится в ядре, iptables не будет insmod
  • И наоборот
  • Типичное сообщение об ошибке вводит в заблуждение: «Нет поддержки ядра».
  • Red Hat 7.3 загружается с ipchains по умолчанию

4 То, что я хотел в первую очередь

5 Требования

  • Компьютер с Windows должен иметь шлюз
  • проблема DNS решена элегантно
  • Оба компьютера имеют доступ к сети одновременно
  • Сеть между компьютерами надежная
  • Правильный брандмауэр
  • ADSL-модем считается враждебным

6 iptables: поток IP-пакета

7 iptables: как проглотить это

  • Фильтрация пакетов (межсетевые экраны) и манипуляции (маскарадинг) являются соседи
  • Следовательно, используются те же инструменты
  • Think таблицы маршрутизации
  • Цепи: подпрограммы Think
  • Каждая цепочка заканчивается целью или следующей строкой.
  • Подцепи работают точно так же, как подпрограммы
  • Таблицы: Группа цепей: фильтр и нат.
  • У каждой цепочки есть политика — цель по умолчанию

8 Что такое маскарадинг?

  • Все компьютеры имеют одинаковый IP-адрес
  • Это делается с помощью трансляции сетевых адресов.
  • «Исходящий пакет» легко подделать
  • «Входящие пакеты» тоже нужно переводить
  • Трансляция портов — обязательно

9 iptables: поток IP-пакета

10 Преобразование сетевого адреса источника (SNAT)

  • На ADSL: перехватить пакеты, выходящие на ppp0
  • Исходный IP изменен
  • Номера портов источника могут быть изменены
  • Самое простое правило: используйте SNAT для всех пакетов, исходящих по ppp0
  • Будет случайно включать OUTPUT пакеты, но кого это волнует?
  • Помните: каждый SNAT производит неявный DNAT
  • И наоборот

11 «Входящие» пакеты

  • Проблема: Куда должен идти пакет?
  • Простое TCP-соединение: iptables запоминает номера портов
  • UDP: сложно
  • DNS: Верните ответ тому, кто спросил
  • ICMP: ответы на пинг идут правильно (!)
  • FTP, ICQ и друзья: требует особого отношения (они работают для меня как базовый клиент)
  • Когда другая сторона открывает соединение, это требует особой обработки.
  • iptables имеет прикладные модули

12 Определение команд SNAT iptables

Строгий путь:

iptables -t nat -A ПОСТРОУТИРОВАНИЕ -o ppp0 -j SNAT \
— в $ PPPIP

Либеральный путь:

iptables -t nat -A РАЗМЕЩЕНИЕ -o ppp0 -j МАСКЕРАД

  • Для временных подключений лучше подходит «либеральная» форма:
  • MASQUERADE автоматически выбирает адрес
  • MASQUERADE забывает старые соединения, когда интерфейс выходит из строя
  • Для коммутируемых, кабельных модемов и ADSL: MASQUERADE выигрывает

13 POSTROUTE — это просто еще одна цепочка

  • Можно использовать выборочные правила
  • Возможны разные манипуляции
  • Используйте -j ACCEPT, чтобы пропустить пакет нетронутым

14 Неправильный способ маскировки

iptables -t nat -A POSTROUTING -j MASQUERADE

  • Это маскирует политику по умолчанию для любого исходящего пакета.
  • … включая любой переадресованный пакет.
  • Все переадресованные пакеты будут исходить от маскирующего хоста.
  • Может сбивать с толку брандмауэры
  • Что еще хуже, может сбить с толку служебные приложения и поставить под угрозу безопасность

15 Маскарад и брандмауэр

  • Внутренние компьютеры неявно защищены брандмауэром
  • Главный компьютер получает все несвязанные пакеты
  • Главный компьютер должен быть защищен
  • Главный компьютер защищен цепями ВХОДА и ВЫХОДА
  • Другие компьютеры, защищенные цепями FORWARD
  • Обратите внимание, что цепочки FORWARD также применяются к подключению к интрасети

16 Подделка DNS с DNAT

  • Остальные компьютеры имеют постоянные адреса DNS
  • Адрес транслируется с DNAT

iptables -t nat -A PREROUTING -d 10.2.0.1 \
-j DNAT — к месту назначения 192.115.106.31
iptables -t nat -A PREROUTING -d 10.2.0.2 \
-j DNAT — к месту назначения 192.115.106.35

17 Автоматическая настройка DNS DNAT

  • При подключении ADSL адреса DNS выдаются при подключении
  • Сценарий ip-up.local записывает эти адреса в файл resolv.conf

DNScount = 1
для сервера имен в \
`perl -nle» / сервер имен \ D * (\ d * \.127 / || print \\ $ 1) «/ etc / resolv.conf`;
do iptables -t nat -A PREROUTING -d 10.2.0. $ DNScount \
-j DNAT —to-destination $ nameserver
пусть DNScount = DNScount + 1;
готово;

  • Приведенный выше оператор perl извлекает два адреса

18 MTU на компьютере с Windows

  • Соединение ADSL ppp имеет MTU 1452
  • Обычный Ethernet имеет MTU 1500
  • Компьютер с Windows не знает, что проходит через ADSL
  • Фрагментация
  • Исправлено добавлением записи в реестр Windows

19 Другие уловки

  • Сервер на замаскированном хосте (DNAT)
  • Переназначение порта (перенаправление)
  • Балансировка нагрузки (прямой DNAT «один ко многим»)
  • Обработка пакетов

20 Фильтрующие цепочки

  • ВХОД, ВЫХОД и ВПЕРЕД
  • целей с ACCEPT, DROP, REJECT или QUEUE
  • Набор выборочных правил составляет брандмауэр

21 Пример: брандмауэр

Закрыть все и промыть цепи

iptables -P ПАДЕНИЕ ВВОДА
iptables -P ВЫПУСК ВЫВОДА
iptables -P FORWARD DROP
iptables -F -t нат
iptables -F -t фильтр
iptables -X

22 Пример: межсетевой экран (продолж.)

Разрешить все на интерфейсе обратной связи

iptables -A INPUT -i lo -j ACCEPT
iptables -A ВЫХОД -o lo -j ПРИНЯТЬ

23 Пример: межсетевой экран (продолжение)

Держите модем ADSL коротким

iptables -A ВХОД -i eth2 -s 10.0.0.138/32 \
-d 10.0.0.0/8 -p tcp \
—спорт 1723 -м состояние \
— состояние УСТАНОВЛЕНО, СВЯЗАННО -j ПРИНЯТЬ
iptables -A INPUT -i eth2 -s 10.0,0.138 / 32 \
-d 10.0.0.0/8 -p gre -j ПРИНЯТЬ
iptables -A INPUT -i eth2 -j DROP
iptables -A ВЫХОД -o eth2 -s 10.0.0.0/8 \
-d 10.0.0.138/32 -p tcp —dport 1723 \
-j ПРИНЯТЬ
iptables -A ВЫХОД -o eth2 -s 10.0.0.0/8 \
-d 10.0.0.138/32 -p gre -j ПРИНЯТЬ
iptables -A ВЫХОД -o eth2 -j ОТКАЗ

24 Пример: межсетевой экран (продолжение)

Компьютер Linux с сетевыми правилами:

iptables -A ВЫХОД -o ppp0 -s $ PPPIP -j ACCEPT
iptables -A INPUT -s! 10.128.0.0 / 16 -p tcp \
—dport 0: 1023 -j DROP
iptables -A INPUT -i ppp0 -d $ PPPIP -m state \
— состояние УСТАНОВЛЕНО, СВЯЗАННО -j ПРИНЯТЬ

25 Пример: межсетевой экран (продолжение)

Во внутренней сети все разрешено

iptables -A INPUT -s 10.128.0.0/16 \
-d 10.128.0.0/16 -j ПРИНЯТЬ
iptables -A ВЫХОД -s 10.128.0.0/16 \
-d 10.128.0.0/16 -j ПРИНЯТЬ

26 Пример: межсетевой экран (продолж.)

Экспедирование ….

iptables -A FORWARD -i ppp0 -o eth0 -m state \
— состояние УСТАНОВЛЕНО, СВЯЗАННО -j ПРИНЯТЬ
iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
iptables -A FORWARD -j DROP

Обратите внимание, что переадресация во внутренней сети отсутствует

27 финал скрипта iptables

  • Убедитесь, что основные цепи заканчиваются DROP
  • Нулевые счетчики

iptables -A INPUT -j DROP
iptables -A ВЫХОД -j DROP
iptables -A FORWARD -j DROP
iptables -Z

28 Сводка

  • Работает очень хорошо
  • Нетрудно настроить, если вы знаете, что делаете

29 Ссылки

  • Linux IP Masquerade HOWTO (доступна версия, написанная в январе 2003 г.)
  • человек iptables

Последнее изменение Чт, 17 мая, 17:30:00 2012.Электронная почта:

.

Linux NAT за четыре шага с использованием iptables

В жизни каждого должен идти небольшой дождь. Моя основная рабочая станция Linux дома на следующий день после Рождества произошел сбой жесткого диска. Я могу только догадываться в прошлом году было плохо, и Санта превратил мой жесткий диск в кусок угля, когда наказание.

К сожалению, в какой-то момент в течение года я допустил опечатку в скрипте, который я использовал для резервного копирования моего личного веб-сайта и некоторых других данных на тот конкретный компьютер. Наряду с некоторыми данными, которые не были очень важными, Я потерял свой удобный небольшой скрипт, который использовал для настройки iptables для NAT на моем внутренняя сеть в Интернет в целом.

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

Если вы используете последнее ядро ​​Linux 2.6, этот четырехэтапный процесс должен работать на вас. Это было специально протестировано на Fedora Core 3, 4, 5 и 6, но должны работать в любом современном дистрибутиве Linux. Все эти команды должны выполняться от имени пользователя root. Сначала вам нужно сообщить ядру, что вы хотите разрешить пересылку IP.

  эхо 1> / proc / sys / net / ipv4 / ip_forward  

Затем вам нужно настроить iptables для пересылки пакетов из ваша внутренняя сеть на / dev / eth2, к вашей внешней сети на / dev / eth0. Вы сделаете это с помощью следующих команд:

  # / sbin / iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# / sbin / iptables -A ВПЕРЕД -i eth0 -o eth2 -m состояние
   --state СВЯЗАН, УСТАНОВЛЕН -j ПРИНЯТЬ
# / sbin / iptables -A ВПЕРЕД -i eth2 -o eth0 -j ПРИНЯТЬ
  

Теперь вы должны использовать NAT.Вы можете проверить это, выполнив эхо-запрос внешнего адреса с одного из ваших внутренних хостов. Последний шаг — убедиться, что это установка сохраняется после перезагрузки. Очевидно, вам следует делать только последние два шаги, если ваш тест прошел успешно.

Вам нужно будет отредактировать /etc/sysctl.conf и изменить строку, в которой говорится net.ipv4.ip_forward = 0 с до net.ipv4.ip_forward = 1 . Обратите внимание, как это похоже на шаг номер один? По сути, это указывает вашему ядру выполнить первый шаг при загрузке.

Хорошо, последний шаг для пользователей Fedora / RHEL. Чтобы ваша система сохранила правила iptables, которые мы устанавливаем на втором шаге, вам необходимо настроить iptables правильно. Вам нужно будет отредактировать / etc / sysconfig / iptables-config и убедитесь, что IPTABLES_MODULES_UNLOAD , IPTABLES_SAVE_ON_STOP и IPTABLES_SAVE_ON_RESTART все установлены в «да».

Для пользователей, не использующих Fedora / RHEL, вы можете просто настроить сценарий инициализации для этого или просто добавьте эти команды в существующий файл rc.локальный сценарий, так что они выполняется при загрузке. Или, если вы хотите получить еще больше фантазии, вы можете использовать команды iptables-save и iptables-restore для сохранения / восстановления текущего состояния ваших правил iptables.

После всего этого вам, вероятно, следует выполнить тестовую перезагрузку, чтобы убедиться, что что вы все сделали правильно. Если вы обнаружите какие-либо ошибки на этой странице или это не сработает для вас, пожалуйста, напишите мне напрямую на [email protected]

Общие проблемы

Самая распространенная проблема или вопрос, который я получаю по этому поводу, связана с DNS.Приведенные выше инструкции настраивают сеть для маршрутизации пакетов за вас, но если ваш DNS неправильно настроен (или вообще) вы не сможете ссылаться на сайты по их домену или именам хостов. Если сначала вы думаете, что это не работает для вас, пожалуйста, попробуйте пинговать внешний IP-адрес. Если вы можете это сделать, то ваша проблема это с DNS, а не с iptables.

Связанные книги

.

Проект документации Linux


Информация о LDP
FAQ
Манифест / лицензия
История
Волонтеры / сотрудники
Должностные инструкции
Списки рассылки
IRC
Обратная связь

Автор / внести вклад
Руководство для авторов LDP
Внесите свой вклад / помогите
Ресурсы
Как отправить
Репозиторий GIT
Загрузок
Контакты

Спонсор сайта LDP
Мастерская

LDP Wiki : LDP Wiki — это отправная точка для любой незавершенной работы
Члены | Авторы | Посетители
Документы

HOWTO : тематическая справка
последние обновления | основной индекс | просматривать по категориям
Руководства : более длинные и подробные книги
последние обновления / основной индекс
Часто задаваемые вопросы : Часто задаваемые вопросы
последние обновления / основной индекс
страницы руководства : справка по отдельным командам (20060810)
Бюллетень Linux : Интернет-журнал
Поиск / Ресурсы

Ссылки
Поиск OMF
Объявления / Разное


Обновления документов
Ссылка на HOWTO, которые были недавно обновлены.

.

NAT с Linux и iptables

Введение

Преобразование сетевых адресов обычно включает в себя «перезапись адресов источника и / или назначения IP-пакетов при их прохождении через маршрутизатор или брандмауэр» (из http://en.wikipedia.org/wiki/Network_Address_Translation)

Это руководство должно объяснить, что такое преобразование сетевых адресов, для чего его использовать и как его настроить под Linux (или, в более общем смысле, производных от Unix).Это введение не претендует на полноту или охват всех деталей, его основная цель — дать читателю представление о том, что возможно и имеет смысл в современных компьютерных сетях, а что нет.

В первую очередь рассмотрим структуру IP-пакета. После краткого обзора возможностей ядра (Linux-) я перейду сразу к основной области применения NAT, а именно к подключению частной подсети к Интернету с помощью маршрутизатора (в нашем случае Linux-машина с iptables). .После этого я хотел бы представить некоторые дополнительные возможности, такие как перенаправление или обход прокси-серверов с ограничениями. Тем не менее, я не утверждаю, что представленные мной решения являются самыми умными, самыми мощными или самыми гениальными, их, скорее, следует понимать как доказательство концепции.

Пакеты в сети

Прежде чем мы начнем управлять пакетами, мы должны взглянуть на их основные атрибуты. Я ограничусь рассмотрением IP-пакетов, использующих TCP / UDP для транспортного уровня, так как они наиболее распространены.

Подробное описание структуры IP-пакетов можно найти в разных местах, например IPv4 в Википедии. Наше основное внимание будет уделено двум полям Source Address и Destination Address , поскольку они содержат — nomen est omen — IP-адреса источника и назначения соответственно.

После получения IP-пакета получатель должен назначить данные процессу, который играет роль транспортного уровня, в нашем случае TCP и UDP.Еще раз дополнительную информацию можно найти в разных местах, например, TCP в Википедии и UDP в Википедии и на связанных ресурсах. Для наших целей достаточно знать, что каждый (сетевой) процесс использует свой собственный номер (а) порта. Например, http-сервер использует порт 80, SSH использует порт 22 и так далее. Комбинация IP-адреса и номера порта называется сокетом и является уникальной. Поэтому соединения однозначно определяются своими конечными точками (= сокетами), соединение отправляет данные из сокета клиента в сокет сервера и наоборот, например, из сокета с IP 123.123.123.123, порт 65432 к сокету с IP 112.112.112.112, порт 80, так как это может произойти для браузера на 123.123.123.123, который подключается к http-серверу на 112.112.112.112. Серверные процессы обычно используют стандартизированные порты, так называемые «хорошо известные порты», см. хорошо известные порты в IANA или хорошо известные порты в Википедии. Клиент обычно использует порт из верхнего диапазона портов (больше 1023).

Linux и Netfilter

Ядро Linux обычно представляет собой структуру фильтрации пакетов, называемую netfilter (исходная страница проекта: netfilter.org). Эта структура позволяет машине Linux с соответствующим количеством сетевых карт (интерфейсов) стать маршрутизатором, поддерживающим NAT. Мы будем использовать командную утилиту iptables для создания сложных правил модификации и фильтрации пакетов. Важные правила, касающиеся NAT, — что неудивительно — можно найти в таблице ‘nat’. В этой таблице есть три предопределенных цепочки: PREROUTING , OUTPUT и POSTROUTING .

Цепи PREROUTING и POSTROUTING являются наиболее важными.Как следует из названия, цепочка PREROUTING отвечает за пакеты, которые только что прибыли на сетевой интерфейс. Пока решение о маршрутизации не принято, поэтому еще не известно, будет ли пакет интерпретироваться локально или будет ли он переадресован на другую машину, расположенную на другом сетевом интерфейсе. После того, как пакет прошел цепочку PREROUTING, принимается решение о маршрутизации. Если получателем является локальный компьютер, пакет будет направлен соответствующему процессу, и нам больше не придется беспокоиться о NAT.В случае, если получатель находится в (подсети), расположенной в другом сетевом интерфейсе, пакет будет перенаправлен на этот интерфейс при условии, что машина настроена для этого. Непосредственно перед тем, как наш перенаправленный пакет покидает машину, он проходит цепочку POSTROUTING и затем уходит через сетевой интерфейс. Для локально сгенерированных пакетов есть небольшая разница: вместо прохождения через цепочку PREROUTING он передает цепочку OUTPUT, а затем переходит в цепочку POSTROUTING.

Прежде чем мы начнем манипулировать пакетами, мы должны активировать необходимые функции. Чтобы получить всю необходимую функциональность, команды (без символа ‘$>’ в начале, строки, начинающиеся с ‘#’, являются комментариями)

   #

   #
   $>  эхо "1"> / proc / sys / net / ipv4 / ip_forward 
   
   #
   #
   #
    
   #
   $>  modprobe ip_tables 
   
   #
   #
   $>  modprobe ip_conntrack 

   #
   $>  modprobe ip_conntrack_irc 

   #
   $>  modprobe ip_conntrack_ftp 

 

должно хватить.В случае сообщений об ошибках вполне вероятно, что у вас нет функций маршрутизации, встроенных в ваше ядро, и вам, например, следует взглянуть на http://www.comptechdoc.org/os/linux/usersguide/linux_ugipmasq.html.

Пример: подключение частной подсети к Интернету с помощью NAT

С одной стороны, мы знаем, как выглядят IP-пакеты, с другой стороны, мы готовы манипулировать пакетами в Linux (и других производных от Unix). Поэтому мы готовы к нашему первому применению! Самый популярный вопрос, касающийся NAT, — это вопрос о совместном использовании подключения к Интернету для компьютеров в частной подсети.По этой причине я хочу начать с этого конкретного сценария.

Аналог: Несколько субарендаторов без собственных почтовых адресов

Сначала мы должны рассмотреть следующий точный аналог, который, будем надеяться, намного легче понять: Предположим следующую ситуацию: есть домовладелец с несколькими субарендаторами. Почтальон не имеет представления о субарендаторах и отклонит каждое письмо, адресованное непосредственно одному из субарендаторов. У арендодателя есть несколько голубятней, которые можно использовать для адресации.Субарендаторы имеют возможность поместить свои письма в почтовый ящик в офисе арендодателя, который затем отнесет письма в почтовое отделение. Теперь возникает вопрос: как все субарендаторы могут в полной мере участвовать в любом виде почтовой переписки (т.е. отправлять и получать письма)?

Одно из решений данной проблемы заключается в следующем: арендодатель берет письма, отправленные субарендаторами, назначает каждому субарендатору голубятню и затем заменяет адрес субарендатора (который в некотором смысле недействителен, поскольку почтальон отклоняет любые ответы) на адрес собственный адрес домовладельца, включая номер голубятни.Получатель такого письма затем отправит ответ арендодателю, включая номер голубятни, и затем арендодатель может легко передать его (после того, как он заменил свой адрес адресом субарендатора, чтобы субарендатор не распознал этот « обман » ) письмо согласованному субарендатору. Это решение оптимально в том смысле, что оно полностью прозрачно для субарендаторов, никто из них никогда не заметит, что почтальон не может отправлять письма напрямую субарендаторам!

От проблемы субарендатора к компьютерному миру

NAT работает аналогично проблеме субарендатора, упомянутой выше.Каждое семейство субарендаторов представляет собой IP-адрес в локальной сети, каждый член семьи субарендаторов представляет номер порта, домовладельцы представляют маршрутизатор, а получатель действует как произвольный компьютер в Интернете. Следовательно, сокет можно рассматривать как комбинацию адреса и голубятни или семейства субарендаторов и члена этого семейства. Подведем итоги: процесс общения выглядит следующим образом:

  • Субарендаторы должны опустить свои письма в почтовый ящик в офисе арендодателя
  • Арендодатель заменяет адрес отправителя своим собственным, включая номер голубятни
  • После получения ответа домовладелец должен заменить свой адрес (включая номер голубятни) на адрес соответствующего субарендатора.

На самом деле ситуация в локальной сети примерно такая же:

  • Все компьютеры в локальной сети («клиенты») отправляют свои пакеты с сокетом получателя на маршрутизатор (это фактически реализуется путем установки маршрутизатора в качестве стандартного шлюза на клиенте, затем доставка осуществляется с использованием Ethernet или любого другого более низкого уровня. протокол уровня).
  • Маршрутизатор заменяет сокет отправителя собственным, неиспользуемым сокетом.
  • Ответы на этот конкретный сокет будут перенаправлены на соответствующий компьютер в локальной сети, заменяя адрес получателя (сокет маршрутизатора) на клиентский сокет.

Предположим, что стандартный шлюз настроен правильно у каждого клиента. Осталось только настроить роутер. К счастью, структура netfilter автоматически добавляет к каждому правилу его обратное правило, поэтому нам нужно установить только одно явное правило. Обычно решение по одному из этих двух правил принимается путем принятия решения с более низким уровнем неопределенности. Например, правило «Заменить адрес отправителя для всех пакетов из локальной подсети» намного проще, чем «если клиент что-то отправил на сервер, а затем заменить получателя в ответе сервера чем-то».Можно использовать практическое правило, согласно которому первым выполняется правило, которое явно задано в ядре.

Как установить правила

Все, что нам нужно, это следующее: пакеты, поступающие из локальной сети с IP-адресом получателя где-то в Интернете, должны быть изменены так, чтобы адрес отправителя был равен адресу маршрутизатора. Для дальнейших примеров команд предположим, что первый интерфейс «eth0» подключен к локальной сети, а маршрутизатор подключен к Интернету через второй интерфейс «eth2».Команда для общего интернет-соединения тогда просто:

   #
   $>  iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE 
 

Эту команду можно объяснить следующим образом:

iptables: утилита командной строки для настройки ядра
-т нац выберите таблицу «nat» для настройки правил NAT.
-A РАЗМЕЩЕНИЕ Добавить правило в цепочку POSTROUTING (-A означает «добавить»).
-о eth2 это правило действительно для пакетов, которые уходят на второй сетевой интерфейс (-o означает «вывод»).
-j МАСКЕРАД действие, которое должно произойти, — «замаскировать» пакеты, т.е.е. замена адреса отправителя на адрес роутера.

Некоторые дополнительные комментарии к приведенной выше инструкции команды: пакеты, генерируемые самим маршрутизатором, также маскируются, потому что они также проходят цепочку POSTROUTING! (см. иллюстрацию выше). Однако, поскольку ядро ​​пытается сохранить исходные порты неизменными, а процессы, запущенные на маршрутизаторе, получают только свободные порты, локально сгенерированные пакеты обычно остаются неизменными, хотя правило выполняется.Выходной интерфейс может быть любого типа, также возможны интерфейсы ISDN или DSL (часто «ppp0» или «ippp0»). Быстрый обзор всех доступных сетевых интерфейсов дает

Недостатки использования NAT

Локальные компьютеры могут подключаться к Интернету, но с некоторыми ограничениями. Компьютер, расположенный в Интернете, не может установить соединение с локальным компьютером, все, что он может сделать, — это адрес (порт) маршрутизатора и надеяться на лучшее.Обычно адресный порт в настоящее время не используется, поэтому пакет будет отклонен. Даже если порт в настоящее время используется локальной машиной, пакет может быть переадресован, но затем обычно будет отклонен, поскольку компьютер уже обменивается данными с другим компьютером. Таким образом, установить соединение из Интернета с одним из локальных компьютеров практически невозможно. Для обычных служб можно статически сопоставить порты маршрутизатора с сокетами в локальной сети, например, можно настроить маршрутизатор для пересылки пакетов, поступающих на порт 80, на HTTP-сервер, расположенный в локальной сети.Очень часто это необходимо для онлайн-игр, особенно если вы хотите проводить игры.

Подробнее iptables

Теперь, когда мы справились с нашей первой задачей, пора поближе взглянуть (или два) на возможности iptables . Вызов iptables имеет следующий шаблон:

    #
      iptables [-t  таблица ]  команда  [ шаблон соответствия ] [ действие ] 

 

Для NAT всегда нужно выбирать таблицу nat .Команде могут потребоваться дополнительные параметры, например шаблон и действие, которое необходимо выполнить в случае совпадения шаблона.

Выбор стола

Все наши команды относительно NAT будут начинаться так:

    #
    #
      iptables -t нат [...] 
 

Выбирает таблицу nat . Есть еще две таблицы, а именно mangle и filter , но они не используются для NAT, поэтому я упоминаю их только для полноты картины.Поскольку таблица по умолчанию — , фильтр , мы должны каждый раз снова выбирать таблицу nat .

Команды

Наиболее важными командами являются следующие: (дальнейшие шаблоны и действия снова сокращаются до […])

    #
    #
    
    #
    $>  iptables -t nat -A  цепочка  [...] 

    #
    $>  iptables -t нат -L 

    #
    $>  iptables -t nat -D  цепочка   myindex  

    #

    $>  iptables -t nat -F  цепочка  
 

Для получения полного списка всех возможных команд я рекомендую страницы руководства iptables.Чтобы просмотреть их, просто введите

и выйдите, набрав «q».

Выбор шаблонов совпадений

Чтобы управлять определенными пакетами, мы должны использовать соответствующие шаблоны соответствия, поэтому существует множество опций для их указания. Я представлю самые популярные из них, чтобы прояснить их использование. Все доступные шаблоны соответствия можно найти на страницах справочника iptables .

    #
    #
    #

    #
    $>  iptables -t nat -A РАЗМЕЩЕНИЕ -p tcp -s 192.168.1.2  [...]  

    #
    $>  iptables -t nat -A РАЗМЕЩЕНИЕ -p udp -d 192.168.1.2  [...]  

    #
    $>  iptables -t nat -A PREROUTING -s 192.168.0.0/16 -i eth0  [...]  

    #
    $>  iptables -t nat -A PREROUTING -p! tcp -s! 192.168.1.2  [...]  
    
    #
    $>  iptables -t nat -A POSTROUTING -o eth2  [...]  

    #
    #
    #
    $>  iptables -t nat -A РАЗМЕЩЕНИЕ -p tcp -s 192.168.1.2 \ 
         --sport 12345: 12356 -d 123.123.123.123 --dport 22  [...]  
 

Для большинства переключателей существует длинная форма, например — источник вместо -s . Их использование делает всю инструкцию длиннее, но более читабельной, особенно если вы новичок в iptables.

Действия для согласованных пакетов

Мы уже можем выбрать нужные пакеты, осталось только соответствующее действие.Для nat-таблицы значимы только действия SNAT , MASQUERADE , DNAT и REDIRECT , все они имеют перед ‘ -j ‘. Их точное значение будет объяснено в следующем разделе.

    #
    #

    #
    $>  iptables [...] -j SNAT --to-source 123.123.123.123 

    #
    $>  iptables [...] -j MASQUERADE 

    #
    $>  iptables [...] -j DNAT - к месту назначения 123.123.123.123:22 

    #
    $>  iptables [...] -j REDIRECT --to-ports 8080 
 

Разъяснение возможных действий

Теперь объяснено большинство параметров iptables, и пришло время более подробно рассмотреть четыре возможных действия:

Source-NAT (SNAT) — статическое изменение отправителя

В нашем предыдущем примере подключения локальной сети к Интернету мы уже использовали Source NAT (сокращенно: SNAT).Как следует из названия, адрес отправителя изменяется статически. Причина выбора MASQUERADE в предыдущем примере в любом случае имеет следующую причину: Для SNAT необходимо явно указать новый IP-адрес источника. Для маршрутизаторов со статическим IP-адресом SNAT — лучший выбор, потому что он быстрее, чем MASQUERADE, который должен проверять текущий IP-адрес исходящего сетевого интерфейса при каждом пакете. Поскольку SNAT имеет значение только для пакетов, покидающих маршрутизатор, он используется только в цепочке POSTROUTING.

    #
      --to-source  [- ] [: порт-порт] 

 
MASQUERADE — Изменить отправителя на IP-адрес маршрутизатора

Используя цель MASQUERADE, каждый пакет получает IP-адрес исходящего интерфейса маршрутизатора. Преимущество перед SNAT в том, что динамически назначаемые IP-адреса от провайдера не влияют на правило, нет необходимости принимать правило. Для обычного SNAT вам придется менять правило каждый раз при изменении IP-адреса исходящего интерфейса.Что касается SNAT, MASQUERADE имеет значение только в рамках POSTROUTING-цепочки. В отличие от SNAT, MASQUERADE не предлагает дополнительных возможностей.

Destination-NAT (DNAT) — Смена получателя

Если вы хотите изменить получателя пакета, выберите NAT назначения (DNAT)! DNAT можно использовать для серверов, работающих за брандмауэром. Очевидно, что получатель должен быть изменен до того, как будут приняты какие-либо решения о маршрутизации, поэтому DNAT имеет смысл только в цепочке PREROUTING и цепочке OUTPUT (для локально сгенерированных пакетов).

    #
      --to-destination  [- ] [: порт-порт] 
 
REDIRECT — Перенаправить пакеты на локальный компьютер

Особый случай DNAT — ПЕРЕНАПРАВЛЕНИЕ. Пакеты перенаправляются на локальный порт маршрутизатора, например, обеспечивая прозрачное проксирование. Что касается DNAT, REDIRECT действует в цепочке PREROUTING и OUTPUT соответственно.

    #
      --to-ports <порт> [- <порт>] 

 

Приложения

Возможно, вы были сбиты с толку загадочными инструкциями, использованными в первом примере (подключение локальной сети к Интернету).Теперь, после некоторых пояснений, инструкции, надеюсь, стали немного яснее, чем раньше. Вопрос мог измениться с «Как кто-то может создать такие загадочные инструкции» на «Хорошо, и что я могу сделать со всеми этими загадочными инструкциями?». В этом разделе мы попытаемся дать вам несколько идей о том, как использовать NAT. Спектр приложений более того неограничен, но я постараюсь охватить наиболее распространенные варианты использования.

Прозрачный прокси

Предположим, что у нас есть локальная сеть, подключенная к Интернету через NAT.Чтобы снизить трафик, мы хотели бы запустить HTTP-прокси на порту 8080 локального сетевого интерфейса, обрабатывающего весь http-трафик.

Первое решение, которое приходит на ум, — «мотивировать» каждого пользователя (т. Е. Делать это самостоятельно), чтобы настроить свой браузер на использование прокси-сервера, а затем заблокировать весь исходящий трафик на порт 80. Это может быть удовлетворительным решением для небольших сетей, но не масштабируется для больших сетей, потому что вам придется заботиться о каждом клиенте! (По крайней мере, вы избегаете недостатков прозрачного проксирования…)

С NAT у нас есть другая возможность: все входящие пакеты, идущие на порт 80, будут перенаправлены на порт 8080. Команда:

    #
    #
    $>  iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
       -j REDIRECT --to-ports 8080 
 

Конечно, HTTP-прокси на порту 8080 должен быть запущен.Возможно, для вашего прокси-сервера потребуются какие-то особые настройки (или даже специальная компиляция) для поддержки прозрачного проксирования. Недостатками прозрачного проксирования являются более высокая загрузка процессора (особенно для действительно больших сетей) и некоторые проблемы со старыми или очень простыми браузерами.

Помогите! Я использую ограничительный брандмауэр!

Перед тем как начать, я должен разместить предупреждение:

Каждый должен самостоятельно проверить, нарушают ли следующие шаги какие-либо существующие условия использования, ПРЕЖДЕ, чем он или она применит одну из представленных методик! Вы используете следующие команды на свой страх и риск; Я не несу ответственности за ущерб или штрафы, возникшие в результате ненадлежащего использования следующих команд и методов!

Хотя вы этого и не ожидаете, но NAT может даже помочь вам в таком случае! Предположим, что из вашей локальной сети доступны только несколько портов.Прежде всего, нужно найти эти открытые порты. Одна из широко распространенных утилит — это nmap: (пожалуйста, сканируйте только свои собственные компьютеры, сканирование неизвестных компьютеров может быть интерпретировано как первый шаг к вторжению!)

    #
    #
    $>  nmap www.example.com 
 

На выходе будут отображаться различные порты, большинство из них будут в состоянии «закрыто» (на этом порте нет службы), другие будут в состоянии «отфильтрованы» (нет соединения с этим портом), возможно, некоторые из них находятся в состоянии «открыто». (служба работает).Предположим, что все порты ниже 5000 закрыты, кроме порта 80, но есть порты, начинающиеся с 5000, которые могут быть достигнуты. Чтобы установить соединение с любым портом ниже 5000 на произвольную машину, вам понадобится (Linux-) машина, которая расположена за пределами брандмауэра (независимо от того, где она доступна и сама не ограничена брандмауэром), которая может быть доступным и поддерживающим NAT (iptables).

Прежде всего, мы должны получить доступ к этой машине (предположим, IP 111.111.111.111) за пределами брандмауэра. Мы используем любую рабочую станцию ​​за пределами брандмауэра для установления SSH-соединения с 111.111.111.111. Затем выдаем команду

    #
    $>  iptables -t nat -A PREROUTING -p tcp --dport 5000 -j REDIRECT --to-ports 22 
 

Теперь мы можем вернуться на нашу машину за ограничительным брандмауэром и получить доступ к 111.111.111.111 через SSH на порт 5000. В качестве альтернативы вы можете настроить свой SSH-демон для работы на порту 5000.Однако теперь вы можете настроить удаленную машину соответствующим образом. Чтобы подключиться к порту 110 (POP3) на компьютере 123.123.123.123, введите команду

    #
    $>  iptables -t nat -A PREROUTING -p tcp --dport 5001 \
       -j DNAT - в пункт назначения 123.123.123.123:110 
       
    #
    $>  iptables -t nat -A РАЗМЕЩЕНИЕ -p tcp --dport 110 \
       -j МАСКАРАД 
       
 

Вместо последней команды MASQUERADE также возможен SNAT ( -j SNAT —to-source 111.111.111.111 ), но поскольку мы являемся единственным пользователем этого подключения, это не имеет значения, поэтому я выбрал MASQUERADE, потому что он короче и проще в использовании.

Мы можем подключаться ко всем остальным портам точно так же, пока у нас достаточно открытых портов. Таким образом можно перенаправлять даже безопасные соединения (например, IMAPS), предупреждения о сертификате безопасности следует игнорировать (если мы знаем, что делаем!). Для POP3-соединения, указанного выше, вам все равно придется соответствующим образом настроить свой почтовый клиент, тогда ваш почтовый сервер будет 111.111.111.111, порт 5001.

Если наш «провайдер» запускает прокси для подключений к порту 80 (то есть провайдер использует прозрачный прокси) и отслеживает контент, а мы с этим не согласны, тогда NAT может снова нам помочь. Предполагая, что обход прокси-сервера не запрещен, мы можем настроить прокси-сервер (настроенный для прозрачного проксирования) на 111.111.111.111, порт 5002. После этого вы вводите на своем локальном компьютере следующую команду:

    #
    $>  iptables -t nat -A ВЫХОД -p tcp --dport 80 \
       -j DNAT - пункт назначения 111.111.111.111: 5002 
 

Таким образом вы успешно обошли прокси провайдера! ( На мой взгляд, обойти прозрачный прокси-сервер с помощью прозрачного прокси — это очень модно! 🙂 ) В качестве альтернативы вы можете снова настроить свой браузер вручную, чтобы использовать новый прокси, но это все равно может привести к некоторым проблемам с другими программами . Однако ручная настройка браузера, по крайней мере, позволит избежать недостатков прозрачного прокси.

Чтобы закрыть это приложение, я хочу резюмировать наши шаги: Сначала мы находим открытый порт для SSH-соединения. Затем мы статически перенаправляем другие открытые порты в нужные места назначения (обычно один из них не использует такое количество серверов, отличных от HTTP). Если удастся выполнить это перенаправление динамически, то двух открытых TCP-портов (один для SSH) и одного открытого UDP-порта будет достаточно для подключения почти к каждому порту на каждой машине, единственным недостатком будет то, что у вас может быть только одно соединение на время (по протоколу).

Запуск сервера за NAT-маршрутизатором

Для серверов, работающих за NAT-маршрутизатором, необходимы дополнительные действия, так как сначала вы не можете подключиться к серверу извне. Предположим, у нас есть HTTP-сервер с IP 192.168.1.2, а наш маршрутизатор имеет IP-адрес 192.168.1.1 и подключен к Интернету через свой второй сетевой интерфейс с IP 123.123.123.123. Для доступа к HTTP-серверу извне наберите

    #
    $>  iptables -t nat -A PREROUTING -p tcp -i eth2 --dport 80 -j DNAT --to 192.168.1.2 
 

, и все готово. Теперь вы можете получить доступ к HTTP-серверу извне по IP 123.123.123.123.

Статьи по теме

Подобные темы можно найти по ссылке:

Заключительные слова, подтверждение и т. Д.

Инфраструктура netfilter очень мощная, но все же довольно проста в настройке, если вы привыкнете к синтаксису.Многие задачи могут быть выполнены, и хотя на первый взгляд команды кажутся непонятными, после некоторой практики они распадаются на очень хорошо структурированные шаблоны, позволяющие быстро и просто администрировать.

Я хотел бы поблагодарить каждого жесткого читателя, которому это удалось до этих строк 🙂 Далее я благодарю свой ноутбук с SUSE 10.1, который не разбился при написании этой статьи.

Так как мой родной язык не английский, я очень рад всем советам, как улучшить определенные слова / предложения / отрывки! Что касается технической части, не стесняйтесь использовать модуль комментариев ниже или написать мне электронное письмо (используйте мой контактный адрес или), если у вас есть какие-либо предложения, пожелания или жалобы.

Комментариев:

Очень полезно

Доброе утро из Испании. Я хочу связаться с вами, потому что я взял некоторые правила iptables из вашего блога и использую их в своем блоге: https://freelifeblog.wordpress.com/2013/09/19/iptables-reglas-contra-fuerza-bruta-escaneos/

Правила, которые я использовал от вас, в вашем сообщении есть ссылки: http://www.karlrupp.net/en/computer/nat_tutorial

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

Извините за то, что посоветовал вам позже, но я не мог этого сделать раньше.

С уважением

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

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

Бро, ты мужчина!

это полезно

Лучшая статья о NAT в Интернете .. Тупица !!!

Великолепное объяснение

Отличное чтение!

прекрасных работы, поздравляю!
Очень-очень просто и очень-очень-очень хорошо
Вы должны быть хорошим учителем.Хотя это полностью понятно при первом чтении, я думаю, что это лучший учебник, доступный в сети. Я хотел бы, чтобы вы помогли мне решить мою проблему с FTP-прозрачным прокси. Большое спасибо

В разделе «Подключение локальной сети к Интернету», если вы отказываетесь от пересылки в политике по умолчанию:
iptables -P FORWARD DROP
в состоянии:
iptables -A FORWARD -m state —state RELATED, ESTABLISHED -j ACCEPT
не забудь кроме маскировки авторизовать пересылку из своей LAN.Скажем, 192.168.0.0/24 — это локальная сеть вашего хоста, а 192.168.1.0/24 — это локальная сеть, которую вы хотите подключить к Интернету, затем:
iptables -I ВПЕРЕД 1 -s 192.168.1.0/24! -d 192.168.0.0/24 -j ПРИНЯТЬ

большое спасибо за эту замечательную статью

отличная статья с хорошим инструктажем

Большое спасибо за это чудесное объяснение

сэр, я радж,

(пример)

Ethernet 1: я назначаю этот IP

мой IP-адрес в Интернете: 111.119.81.194
Маска подсети: 255.255.255.252
Шлюз по умолчанию: 111.115.81.193

Ethernet 2: назначаю этот ip

мой IP-адрес в локальной сети: 192.168.0.12
Маска подсети: 255.255.255.0
Шлюз по умолчанию: 0.0.0.0

Полезный диапазон IP: 111.115.132.104/29

IP 1: 111.115.132.106 этот LAN IP дает мне моих провайдеров ISP
IP 1: 111.115.132.107
IP 1: 111.115.132.108
IP 1: 111.115.132.109
IP 1: 111.115.132,110

IP шлюза: 111.115.132.105
IP-адрес трансляции: 111.115.132.111

Как привязать полезный диапазон IP к моему частному IP

111.115.132.106 нац 192.168.0.211
111.115.132.107 нац 192.168.0.212
111.115.132.108 нац 192.168.0.213
111.115.132.109 нац 192.168.0.214
111.115.132.110 нац 192.168.0.215

это моя конфигурация таблиц IP

# Создано с помощью iptables-save v1.4.7 вт 30 октября, 16:30:47 2012 г.
* нац
: ПРИНЯТИЕ ПЕРЕДАЧИ [178: 11422]
: ПРИНЯТИЕ РАЗМЕЩЕНИЯ [0: 0]
: ВЫВОД ПРИНЯТЬ [0: 0]
-A PREROUTING -i eth2 -p tcp -m tcp —dport 80 -j DNAT —to-destination 192.168.0.12: 3128
-A PREROUTING -i eth2 -p tcp -m tcp —dport 443 -j DNAT —to-destination 192.168.0.12:3128
-A PREROUTING -d 111.115.132.106/32 -p tcp -m tcp —dport 80 -j DNAT —to-destination 192.168.0.211
-A РАЗМЕЩЕНИЕ -s 192.168.0.0/24 -o eth0 -j МАСКАРАД
COMMIT
# Завершено вт, 30 окт, 16:30:47 2012
# Создано с помощью iptables-save v1.4.7, вторник, 30 октября, 16:30:47 2012 г.
* фильтр
: ВВОД ПРИНЯТЬ [0: 0]
: ПРЯМОЕ ПРИНЯТИЕ [0: 0]
: ВЫВОД ПРИНЯТЬ [6605: 832098]
-A INPUT -m state —state СВЯЗАН, УСТАНОВЛЕН -j ПРИНЯТЬ
-A ВВОД -p icmp -j ПРИНЯТЬ
-A ВВОД -i lo -j ПРИНЯТЬ
-A ВХОД -p tcp -m state —state NEW -m tcp —dport 22 -j ACCEPT
-A ВВОД -p tcp -m tcp —dport 3128 -j ПРИНЯТЬ
-A INPUT -j REJECT —reject-with icmp-host -hibited
COMMIT
# Завершено вт, 30 окт, 16:30:47 2012
Но этот iptables не работал с переводом nat ip

отличная статья.большое спасибо. 🙂

Я хочу, чтобы команды iptables все больше и больше .. я не мог понять iptables, пожалуйста, помогите мне ….

Идеально !!!!

Наша путаница с правилами iptables прояснялась каждый раз, когда мы ссылались на этот пост 🙂

Очень полезно и понятно 🙂

лучшие в сети на сегодняшний день

Отличная статья, Лучшая в сети.

лучший учебник по iptables, который я когда-либо создавал …
u очень хорошо объяснил основы, спасибо

очень хорошо, спасибо

Очень полезный документ для настройки IPTABLES.
www.rhcsolutions.info/rhc

спасибо, очень хорошая статья

очень очень хорошая статья
это так полезно для меня

Великая статья.

Отличная статья. Большое спасибо. Объясняет, как работает NAT, как раз то, что мне нужно.

можете прислать мне на почту, как настроить нат в linux

Очень хорошо объяснено. Отличная работа!!

я хочу конфигурацию дыры прокси-сервера linux

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *