Проброс порта в iptables

Материал из 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

Ссылки

Личные инструменты