Допустим, есть у вас компьютер с операционной системой Linux на борту, который еще выступает в качестве шлюза (роутера) в вашей локальной сети. Есть у вас другой компьютер, на котором, допустим, крутится сайт, к которому нужно обеспечить доступ из внешнего мира. Задача я думаю ясна – нужно пробросить 80 порт с шлюза до компьютера внутри локальной сети.

Пусть шлюз будет иметь ip адрес 192.168.11.1, а компьютер с сайтом – 192.168.11.2. Внешний адрес шлюза пусть будет 111.111.111.111. Пробрасывать, повторюсь, будем 80 порт. Во внешний мир смотрит интерфейс eth0, в локальную сеть – eth1.

iptables -t nat -A PREROUTING --dst 1111.1111.111.111 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.2

После выполнения этой команды, все что приходит на адрес 111.111.111.111 по 80 порту будет передаваться на адрес 192.168.11.2. Однако, чтобы все работало как надо, нужно еще добавить разрешающее передачу пакетов правило:

iptables -I FORWARD  -i eth0 -o eth1 -d 192.168.11.2 -p tcp -m tcp --dport 80 -j ACCEPT

Теперь любой из внешней сети, набрав в адресной строке ip адрес 123.123.123.123, или связанное с ним доменное имя попадет на 80 порт компьютера 192.168.1.10, который находится внутри локальной сети.

Чтобы клиенты из локальной сети могли зайти по этому же внешнему адресу, и их перекинуло на 80 порт компьютера внутри локальной сети, необходимо добавить так же еще одно правило:

iptables -t nat -A POSTROUTING --dst 192.168.11.2 -p tcp --dport 80 -j SNAT --to-source 111.111.111.111

Так же можно сделать правило на тот случай, если обратиться к этому адресу нужно будет с самого шлюза:

iptables -t nat -A OUTPUT --dst 111.111.111.111 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.2