Сервер в кармане, или просто о сложном!

главная - Статьи - Linux, FreeBSD

Перенаправление (forward) портов iptables

Теги: Linux Настройка сервера Iptables NAT

Предположим, у вас есть веб-сервер в локальной сети, который должен быть доступным из дикого интернета только по https (443/tcp). Причин не использовать VPN или отдельный IP для отдельного сервера может быть много. Например, архитектура сети, отсутствие свободных IP, веб-сервер - гостевая виртуальная машина, а наш шлюз - хост )) Ну, не знаю, сами придумайте ситуацию.

Причем мы хитрые и хотим, чтобы наш веб сервер из интернета не был виден на 443 порту, а был доступен, скажем, на 12938 порту (примерно вот так: https://1.2.3.4:12938). Хотя бы от кучи спам ботов можно будет спастись. Например. Опять же, мотивацию придумайте сами ))

Мы можем и не хитрить с разными портами. Есть мнение, что использование "верхних" портов не очень здорово. Если вам это не нужно, никто не мешает вместо 12938 порта использовать 443 ;)

Итак, мы хотим перенаправить входящие из интернет на порт 12938 на порт 443 сервера в локальной сети.

IPT="/sbin/iptables"

IF_EXT="eth0" # Внешний сетевой адаптер
IF_INT="eth1" # Внутренний сетевой адаптер

IP_EXT="1.2.3.4" # Внешний IP
IP_INT="192.168.1.1" # Внутренний IP

FAKE_PORT="12938" # Фейковый порт, доступен из интернет

LOCAL_SRV="192.168.1.28" # Web сервер в LAN
SRV_PORT="443" # Настоящий порт

# NAT
$IPT -t nat -A PREROUTING -i $IF_EXT -p tcp -d $IP_EXT --dport $FAKE_PORT -j DNAT --to $LOCAL_SRV:$SRV_PORT

# FORWARD
$IPT -A FORWARD -i $IF_EXT -o $IF_INT -d $LOCAL_SRV -p tcp --dport $SRV_PORT -j ACCEPT

PREROUTING

Каждый пакет, попадающий на интерфейс, сначала предварительно обрабатывается. В нашем случае , до того, как шлюз примет решение о маршрутизации (типа, а что с этим делать-то?), всем пакетам, пришедшим на внешний ($IF_EXT) и адресованных шлюзу (примерно так https://1.2.3.4:12938), будет изменен пункт назначения на IP и порт сервера во внутренней сети. Т.е. шлюз "подкорректирует" destination (что-что? Dnat?) пришедшего пакета так, чтобы можно было принять правильное решение о маршрутизации.

/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -d 1.2.3.4 --dport 12938 -j DNAT --to 192.168.1.28:443

Дальше пакет попадет в цепочку FORWARD.

FORWARD

После прохождения цепочки PREROUTING, пакет будет направлен на маршрутизацию - т.е. куда, собственно, пакет должен идти дальше. А дальше идти пакет должен к серверу в локальной сети, на реальный порт https - 443/tcp. Разрешаем отправку данных, попавших на внешний интерфейс, уходящих через внутренний интерфейс на адрес в локальной сети 192.168.1.28 на порт 443.

/sbin/iptables -A FORWARD -i eth0 -o eth1 -d 192.168.1.28 -p tcp --dport 443 -j ACCEPT

Вот и все. После того, как убедитесь, что все работает так, как надо, возможно вы захотите сохранить действующие правила iptables (после перезагрузки ничто не потерятеся):

В CentOS это можно сделать командой:

service iptables save

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?