Задача

Разместить web сервер непосредственно на роутере, который находится на частном "сером" IP провайдера и соединен по каналу openVPN с другим роутером, который имеет публичный "белый" IP.

Требования

Настроенный канал openVPN между этими роутерами. Доменное имя зарегистрированное и настроено на публичный IP.

Исходные данные

Пусть роутер, который имеет публичный IP для примера ip_pub=1.2.3.4 на этот адрес и зарегистрирован домен и локальный адрес этого роутера ip_loc=192.168.0.1. На данном роутере установлен сервер openVPN. В дальнейшем этот роутер называем сервер. И пусть роутер, который имеет частный "серый" IP (неважно какой имеет частный IP адрес) по туннелю подключен к серверу для примера IP туннеля для этого роутера на котором предполагается разместить WEB сервер ip_tun=10.8.0.5. В дальнейшем этот роутер называем клиент.

Настройка

На сервере с публичным IP создаем следующую таблицу маршрутизации по порту 80 (HTTP) и порту 443 (HTTPS).

порт 80
iptables -t nat -A PREROUTING --dst 1.2.3.4   -p tcp --dport 80 -j DNAT \
--to-destination 10.8.0.5

DNAT (Destination Network Address Translation) используется для изменения адреса места назначения в IP заголовке пакета. В соответствии с этим правилом, все пакеты, поступающие на 80-й порт адреса 1.2.3.4 перенаправляются на WEB сервер 10.8.0.5 через туннель openVPN. При обращении WEB серверу из внешней сети интернет, все работает отлично. Но при обращении из собственной локальной сети соединение не устанавливается. Для соединения из локальной сети используем следующее

iptables -t nat -A POSTROUTING -p tcp --dst 10.8.0.5 --dport 80 -j SNAT \
--to-source 192.168.0.1

SNAT (Source Network Address Translation), изменение исходящего IP адреса в IP заголовке пакета. Это правило заставляет сервер 192.168.0.1 передавать ответы непосредственно на свой брандмауэр, а затем передать клиенту 10.8.0.5.

Если в качестве самого клиента выступает сам брандмауэр сервера, то пакеты передаются на локальный порт с номером 80 брандмауэра сервера, а не на 1.2.3.4. Для решения этого используем правило:

iptables -t nat -A OUTPUT --dst 1.2.3.4    -p tcp --dport 80 -j DNAT \
--to-destination 10.8.0.5

Аналогичные правила необходимо записать и для порта 443

порт 443
iptables -t nat -A PREROUTING --dst 1.2.3.4   -p tcp --dport 443 -j DNAT \
--to-destination 10.8.0.5
iptables -t nat -A POSTROUTING -p tcp --dst 10.8.0.5 --dport 443 -j SNAT \
--to-source 192.168.0.1
iptables -t nat -A OUTPUT --dst 1.2.3.4    -p tcp --dport 443 -j DNAT \
--to-destination 10.8.0.5

Эти правила необходимо занести после перезапуска правил брандмауэра

После этого нужно пробросить 80 и 443 порт по протоколу TCP на роутер клиента на котором находится WEB сервер по туннелю на адрес 10.8.0.5

После этого необходимо перезагрузить роутер на котором находится сервер openVPN. И наш WEB сервер должен быть доступен как из внешней, так и из внутренней сети по внешнему IP адресу 1.2.3.4.

Cсылки

Руководство по iptables

Добавить комментарий

Предыдущая запись