LINUX.ORG.RU
решено ФорумAdmin

Проброс из инета вовнутрь VPN сохранив внешний IP-источник

 , ,


1

1

Есть выделенный сервер и VPN, подключенная к нему:

  inet/eth0    vpn/tun0    vpn/tun0      inet/wan0
--------->SERVER<---------------->VPN-HOST<--------
111.1.1.1    10.8.0.1      10.8.0.6     222.2.2.2

На сервере сделан проброс порта вовнутрь VPN:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5555 -j DNAT --to-destinatination 10.8.0.6:5555

iptables -t nat -A POSTROUTING ! -s 10.8.0.0/24 -d 10.8.0.0/24 -o tun0 -j MASQUERADE

iptables -A FORWARD -i eth0 -o tun0 -p tcp --dport 5555 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

В таком виде проброс работает, но проблема в том, что VPN-HOST видит соединения как будто от 10.8.0.1 (т.е. как бы от SERVER), а не от внешнего ip. Непонятно какой внешний ip подключается! Это происходит из-за маскарада. Если же маскарад отключить, то пакеты от впн-хоста не возвращаются.

Подозреваю, что впн-хост пытается отвечать через свой интернет/wan0, а не через vpn/tun0.

Маршруты на VPN-HOST такие:

route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         192.168.43.1    0.0.0.0         UG    0      0        0 wlan0
10.8.0.1        10.8.0.5        255.255.255.255 UGH   0      0        0 tun0
10.8.0.5        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.1.0     10.8.0.5        255.255.255.0   UG    0      0        0 tun0
192.168.43.0    0.0.0.0         255.255.255.0   U     2      0        0 wlan0

Также может быть, что OpenVPN не пропускает пакеты с внешними ip. А только если адреса принадлежат сети 10.8.0.0/24. Я не понимаю.

Вопросы такие:
1) можно ли на впн-хосте получать пакеты без подменённого ip-источника?
2) как сделать, чтобы пакеты с внешними ip возвращались через tun0, а не пропадали в wan0?
3) как заставить OpenVPN пропускать все пакеты?

★★★★★

Последнее исправление: Novator (всего исправлений: 2)

Кажется я вычилил: затык происходит именно на OpenVPN. Похоже она, действительно, не пропускает пакеты от внешних IP.

Тогда остаётся только 3й вопрос: как заставить OpenVPN пропускать все пакеты?

Novator ★★★★★
() автор топика

Какой-то намёк на решение есть здесь, но у меня не работает.

DNAT не изменяет адрес источника пакета. Поэтому пакеты через VPN приходят к нам с IP-адресом отправителя и, соответственно, на домашнем сервере маршрутизируются не через VPN, а через внешний интерфейс и отбрасываются отправителем (то есть соединение установить не получается). Решается проблема так: Добавляем в /etc/iproute2/rt_tables таблицу маршрутизации, например, 128 VPN. Добавляем в конфиг клиента openvpn up /etc/openvpn/up Пишем скрипт /etc/openvpn/up:

#!/bin/bash
ip route add 0/0 dev tun0 src 10.8.0.6 table VPN
ip route prepend default via 10.8.0.6 table VPN
ip rule add from 10.8.0.6 table VPN

После перезапуска openvpn всё должно работать.

Novator ★★★★★
() автор топика

Подозрение, всё-таки, было верным: проблема в том, что VPN-HOST отвечает на wan0, а не на tun0.

Проблему отчасти решает добавление строки в /etc/openvpn/ccd/client:

push "redirect-gateway def1"

Тогда на клиенте в таблице маршрутизации, основной маршрут заменяется с wan0 на tun0:

0.0.0.0         10.8.0.5        128.0.0.0       UG    0      0        0 tun0
0.0.0.0         222.2.2.2       0.0.0.0         UG    0      0        0 wlan0
10.8.0.1        10.8.0.5        255.255.255.255 UGH   0      0        0 tun0
10.8.0.5        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
128.0.0.0       10.8.0.5        128.0.0.0       UG    0      0        0 tun0
111.1.1.1       222.2.2.2       255.255.255.255 UGH   0      0        0 wlan0
222.2.2.0       0.0.0.0         255.255.255.0   U     2      0        0 wlan0

Соединения с внешними ip начинают проходить, но при этом весь интернет-трафик VPN-HOST поворачивается в tun0. Это тоже не совсем то, что мне надо...

Novator ★★★★★
() автор топика
Последнее исправление: Novator (всего исправлений: 1)

Я почти решил проблему!

