понедельник, 4 января 2010 г.

Бесхитростный переброс портов в Linux, редакция вторая

Неожиданно понадобилось сделать доступным из интернета тестовый сайт, крутящийся на ноутбуке.

И так, что есть что:
192.168.0.4:80 - ip адрес ноутбука, стандартный порт Web сервера.
192.168.0.1 - шлюз в домашней сети.
ip:8080 - внешний ip шлюза и порт, с которого настроим переброс.

Первым делом откроем порт 8080 для всего интернета на шлюзе:
iptables -A INPUT -i ppp+ -p tcp -m tcp --dport 8080 -j ACCEPT
Перечитав нануал по iptables, понял что это откроет локальный порт 8080. Здесь нам это не требуется, поскольку наши пакеты не попадают в цепочку INPUT, а пройдут через FORWARD.

В простейшем случае у нас будет так:
iptables -P FORWARD ACCEPT


Затем введём подмену адреса назначения у всех пакетов, входящих на порт 8080 шлюза:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.4:80

Подменим адрес инициатора соединения на ip шлюза. Без этого веб сервер на 192.168.0.4 будет пытаться отправить ответы напрямую компьютеру в интернете.
iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.4 --dport 80 -j SNAT --to-source 192.168.0.1

Также включим (у меня это уже сделано) форвардинг пакетов:
echo 1 /proc/sys/net/ipv4/ip_forward

Проверяем. It works!