Ранее я уже писал про способ проброс портов, используя portfwd. Сегодня речь пойдет о более сложной для новичков технологии проброса портов – через netfilter в linux. Устанавливать что-то не потребуется, да и с модулями netfilter все должно быть в порядке.
Итак дописывайте примеры в свой конфиг iptables, переносы кода я выделил через “\”
Проброс в локальную сеть через шлюз по умолчанию
Если проброс делается через шлюз по умолчанию (для машины куда он делается), то достаточно одного правила:
#!/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
По материалам сайта http://belgorod.lug.ru