Главная > Linux > Практика: NAT-им сеть при помощи iptables

Практика: NAT-им сеть при помощи iptables

Возникла необходимость организации 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
Полезные ссылки
VN:F [1.9.3_1094]
Rating: 9.0/10 (3 votes cast)
Практика: NAT-им сеть при помощи iptables, 9.0 out of 10 based on 3 ratings
  • Print
  • PDF
  • Google Bookmarks
  • Twitter
  • Digg
  • del.icio.us
  • Reddit
  • Facebook
  • Identi.ca
  • Slashdot
  • StumbleUpon
Categories: Linux Tags: ,
  1. hedgehog
    13 Июль 2009 в 05:06 | #1
    Использует Firefox 3.1b3 Firefox 3.1b3 на Solaris Solaris

    спасибо, полезная статья, уже нашел применение!

    VA:F [1.9.3_1094]
    Rating: 1.0/5 (1 vote cast)
  2. 25 Январь 2010 в 15:38 | #2
    Использует IceWeasel 3.0.6 IceWeasel 3.0.6 на Debian GNU/Linux Debian GNU/Linux

    побольше бы примеров

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
  1. Пока что нет уведомлений.