Проброс порта в 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

