NAT-им сеть при помощи iptables

4 мая 2012, 10:05
Практика:
10 Июль 2009 Ky6uk Написать комментарий К комментариям

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

Стоит заметить, что целью статьи не ставилось написание полного руководства по iptables, благо подобных мануалов в интернете предостаточно. Это скорее набор небольших практических советов для конкретных случаев с примерами.
Так же в статье подразумевается, что изначально все таблицы в iptables пусты, то есть не содержат ни одного правила, и по-умолчанию в цепочках стоят разрешающие ACCEPT политики.

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

Включаем форвардинг:
?
# echo 1 > /proc/sys/net/ipv4/ip_forward

Чтобы форвардинг автоматически включался при запуске системы, добавляем в файл /etc/sysctl.conf строку
?
net.ipv4.ip_forward = 1

Условные обозначения:
10.0.0.1/24 — локальный адрес, который требуется «натить»
10.0.0.254/24 — адрес нашей машины, которая будет шлюзом для 10.0.0.1
eth0 — интерфейс на шлюзе с адресом 10.0.0.254/24
eth1 — интерфейс на шлюзе с адресом 192.168.0.1/24
ppp0 — интерфейс на шлюзе с адресом из диапазона 172.27.27.0/24

Делаем доступ на все интерфейсы
?
# iptables -A POSTROUTING -t nat -s 10.0.0.1 -j MASQUERADE

Теперь все соединения от 10.0.0.1 будут перенаправляться согласно нашей таблице маршрутизации.
«-j MASQUERADE» используется в тех случаях, когда есть необходимость перенаправления на интерфейс с динамическим IP адресом. В нашем случае это интерфейс ppp0.

Есть мнение, что в цепочке POSTROUTING при маскараде не рекомендуется указывать параметр «-s„. В замен этому рекомендуется создавать правила в цепочке FORWARD, где и организовывать все перенаправления. Это избавляет от наплыва неверных пакетов с „левых“ адресов, которые форвардятся только в одну сторону и остаются мертвым грузом. Но я не гарантирую что это так и сейчас речь не об этом.

Доступ на конкретный интерфейс.

Рассмотрим вариант, когда необходимо перенаправление на интерфейс с постоянным IP адресом. У нас это eth1.
Воспользуемся стандартной политикой SNAT:
?
# iptables -A POSTROUTING -t nat -s 10.0.0.1 -j SNAT —to 192.168.0.1

В данном случае все соединения от 10.0.0.1 будут перенаправлены на адрес 192.168.0.1.

Слово „перенаправлены“ не совсем верно. Под перенаправлением следует понимать замену исходящего IP адреса (адреса источника) в пакете на указанный в параметре ——to. В нашем случае если исходящий адрес 10.0.0.1, то он будет заменен на 192.168.0.1

Организация обратного доступа

Использование SNAT имеет один недостаток, соединения могут быть инициированы только машиной, находящейся за NAT-ом. Получить же доступ в предыдущем примере из сети 192.168.0.0/24 к 10.0.0.1 уже не получится. Если же требуется организовать такой доступ, то тут на помощь приходит DNAT.
Добавим в iptables следующее правило:
?
# iptables -A PREROUTING -t nat -d 192.168.0.1 -j DNAT —to 10.0.0.1

Теперь любое соединение на адрес 192.168.0.1 будет непосредственно транслироваться в 10.0.0.1. Для правильной работы этого правила необходимо одно из вышеперечисленных.
Заключение

В заключении отмечу несколько дополнительных параметров iptables, которые я использовал при составлении статьи.
Перенаправление одного порта (192.168.0.1:10022 → 10.0.0.1:22):
?
# iptables -A PREROUTING -t nat -d 192.168.0.1 -p tcp —dport 10022 -j DNAT —to 10.0.0.1:22
# iptables -A POSTROUTING -t nat -s 10.0.0.1 -p tcp —dport 22 -j SNAT —to 192.168.0.1:10022

Вывод списка правил таблицы nat с порядковыми номерами:
?
# iptables -L -v —line-numbers -t nat

Удаление правила из цепочки POSTROUTING таблицы nat по его порядковому номеру (4):
?
# iptables -t nat -D POSTROUTING 4

Удаление всех правил в таблице nat:
?
# iptables -F -t nat
Полезные ссылки

NAT и iptables (Как раздать интернет через вторую сетевую карту)
SNAT with iptables
iptables tutorial
Популярное