Нужно пробросить порт внутрь локальной сети (т.е. вывесить порт сервера, находящегося внутри локальной сети в сеть во-вне, на внешний IP) с помощью iptables.
Проброс в локальную сеть через шлюз по умолчанию (для машины куда он делается).
Исходные данные:
WAN_IP - внешний IP адрес
WAN_PORT - внешний порт
ETH1 - внешний сетевой интерфейс сервера
ETH0 - внутренний сетевой интерфейс сервера
COMP_IP - IP адрес машины (в локальной сети) на которую надо пробросить порт
COMP_PORT - собственно сам порт на локальной машине
xx.xx.xx.xx - IP адрес компа с которого мы будем подключаться
Необходимо в файл
/etc/sysconfig/iptables добавить правила:
-A INPUT -s xx.xx.xx.xx -i ETH1 -p tcp -m tcp --dport WAN_PORT -j ACCEPT
-A FORWARD -s xx.xx.xx.xx -i ETH1 -p tcp -m tcp --dport WAN_PORT -j ACCEPT
Тут я немного не понял:
Везде написано, что достаточно правила FORWARD, однако у нас пакеты не попадали в остальные цепочки - сразу отбрасывались. Возможно из-за каких-то других настроек iptables. Поэтомы мы и дописали правило INPUT.
-s xx.xx.xx.xx - это дополнительная фильтрация входящих пакетов. Так мы сможем подключиться к
WAN_IP:WAN_PORT только с ip=
xx.xx.xx.xx. Сделано для повышения безопасности.
Теперь в таблице NAT нужно добавить правило (в файле
/etc/sysconfig/iptables после строки
*nat):
-A PREROUTING -p tcp -i ETH1 --dport WAN_PORT -j DNAT --to-destination COMP_IP:COMP_PORT
В соответствии с этим правилом, все пакеты, поступающие на
WAN_PORT порт интерфейса
ETH1 перенаправляются на наш внутренний компьютер
COMP_IP:COMP_PORT.
Посмотрим получившиеся правила:
[root@srv /]# iptables -L -n -v
Chain PREROUTING (policy ACCEPT 394 packets, 28084 bytes)
pkts bytes target prot opt in out source destination
1 76 DNAT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:WAN_PORT to:COMP_IP:COMP_PORT
Chain INPUT (2 references)
pkts bytes target prot opt in out source destination
893 58796 ACCEPT tcp -- * * xx.xx.xx.xx 0.0.0.0/0 tcp dpt:WAN_PORT