Проброс портов (port forwarding) в Linux используя iptables. Проброс портов linux


Проброс портов в Линукс с помощью iptables

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

C его помощью, например, можно достаточно легко организовать локальную сеть с NAT.

Начнем с краткого описания нужных операций в iptables:

Синтаксис: iptables -t *таблица* *команда*

Ключи:-L — список правил-F — удалить все правила-A — добавить правилопример: iptables -t *таблица* -A *цепочка* *правило*-D — удалить правило

пример: iptables -t *таблица* -D *цепочка* *номер правила*

Для сохранения текущих правил выполните:

/etc/init.d/iptables save

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

Для начала нам нужно включить форвардинг:

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

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

  • 1. Доступ в Интернет
  • Предположим, что eth0 подключен к провайдеру и имеет IP-адрес в его подсети, допустим 199.199.199.2.eth2 подключен к компьютеру в локальной сети, которому нужно обеспечить доступ в Интернет через NAT.eth2 имеет адрес 10.10.10.1.IP-адрес компьютера, которому необходимо обеспечить доступ — 10.10.10.2

    Даем доступ интерфейсу eth2 с IP-адреса 10.10.10.2:

    iptables -t nat -A POSTROUTING -s 10.10.10.2 -o eth2 -j MASQUERADE

    или всей подсети:

    iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth2 -j MASQUERADE
  • 2. Проброс порта
  • Взависимости от ситуации внешний порт можно пробросить на локальную машину.

    Например, у нас имеется ftp сервер внутри сети — 10.10.10.2 порт 21,и нам нужно разрешить пользователям подключаться к нему из Интеренета.Внешний адрес — 199.199.199.2, адрес ftp — 10.10.10.2, порт — 21.

    iptables -t nat -A PREROUTING --dst 199.199.199.2 -p tcp --dport 21 -j DNAT --to-destination 10.10.10.2 iptables -I FORWARD -i eth0 -o eth2 -d 10.10.10.2 -p tcp -m tcp --dport 21 -j ACCEPT

    Первое правило добавляется в табицу трасляции (-t nat), оно перенапрявляет пакеты, посланные на порт 21, с адреса 199.199.199.2 на 10.10.10.2.Второе правило разрешает пакетам проходить по данному маршруту.

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

    iptables -t nat -A PREROUTING --dst 199.199.199.2 -p tcp --dport 1024:65535 -j DNAT --to-destination 10.10.10.2 iptables -I FORWARD -i eth0 -o eth2 -d 10.10.10.2 -p tcp -m tcp --dport 1024:65535 -j ACCEPT

    В случае переадресации внешний порт можно изменить, например, с 21 на 4321.Например, нам надо замаскировать сервис так, чтобы при подключении к 199.199.199.2:4321 клиент попадал на 192.168.0.2:21.Для этого добавляем правила:

    iptables -t nat -A PREROUTING --dst 199.199.199.2 -p tcp -m tcp --dport 4321 -j DNAT --to-destination 10.10.10.2:21 iptables -I FORWARD -i eth0 -o eth2 -d 10.10.10.2 -p tcp -m tcp --dport 21 -j ACCEPT

    strong

    pingtool.org

    Проброс портов (port forwarding) в Linux используя iptables

    В этой статье поговорим о том, как можно перебросить порт с одного IP адреса (белого) на другой IP адрес (серый) использую утилиту iptables.

    У нас имеется компьютер под управлением linux, выступающий в роли маршрутизатора с одним внешним интерфейсом для доступа в Интернет и внутренним интерфейсом локальной сети. Требуется пробросить tcp порт (2121) с белого ip-адреса на серый ip-адрес порт (21).

    Чаще всего проброс трафика используется, если мы находимся в локальной сети и от внешнего мира отделены шлюзом. Для того, чтобы открыть доступ для локальных служб (ssh, web, ftp и т.д.), нам необходимо пробросить порты. Поскольку в качестве шлюза мы будем использовать сервер на Linux, то осуществлять данные действия будем с помощью утилиты iptables.

    Алгоритм проброса портов в iptables.

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

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

    Для автоматического включения открываем файл /etc/sysctl.conf и ищем там строку и убираем знак комментария:# net.ipv4.ip_forward=1:

    sudo nano /etc/sysctl.confnet.ipv4.ip_forward=1

    Настройка port forwarding на Linux

    Итак, приступим. Для выполнения поставленной задачи (перенаправление порта 2121 во внутреннюю сеть на порт 21) необходимо добавить следующие правила iptables:

    sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT

    Это правило разрешает прохождение входящих пакетов внутрь сети.

    Теперь опишем форвардинг (forwarding) пакетов:

    sudo iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 --dport 2121 -j DNAT --to-destination 10.0.7.2:21iptables -t nat -A POSTROUTING -p tcp -s 10.0.7.2 --sport 21 -j SNAT --to-source 80.81.82.83:2121

    Первая строка подменяет IP адрес приемника (белый IP) на внутренний (серый IP), а вторая адрес отправителя (серый IP) на внешний (белый IP).

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

    sudo nano /etc/nat

    содержимое файла:

    #!/bin/shПеренаправляем ssh с 2222 на 22 IP-10.0.7.2iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 --dport 2222 -j DNAT --to-destination 10.0.7.2:22iptables -t nat -A POSTROUTING -p tcp -s 10.0.7.2 --sport 22 -j SNAT --to-source 80.81.82.83:2222

    Далее открываем файл interfaces

    sudo nano /etc/network/interfaces

    И добавляем в конце следующую строчку

    pre-up /etc/nat

    Должно получится что то вроде этого

    Посмотреть текущие правила iptables можно с помощью команды:

    iptables -L -t nat

    Пример:

    Chain PREROUTING (policy ACCEPT)target prot opt source destination DNAT tcp -- anywhere 80.81.82.83 tcp dpt:2222 to:10.0.7.2:22Chain POSTROUTING (policy ACCEPT)SNAT tcp -- 10.0.7.2 anywhere tcp spt:ssh to:80.81.82.83:2222

    Вот и все, на этом рассмотрение проброса портов в операционных системах под управлением Linux с помощью iptables завершено.

    Если есть вопросы, то пишем в комментариях и не забываем проголосовать за статью.

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

    Проброс портов (port forwarding) в Linux используя iptables

    5 (100%) 3 votes

    pro-gram.ru

    Маршрутизация проброс портов Linux Ubuntu Server - Мои статьи - Каталог статей

    ла маршрутизации определяют, куда отправлять IP-пакеты. Данные  маршрутизации хранятся в одной из таблиц ядра. Вести таблицы  маршрутизации можно статически или динамически. Статический маршрут --  это маршрут, который задается явно с помощью команды route.  Динамическая маршрутизация выполняется процессом-демоном (routed или  gated), который ведет и модифицирует таблицу маршрутизации на основе  сообщений от других компьютеров сети. Для выполнения динамической  маршрутизации разработаны специальные протоколы: RIP, OSPF, IGRP, EGP,  BGP и т. д.

      Динамическая маршрутизация необходима в том случае, если у вас  сложная, постоянно меняющаяся структура сети и одна и та же машина  может быть доступна по различным интерфейсам (например, через разные  Ethernet или SLIP интерфейсы). Маршруты, заданные статически, обычно  не меняются, даже если используется динамическая маршрутизация.  Для персонального компьютера, подключаемого к локальной сети, в  большинстве ситуаций бывает достаточно статической маршрутизации  командой route. Прежде чем пытаться настраивать маршруты, просмотрите  таблицу маршрутизации ядра с помощью команды netstat -n -r. Вы должны  увидеть что-то вроде следующего

      rigon@ubuntu-comp:~$ netstat -n -r

      Destination Gateway Genmask Flags MSS Window irtt Iface  192.168.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2  192.168.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0  169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth2  0.0.0.0 192.168.254.1 0.0.0.0 UG 0 0 0 eth0  0.0.0.0 192.168.254.1 0.0.0.0 UG 0 0 0 eth2

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

      route -f операция -тип адресат шлюз интерфейс

      Здесь аргумент операция может принимать одно из двух значений: add  (маршрут добавляется) или delete (маршрут удаляется). Аргумент адресат  может быть IP-адресом машины, IP-адресом сети или ключевым словом  default . Аргумент шлюз -- это IP-адрес компьютера, на который  следует пересылать пакет (этот компьютер должен иметь прямую связь с  вашим компьютером). Команда

      route -f

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

      Как правило, бывает необходимо настроить маршрутизацию по  упоминавшимся выше трем интерфейсам:  * локальный интерфейс (lo),  * интерфейс для платы Ethetnet (eth0),  * интерфейс для последовательного порта (PPP или SLIP).

      Локальный интерфейс поддерживает сеть с IP-номером 127.0.0.1. Поэтому  для маршрутизации пакетов с адресом 127.... используется команда:

      route add -net 127.0.0.1 lo

      Если у вас для связи с локальной сетью используется одна плата  Ethernet, и все машины находятся в этой сети (сетевая маска  255.255.255.0), то для настройки маршрутизации достаточно вызвать:

      route add -net 192.168.36.0 netmask 255.255.255.0 eth0

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

      route add default gw 192.168.1.1 eth0

      Опция gw указывает программе route, что следующий аргумент - это  IP-адрес или имя маршрутизатора, на который надо отправлять все  пакеты, соответствующие этой строке таблицы маршрутизации.  Вот немного теории с сайта linuxcenter.ru

      А теперь пример из жизни  Имеются следующие интерфейсы /etc/network/interfaces

      auto lo  iface lo inet loopback  auto eth0  iface eth0 inet static  address 192.168.17.8  hwaddress ether 00:E0:4C:A2:C4:48  netmask 255.255.255.0  broadcast 192.168.17.255  auto eth2  iface eth2 inet static  address 192.168.254.2  netmask 255.255.255.0  gateway 192.168.254.1  broadcast 192.168.254.255

      Интерфейс eth0 это связь с локальной сетью состоящей из 20 подсетей  192.168.1.х-192.168.20.х

      Интерфейс eth2 это связь с ADSL модемом с выходом в интернет. Так  большинство запросов идут в Инет на этом интерфейсе прописываем шлюз  (gateway 192.168.254.1) данный параметр указывает в системе шлюз  по-умолчанию, обращаю внимание, что шлюз надо прописывать только на  одном интерфейсе, иначе в системе появятся 2 маршрута по умолчанию и  естно будет затупление в работе. С интернетом разобрались.

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

      route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.17.254 eth0  route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.17.254 eth0  route add -net 192.168.21.0 netmask 255.255.255.0 gw 192.168.17.254 eth0

      На этом примере маршрутизируются 3 подсети

      Все эти команды и многие другие можно прописать в файлк  /etc/network/interfaces в итоге получится следующее:

      auto lo  iface lo inet loopback  auto eth0  iface eth0 inet static  address 192.168.17.8  hwaddress ether 00:E0:4C:A2:C4:48  netmask 255.255.255.0  broadcast 192.168.17.255  up route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.17.254 eth0  up route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.17.254 eth0  up route add -net 192.168.21.0 netmask 255.255.255.0 gw 192.168.17.254 eth0  auto eth2  iface eth2 inet static  address 192.168.254.2  netmask 255.255.255.0  gateway 192.168.254.1  broadcast 192.168.254.255

      Ну вот и все по аналогии настраиваются любое кол-во маршрутов и  сетевых интерфейсов

    Дополнение 1.

      Обратите внимание

      hwaddress ether 00:E0:4C:A2:C4:48

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

      sudo /etc/init.d/networking restart

    Дополнение 2.

      Следует отметить, что:  1) Для того, чтобы просмотреть таблицу маршрутов достаточно запуска  команды route без параметров или route -n, если в сети нет DNS.  2) Маска может быть записана проще, в виде /x, где x - число единичных  битов, например:

      route add -net 192.168.36.0/24 eth0

      вместо

      route add -net 192.168.36.0 netmask 255.255.255.0 eth0

      Настройки сети размещаются в файле /etc/network/interfaces  При подключение к Inet через VPN (ppp0...), необходимо заменять  маршрут по умолчанию на ppp0.

      А проще указать в файле /etc/ppp/options следующее:

      defaultroute  replacedefaultroute

      тогда маршрут заменяется сам и при отключении восстанавливается.

    Дополнение 3.

      Есть прога, серверная часть которой стоит во внутренней сети, например  Radmin Server, чтобы к нему подключиться клиентская прога (Radmin  Viewer) запрашивает соединение по порту 4799 (например). Все работает  внутри локальной сети. Есть шлюз (с внешним IP), через который  обеспечивает доступ в и-нет всех компов внутренней сети. Теперь  вопрос, как настроить шлюз, чтобы при обращении из вне клиентсокой  частью к IP шлюза по порту 4799, он пробрасывал этот запрос дальше,  например на 192.168.0.2 по томуже порту?

      Для этого есть команда iptables:

      iptables -t nat -D PREROUTING -i <интерфейс> -s <IP откуда будет коннект>   -p tcp --dport 4899 -j DNAT --to-destination 192.168.0.2:4899        Если ограничивать входящие IP не требуется, то опцию -s можно  опустить.  Пример:

      iptables -t nat -A PREROUTING -i vlan1 -s 213.87.34.20/24 -p tcp  --dport 4899 -j DNAT --to-destination 192.168.128.24:4899

      iptables -t nat -A PREROUTING -i eth0 -p udp --dport 3658 -j DNAT  --to-destination 192.168.0.2:3658

    rootmaster.at.ua

    перенаправление портов, проброс портов в linux — I-adept.ru

    Предположим что организация купила какую-то дополнительную биллинговую систему ,у стороннего разработчика, управляющуюся 5 серверами да еще под виндой. Разработчик находится в другой стране и для обслуживания системы ему необходим доступ к этим серверам (к примеру радмином). Кроме того, программеры написали и отлаживают какую-то нужную задачку для корпорации но (как обычно) не знают на каком компе она будет дальше эксплуатироваться , а менять 2 раза в неделю IP компа с задачей у пользователей в локальной сети (но во всех регионах страны) «не есть хорошо».И так приступим к нашей нелегкой работе.

    # cd /usr/ports/net/rinetd/# make install clean

    Теперь создаем наш конфиг для rinetd.

    предположим : внутренние IP 5 серверов 192.168.1.5-9,внешний IP 85.85.85.85,локальный IP любимой фрюки 192.168.1.1Настраиваем радмины на компах слушать на адресе к примеру : 1234.«Блуждающий» сервер прогеров имеет текущий IP 192.168.1.50 и порт для проги 9898.

    # ee /usr/local/etc/rinetd.conf

    85.85.85.85 12341 192.168.1.5 123485.85.85.85 12342 192.168.1.6 123485.85.85.85 12343 192.168.1.7 123485.85.85.85 12344 192.168.1.8 123485.85.85.85 12345 192.168.1.9 1234

    192.168.1.1 9898 192.168.1.50 9898

    Собственно все. И маленькое пояснение структуры записи rinetd:

    например имеем запись 85.85.85.85 8080 192.168.1.2 7777

    Это означает что весь траффик который приходит на внешний адрес нашего сервера (85.85.85.85) на порт 8080 будет перенаправляться на адрес 192.168.1.2 на порт 7777

    # echo ‘rinetd_enable=»YES»` >> /etc/rc.conf# /usr/local/etc/rc.d/rinetd start

    Проверяем

    #sockstat | grep rinetd

    root rinetd 845 4 tcp4 85.85.85.85:12341 *:*root rinetd 845 5 tcp4 85.85.85.85:12342 *:*root rinetd 845 6 tcp4 85.85.85.85:12343 *:*root rinetd 845 7 tcp4 85.85.85.85:12344 *:*root rinetd 845 8 tcp4 85.85.85.85:12345 *:*root rinetd 845 9 tcp4 192.168.1.1:9898 *:*

    Желательно не забыть дописать в IPFW с каких IP разрешон доступ к внешним портам указанным в rinetd (разработчики как правило имеют статичные IP).Даем разработчику внешний IP и порты 1234Х — с указанием на какой комп они попадут.Когда у прогеров опять поменяется IP , меняем 192.168.1.50 на другой и рестартум , а клиенты продолжают соединяться с 192.168.1.1 порт 9898

    i-adept.ru

    Iptables проброс портов

    Понадобилось мне пробросить порт на другую машину с сервачка.. Решение нашел достаточно быстро, однако оно работало как-то через раз..

    Прежде всего расскажу, об ip адресах и интерфейсах:

    eth0 = 256.150.202.108 = внешний ip сервера (ошибка в ip адресе допущена специально, чтобы никого не обидеть)eth2 = 192.168.2.1 = внутренний ip сервера192.168.2.103 = адрес компьютера куда будет пробрасываться порт с сервера256.150.202.108:8080 = порт куда будут обращаться192.168.2.103:80 = порт куда должны попасть

    Т.е. мы заходим по адресу 256.150.202.108:8080, а попадаем сюда: 192.168.2.103:80. Графически это выглядит вот так:

    Схема проброса портов

    Вначале я сделал такие правила:

    # Расшариваем инет iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 256.150.202.108 # проброс портов на внутреннюю машину iptables -t nat -A PREROUTING -p tcp --dst 256.150.202.108 --dport 8080 -j DNAT --to-destination 192.168.2.103:80 iptables -t nat -A POSTROUTING -p tcp --dst 192.168.2.103 --dport 80 -j SNAT --to-source 256.150.202.108:8080

     

    # Расшариваем инет

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

     

    # проброс портов на внутреннюю машину

    iptables -t nat -A PREROUTING  -p tcp --dst 256.150.202.108 --dport 8080 -j DNAT --to-destination 192.168.2.103:80

    iptables -t nat -A POSTROUTING -p tcp --dst 192.168.2.103   --dport 80   -j SNAT --to-source      256.150.202.108:8080

     

    Однако поведение было довольно странное - отправляю запрос, все ок - проброс сработал. Пробую повторить - ничего не работает, до перезагрузки iptables..Т.е. работает, но только один раз..

    В итоге, убил на это два дня, пока методом подбора, не модифицировал правила вот так:

    # Расшариваем инет iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 256.150.202.108 # проброс портов на внутреннюю машину iptables -t nat -A PREROUTING -p tcp --dst 256.150.202.108 --dport 8080 -j DNAT --to-destination 192.168.2.103:80 iptables -t nat -A POSTROUTING -p tcp --dst 192.168.2.103 --dport 80 -j SNAT --to-source 192.168.2.1 iptables -t nat -A OUTPUT -p tcp --dst 256.150.202.108 --dport 8080 -j DNAT --to-destination 192.168.2.103:80

     

    # Расшариваем инет

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

     

    # проброс портов на внутреннюю машину

    iptables -t nat -A PREROUTING  -p tcp --dst 256.150.202.108 --dport 8080 -j DNAT --to-destination 192.168.2.103:80

    iptables -t nat -A POSTROUTING -p tcp --dst 192.168.2.103   --dport 80   -j SNAT --to-source      192.168.2.1

    iptables -t nat -A OUTPUT      -p tcp --dst 256.150.202.108 --dport 8080 -j DNAT --to-destination 192.168.2.103:80

     

    После этого все начало работать так как и ожидалось. Честно сказать, в чем была проблема я до конца и не понял, все же мои познания в iptables, оставляют желать лучшего. Оставлю этот вопрос "на потом". Если кто-то понимает причину, напишите пожалуйста в комментариях..

     

    www.it-rem.ru

    Iptables NAT - проброс порта во внутреннюю сеть

    Если есть необходимость предоставить доступ из интернета к компьютеру, расположенному внутри сети с Linux маршрутизатором, это можно легко сделать с помощью правил iptables.

    С помощью iptables вы можете как выставить наружу определенный порт, так и полностью переадресовать весь внешний трафик к нужному компьютеру.

    Проброс одного порта внутрь сети

    На маршрутизаторе нужно выполнить следующие команды

    sudo iptables -t nat -A PREROUTING -p tcp -d <EXT_IP> —dport <EXT_PORT> -j DNAT —to-destination <LOCAL_IP>:<LOCAL_PORT>sudo iptables -A FORWARD -i eth0 -d <LOCAL_IP> -p tcp —dport <LOCAL_PORT> -j ACCEPT

    После этого при обращении из интернет к внешнему адресу <EXT_IP> и порту <EXT_PORT> вы будете видеть сервис, работающий на компьютере с адресом <LOCAL_IP> и порту <LOCAL_PORT>

    Полная переадресация трафика с внешнего IP

    1) $IFACE — внешний сетевой интерфейс на роутере(например, eth0)2) $NEW_IP — новый IP, на который будем «сажать» «выведенную» машину из локалки(не может же она жить без IP :)(Если провайдер дал Вам больше одного внешнего IP-адреса)3) $BC,$NM,$GW — соответственно, broadcast,netmask,gateway, который выдаётпровайдер(в общих чертах)4) $LOCAL_IP — тоже самое, что и вверху

    Сначала надо сделать alias(у нас же нет третьей сетевой карточки)сетевого интерфейса(все команды — от рута, естественно)

    # ifconfig $IFACE:0 $NEW_IP netmask $NM broadcast $BC# route add $NEW_IP gw $GW netmask 0.0.0.0 metric 1 dev $IFACE:0# iptables -t nat -A PREROUTING -p tcp -d $NEW_IP -j DNAT —to-destination $LOCAL_IP# iptables -A FORWARD -i eth0 -d $LOCAL_IP -j ACCEPT

    Ещё можно написать скрипт, который легко опускает/поднимает DNAT

    —cat-/etc/rc.d/rc.dnat—

    #!/bin/bash$IFACE=eth0$LOCAL_IP=»192.168.1.251″$NEW_IP=»q.w.e.r»$NM=»a.s.d.f»$BC=»z.x.c.v»$GW=»p.o.i.u»

    case «$1» in‘stop’)iptables -D FORWARD -i eth0 -d $LOCAL_IP -j ACCEPTiptables -t nat -D PREROUTING -p tcp -d $NEW_IP -j DNAT —to-destination $LOCAL_IProute del $NEW_IP gw $GW netmask 0.0.0.0 metric 1 dev $IFACE:0ifconfig $IFACE:0 down;;‘start’)ifconfig $IFACE:0 $NEW_IP netmask $NM broadcast $BCroute add $NEW_IP gw $GW netmask 0.0.0.0 metric 1 dev $IFACE:0iptables -t nat -A PREROUTING -p tcp -d $NEW_IP -j DNAT —to-destination $LOCAL_IPiptables -A FORWARD -i eth0 -d $LOCAL_IP -j ACCEPT;;‘restart’)$0 stop &amp;&amp; $0 start;;*)echo «usage $0 start|stop|restart»;;esac

    —end-of-cat—

     

    itman.in

    Проброс порта в iptables — Belgorod Linux User Group

    Материал из Belgorod Linux User Group - Белгород

    Проброс порта в iptables. Или порт-маппинг (port mapping). NAT

    NAT - Network Address Translation - т.е. преобразования сетевых адресов (для транзитных пакетом маршрутизатором посредством iptables).

    Задача: пробросить порт на другую машину. Все правила по умолчанию выставлены в ACCEPT.

    Если проброс делается через шлюз по умолчанию (для машины куда он делается), то достаточно одного правила:

    #!/bin/bash IPTABLES="/sbin/iptables" GW_IP="80.81.82.83" SERVER_IP="192.168.0.107" PORT=80 $IPTABLES -t nat -A PREROUTING -p tcp --dst $GW_IP --dport $PORT -j DNAT --to-destination $SERVER_IP:$PORT echo 1 > /proc/sys/net/ipv4/ip_forward /etc/init.d/iptables save /etc/init.d/iptables start

    Этот случай как правило используется для проброса портов внутрь локальной сети (т.е. вывешивание порта сервера, находящегося внутри локальной сети в сеть во-вне, на "честный" IP).

    В этом случаи у нас правило запускается на шлюзе (GW_IP), которое пробрасывает PORT на SERVER_IP, находящимся внутри сети. Правило будет успешно работать, если у SERVER_IP шлюз по умолчанию (default gw) стоит тот роутер, с которого делается проброс (GW_IP).

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

    #!/bin/bash IPTABLES="/sbin/iptables" GW_IP="192.168.0.91" SERVER_IP="192.168.0.107" PORT=7777 $IPTABLES -t nat -A PREROUTING -p tcp --dst $GW_IP --dport $PORT -j DNAT --to-destination $SERVER_IP:$PORT $IPTABLES -t nat -I POSTROUTING -p tcp --dst $SERVER_IP --dport $PORT -j SNAT --to $GW_IP echo 1 > /proc/sys/net/ipv4/ip_forward /etc/init.d/iptables save /etc/init.d/iptables start

    В данном случаи мы делаем проброс порта с обычной машины (не шлюза) GW_IP на машину SERVER_IP

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

    #!/bin/bash IPTABLES="/sbin/iptables" INET_IP="80.81.82.83" SERVER_IP="192.168.0.107" PORT=25 OUR_NET=192.168.0.0/24 $IPTABLES -t nat -A POSTROUTING -p tcp -s $SERVER_IP --dst ! $OUR_NET --dport $PORT -j SNAT --to-source $INET_IP

    В данном случаи мы разрешаем машине SERVER_IP доступ на PORT, находящийся за пределами OUR_NET от имени INET_IP. В конкретном примере сервер 192.168.0.107 не имеет доступа в интернет, но мы ему открываем 25 порт (smtp) если обращения идут не в подсеть 192.168.0.0/24, то его IP будет подменен на внешний 80.81.82.83. То есть он сможет напрямую отправлять почту (к примеру он у нас почтовый шлюз).

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

    Частным случаем проброса порта из локальной сети в интернет является проброс всех портов для всех локальных машин во-вне (за пределы маски подсети), обычно еще такое понятие называют просто NAT (или сеть "за NAT-ом"). Делается как правило на шлюзе по умолчанию.

    #!/bin/bash IPTABLES="/sbin/iptables" INET_IP="80.81.82.83" OUR_NET=192.168.0.0/24 $IPTABLES -t nat -A POSTROUTING -s $OUR_NET -d ! $OUR_NET -j SNAT --to-source $INET_IP

    В данном случаи мы разрешили доступ через НАТ всей подсети OUR_NET, и во всех пакетах, приходящих на наш шлюз по умолчанию (выходящих за рамки подсети) будет подменен IP на внешний INET_IP, таким образом вся подсеть окажется "за NAT-ом", и имея "серые" IP-шники сможет ходить в интернет от имени одного "честного" IP - INET_IP

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

    iptables -L -n -v -t nat #! /bin/sh /etc/init.d/iptables stop rm /var/lib/iptables/rules-save

    belgorod.lug.ru