Чтобы ответ возвращался на tun0, а не на wan0, на VPN-HOST нужно добавить строчку в файл /etc/iproute2/rt_tables:

128    VPN
Затем на VPN-HOST же дать 3 команды под root:
ip route add 0/0 dev tun0 src 10.8.0.6 table VPN
ip route prepend default via 10.8.0.6 table VPN
ip rule add from 10.8.0.6 table VPN

После чего ответы уходят в tun0! Теперь осталось заставить OpenVPN делать это самостоятельно.

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

Всё! Разобрался!

Как выше было написано:
1) создаём запускаемый скрипт /etc/openvpn/up.sh с командами, которые перечислены
2) добавляем строчку в /etc/openvpn/client на VPN-HOST (моя ошибка была, что я добавлял на сервере):

up /etc/openvpn/up.sh

Вот и всё, при подключении openvpn добавляет хитро-в-банный маршрут в таблицу route на клиенте, и трафик начинает бегать!

Ох уж мне этот ваш линукс!

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

Склепал более простую версию скрипта /etc/openvpn/up.sh:

#!/bin/sh

VPNINT=tun0
VPNIP=10.8.0.6

#ip route add 0/0 dev $VPNINT src $VPNIP table VPN
#ip route prepend default via $VPNIP table VPN
#ip rule add from $VPNIP table VPN

ip rule add from $VPNIP lookup VPN
ip route add default dev $VPNINT table VPN

2 команды вместо 3х.

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

Вот самый правильный скрипт:

#!/bin/sh

VPNINT=tun0
VPNIP=10.8.0.6

ip rule del from $VPNIP
ip route add default dev $VPNINT table VPN
ip rule add from $VPNIP lookup VPN

Иначе маршруты не подчищаются.
Проверять такими командами:

ip rule show
ip route show
ip route show table VPN
ip route show table all

Надеюсь, теперь всё...

Novator ★★★★★
() автор топика
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Novator

Тоже не очень верно. Подсказываю, у rule есть priority куда можно цифирку приписать и по ней удалять. Например

ip rule add priority 30000 from $VPNIP lookup VPN 
ip rule del priority 30000 

А совсем кошерно:
while ip rule del priority 30000 2>/dev/null; do :; done; 

while на случай «а фиг его знает где что сбойнуло а правила будут накапливаться» при большом uptime потом голову будешь ломать.
И так же прописывать в опцию down /etc/openvpn/down.sh

anc ★★★★★
()
Ответ на: комментарий от anc

Хорошие замечания. Но можно «дешевле» сделать :)

Например, строку удаления удвоить, чтоб подчищалось с лихвой :)

ip rule del from $VPNIP
ip rule del from $VPNIP
ip route add default dev $VPNINT table VPN
ip rule add from $VPNIP lookup VPN

Ну а повисшие rule между vpn-соединениями вроде не мешают.

P.S. Кстати, только rule остаются висеть, а route каким-то образом сами подчищаются, когда vpn-соединение разрывается - весьма странное поведение.

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

Хорошие замечания. Но можно «дешевле» сделать :)

В конкретно вашем случае да, но вы же не знаете как через год, два у вас что-то поменяется. Плюс я описывал вариант при динамическом IP, и сорри забыл указать на то что VPNIP VPNINT надо не статикой прописывать а брать из переменных. Да и вообще лишние правила не кошерно.

Кстати, только rule остаются висеть, а route каким-то образом сами подчищаются, когда vpn-соединение разрывается - весьма странное поведение.

Это как раз правильно, а не «странно», интерфейс же упал, странно если бы было наоборот.

anc ★★★★★
()
Ответ на: комментарий от anc

Насчет priority понял.

Самое кошерное было б, если бы проброс порта прописывать только на сервере, не лазая на клиента. А то iptables на сервере крутим, а route на клиенте - это зашквар.

Novator ★★★★★
() автор топика
Ответ на: комментарий от anc

сорри забыл указать на то что VPNIP VPNINT надо не статикой прописывать а брать из переменных

По этой части поясню, в зависимости от настроек как сервера так и клиента, «можно» запустить н-цать копий клиента, пускай и случайно, т.е. по факту получить несколько IP и несколько tun интерфейсов.

anc ★★★★★
()
Ответ на: комментарий от Novator

Самое кошерное было б, если бы проброс порта прописывать только на сервере, не лазая на клиента.

Если я правильно понял вашу задачу, то без вариантов.

route на клиенте - это зашквар.

Почему? Один фиг настройки, как уж они выглядят имхо неважно.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.