LINUX.ORG.RU
ФорумAdmin

Рабочий сервер OPENVPN с серым IP за провайдерским NAT. Но есть нюансы

 


0

1

Здравствуйте уважаемые форумчане. Развернул у себя дома на raspberrypi сервер ovpn. Raspberry подключена по wlan0 к домашнему роутеру с серым IP. Домашний роутер подключен к провайдеровскому роутеру с NAT. Проблему «пробития дыры» провайдерского NAT решил довольно просто с помощью общедоступного stun сервера. Соединение клиента ovpn в лице моего телефона pixel происходит и я попадаю в свою локальную сеть, а так же имею выход в интернет через домашний роутер, словно нахожусь дома. Проблема в том, что сессия клиент-сервер активна только до того момента пока не изменится белый IP провайдера, либо пока провайдер не закроет порт ввиду его неактивности. Далее процедуру «пробития» NAT приходится повторять. Проблему поддержания открытого порта со стороны провайдера решается петум создания ovpn-клиента на том же raspberry, где находится сервер ovpn. Клиент на raspberry (его имя pi5) подключается к серверу и таким образом провайдер видит активное соединение и не закрывает порт. Соединение активное, пока не изменится IP. Однако есть проблема, она заключается в том, что при таком соединении я могу с raspberry пропинговать только домашний роутер, больше ничего, выхода в интернет нет. Если подключен только клиент pixel то все работает и я могу с телефона просматривать всю свою локальную сеть и выходить в интернет. Я уверен что проблема в настройках правильного маршрута для клиентов pixel и pi5, но как это сделать я не знаю, мне не хватает знаний, я только начал изучать linux. Прошу помощи в решении этой проблемы.

конфиг сервера

proto udp
port 1194
ca ca.crt
cert raspberrypi.crt
key raspberrypi.key
tls-crypt ta.key

dh none
ecdh-curve prime256v1
topology subnet
server 10.139.139.0 255.255.255.0
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "block-outside-dns"

push "redirect-gateway def1"

client-to-client
client-config-dir /etc/openvpn/ccd
ping 10
inactive 0
remote-cert-tls client
tls-version-min 1.2
cipher AES-256-CBC
auth SHA256
user openvpn
group openvpn
persist-key
persist-tun
crl-verify crl.pem
status /var/log/openvpn-status.log 20
status-version 3
syslog
verb 3

# Generated for use by PiVPN.io

конфиг клиентов

client
dev tun
proto udp
remote 93.125.210.21 3108
resolv-retry infinite
nobind
remote-cert-tls server
tls-version-min 1.2
verify-x509-name raspberrypi name
cipher AES-256-CBC
auth SHA256
auth-nocache
verb 3

в папке ccd два файла для каждого клиента, их содержание

ifconfig-push 10.139.139.2 255.255.255.0 для клиента pixel

ifconfig-push 10.139.139.3 255.255.255.0 для клиента pi5



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

Проблема с маршрутизацией в OpenVPN на Raspberry Pi

Здравствуйте, уважаемые форумчане.

Развернул у себя дома на Raspberry Pi сервер OpenVPN.
Raspberry подключена по wlan0 к домашнему роутеру с серым IP.
Домашний роутер подключен к провайдеровскому роутеру с NAT.

Решение проблемы NAT

Проблему «пробития дыры» провайдерского NAT решил довольно просто — с помощью общедоступного STUN-сервера.
Соединение клиента OpenVPN (в лице моего телефона Pixel) происходит успешно:

  • Я попадаю в свою локальную сеть.
  • Имею выход в интернет через домашний роутер, словно нахожусь дома.

Проблема сессии

Однако сессия клиент-сервер активна только до тех пор, пока:

  • Не изменится белый IP провайдера.
  • Провайдер не закроет порт из-за его неактивности.

Далее процедуру «пробития» NAT приходится повторять заново.

Решение проблемы закрытия порта

Проблему поддержания открытого порта со стороны провайдера решил следующим образом:

  1. Создал OpenVPN-клиента на той же Raspberry, где работает сервер.
  2. Клиент на Raspberry (pi5) подключается к серверу.
  3. Таким образом, провайдер видит активное соединение и не закрывает порт.

Соединение остается активным, пока не изменится IP.

Новая проблема: отсутствие интернета на Raspberry

Однако при таком соединении возникает другая проблема:

  • С Raspberry могу пропинговать только домашний роутер, но не могу выйти в интернет.
  • Если подключен только клиент Pixel, то всё работает:
    • С телефона вижу всю локальную сеть.
    • Могу выходить в интернет.

В чем проблема?

Я уверен, что проблема связана с неверными маршрутами для клиентов Pixel и pi5, но как их правильно настроить, не знаю.
Мне не хватает знаний, я только начал изучать Linux.

Прошу вашей помощи в решени

gagarin0
()
Ответ на: комментарий от Soveregn

Для того чтобы

в конфиге сервера нужно другие маршруты прописать

Надо разобраться с таблицей маршрутизации

С Raspberry могу пропинговать только домашний роутер, но не могу выйти в интернет.

Которая прилетает Rasberry и понять какая она должна быть.

После этого менять конфигурацию openvpn сервера.

gagarin0
()

Скажи клиенту на RPi5 чтобы он не заменял default route. У тебя когда клиент коннектится к серверу в маршруте по умолчанию заменяется gateway с роутера на ВПН, и дописывается отдельный маршрут к серверу ВПН через роутер ибо через него клиент установил соединение. Если клиент и сервер на одной машине то и происходит то, что ты описываешь.

Либо не делай push "route-gateway … " или там redirect-gateway на сервере именно для этого клиента, либо на клиенте какой-нибудь push-filter ignore «redirect-gateway» сделай. Или там route-nopull на клиенте. В общем, почитай man и сделай как больше нравится.

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

я прочитал много статей и руководство по ovpn, но ничего не понял в этих маршрутах, это прям магия какая-то. Можете немного конкретней указать мне что необходимо сделать?

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

В ситуации когда телефон pixel подключен к домашнему wi-fi к которому также подключен сервер ovpn я спокойно с телефона запускаю клиента ovpn и все работает, но если запустить клиента pi5, который на той же машине что и серсер ovpn то интернет пропадает и дальше домашнего роутера ничего не проходит, при этом клиенты pixel и pi5 видят друг-друга и связь стабильна, но без интернета.

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

все что есть после ip route

default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.35 metric 600
10.139.139.0/24 dev tun0 proto kernel scope link src 10.139.139.1
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.35 metric 600default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.35 metric 600
10.139.139.0/24 dev tun0 proto kernel scope link src 10.139.139.1
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.35 metric 600```
Soveregn
() автор топика
Ответ на: комментарий от gagarin0

после routel

Dst             Gateway         Prefsrc         Protocol Scope   Dev              Table
default         192.168.0.1     192.168.0.35    dhcp             wlan0
10.139.139.0/24                 10.139.139.1    kernel   link    tun0
192.168.0.0/24                  192.168.0.35    kernel   link    wlan0
10.139.139.1                    10.139.139.1    kernel   host    tun0             local
10.139.139.255                  10.139.139.1    kernel   link    tun0             local
127.0.0.0/8                     127.0.0.1       kernel   host    lo               local
127.0.0.1                       127.0.0.1       kernel   host    lo               local
127.255.255.255                 127.0.0.1       kernel   link    lo               local
192.168.0.35                    192.168.0.35    kernel   host    wlan0            local
192.168.0.255                   192.168.0.35    kernel   link    wlan0            local
Soveregn
() автор топика
Ответ на: комментарий от Soveregn

Выглядит как и ожидалось, default роутинг у вас смотрит на 192.168.0.1 который прилетел от dhcp

и видно второй роутинг 10.139.139.0/24 который прилетел от openvpn.

А теперь покажите роутинговую таблицу на rasberry когда «интернет» работает и openvpn выключен.

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

после routel

Dst             Gateway         Prefsrc         Protocol Scope   Dev              Table
default         192.168.0.1     192.168.0.35    dhcp             wlan0
192.168.0.0/24                  192.168.0.35    kernel   link    wlan0
127.0.0.0/8                     127.0.0.1       kernel   host    lo               local
127.0.0.1                       127.0.0.1       kernel   host    lo               local
127.255.255.255                 127.0.0.1       kernel   link    lo               local
192.168.0.35                    192.168.0.35    kernel   host    wlan0            local
192.168.0.255                   192.168.0.35    kernel   link    wlan0            local
Soveregn
() автор топика
Ответ на: комментарий от Soveregn

Нет, не могу. Потому что правильное решение зависит от локальных нюансов и т.п. которых никто кроме Вас не знает. Так что придётся разбираться с магией.

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

Я ж написал почему это происходит. Как именно сделать чтобы этого не происходило - исключительно Ваше дело, способов масса, большинство описано в мане openvpn, какой именно из них использовать - решать Вам.

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

выключенный ovpn

 1  192.168.0.1  1.760 ms  1.729 ms  1.759 ms
 2  100.84.0.1  7.126 ms  7.508 ms  7.766 ms
 3  94.233.252.149  9.082 ms 94.233.252.151  9.298 ms 94.233.252.149  9.237 ms
 4  94.233.252.148  9.230 ms  9.222 ms 94.233.252.150  10.125 ms
 5  * * *
 6  * * 72.14.209.89  36.525 ms
 7  8.8.8.8  53.850 ms  55.521 ms  50.953 ms```

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

подключенные клиенты

: NOTE : The output below is NOT real-time!
:      : It may be off by a few minutes.

::: Client Status List :::
Name       Remote IP               Virtual IP        Bytes Received      Bytes Sent      Connected Since
pixel      93.223.220.77:5144      10.139.139.2      222KiB              1.5MiB          18:42:24 1740580944 8 UNDEF
pi5        93.223.220.77:2181      10.139.139.3      2.8KiB              3.5KiB          18:47:18 1740581238 19 UNDEF
Soveregn
() автор топика
Ответ на: комментарий от Soveregn

Вот здесь проблема, выше вы приводили роутинговую таблицу где default gateway 192.168.0.1 при включенном

Dst             Gateway         Prefsrc         Protocol Scope   Dev              Table
default         192.168.0.1     192.168.0.35    dhcp             wlan0
10.139.139.0/24                 10.139.139.1    kernel   link    tun0
192.168.0.0/24                  192.168.0.35    kernel   link    wlan0

надо выяснить почему пакеты не доходят до него.

запустите две консоли, в одной напишите команду tcpdump -i any 'proto \icmp'

во второй, напишите ping -c1 8.8.8.8

и пришлите вывод

так же, будет неплохо если вы пришлете вывод команды sudo iptables-save

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

Спасибо огромное за Вашу помощь. В данный момент у меня пока нет доступа к домашнему компьютеру. Как буду дома обязательно напишу. И вот какая штука получается, сейчас я не дома и мой pixel все еще подключен к ovpn одновременно с клиентом pi5 и интернет есть. ‘‘‘ ::: Client Status List ::: Name Remote IP Virtual IP Bytes Received Bytes Sent Connected Since pixel 81.195.139.141:50981 10.139.139.2 8.3MiB 42MiB 19:15:12 1740582912 29 UNDEF pi5 93.223.221.77:2097 10.139.139.3 2.8KiB 16KiB 18:47:18 1740581238 19 UNDEF ‘‘‘ Я сейчас имею доступ к своему серверу raspberry через ssh с помощью ovpn, но на телефоне крайне не удобно возиться с командной строкой. Интересная ситуация, когда pixel в домашней сети Wi-Fi интернета через VPN нет, если (как сейчас) использую мобильный интернет, то он есть.

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

Основную проблему которую я вижу, что при включенном openvpn

в выводе traceroute -n google.com отсутствует первым хопом дефолтный рорутер из таблицы машртизации

1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  *^C

хотя он есть

Dst             Gateway         Prefsrc         Protocol Scope   Dev              Table
default         192.168.0.1     192.168.0.35    dhcp             wlan0
10.139.139.0/24                 10.139.139.1    kernel   link    tun0

вариантов может быть несколько, но я начал бы с sudo iptables-save

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

Теперь ближайшая задача написать скрипт, который при смене IP либо перезагрузке raspberry или при потере связи останавливал бы сервер и клиента, запрашивал новые данные IP:port у stun сервера, вставлял их в конфиг клиента pi5 и отправлял через телеграмм сообщение на pixel о новом IP:port для подключения, после чего запускал сначала сервер, потом клиент pi5. Дальнейшая задача собрать из исходников приложение ovpn для android, добавив в него скрипт с автоматической синхронизацией новых данных для подключения из телеграмм/почты/Яндекс.диска ну или может чего еще в голову придёт. Всем спасибо за оперативную помощь и подсказки!

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

запрашивал новые данные IP:port у stun сервера, вставлял их в конфиг клиента pi5 и отправлял через

обычно для такого используется dyndns, правда openvpn клиент вроде бы не умеет работать с SRV записями, поэтому возможно тут уже придется что-то скриптом запрашивать.

MirandaUser2
()
Ответ на: комментарий от Vidrele

Мой провайдер берет 250р за это и наотрез отказывается пробросить порт. Зачем платить если можно не платить? К тому же для моих целей периодически иметь доступ к своей локалке этот способ меня устраивает.

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

Тут ведь дело вот в чем: сам сервер ovpn в моем случае (за провайдерским NAT) никак не может узнать внешний IP и порт, потому как он просто закрыт ввиду специфики работы NAT провайдера. Решить проблему с динамическим IP очень просто с dyndns, но вот узнать порт никак не получится. До тех пор пока кто-то (что-то) не пошлет пакет из локальной в глобальную сеть, порт на провайдерском NAT будет закрыт и все входящие пакеты на IP dyndns:1194(порт ovpn по умолчанию) просто будет закрыт и NAT отбросит любой приходящий на этот порт пакет. Чтобы Nat «открыл порт» сначала необходимо изнутри послать любой пакет по порту в направлении глобальной сети. В этом случае на короткое время (в моем случае до 50 с, установлено экспериментально) NAT провайдера сохраняет в своей памяти временную таблицу адресации. Все что прийдет снаружи через открытый порт сопоставится с временной таблицей и входящий пакет перешлется дальше на мой роутер. Проблема в том, что NAT провайдера открывает случайный (первый свободный) свой порт. Т.е. когда я посылаю запрос из 192.168.0.1:1194 на выходе (входе в глобальный интернет) получаю IP_dyndns:2315 (2315 для примера). Но без внешнего помощника узнать этот порт 2315 никак. Тут на помощь приходит stun сервер, который как раз и сообщает нынешний IP:port. Далее эти данные необходимо вставить в конфиг ovpn клиента и осуществить связь. На все про все около минуты.

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

Домик не такой уж и длинный, работа скрипта очень проста. Определить смену IP или отсутствие подключения клиента pi5 -> остановить сервер ovpn (чтоб не занимал порт 1194 в моем случае) -> отправить запрос на stun сервер через порт 1194 -> получить внешний IP:port-> записать этот IP:port в конфиг клиента pi5 и отправить эти данные клиенту pixel любым способом-> запустить сервер ovpn-> запустить клиента pi5, который установит связь с сервером и будет ее поддерживать. Далее в любое время клиент pixel может связаться с сервером имея обновленные данные IP:port. Все довольно просто, а главное работает. В моем случае у провайдера FULL CONE NAT.

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

Ну и зачем этот домик из костылей, когда можно купить внешний IP за копейки?

Ну да, особенно если провайдер это сотовый оператор - обычное дело в сельской местности. Сделал себе вход по IPv6 полученный через teredo и обновляемый в dyndns при получении. Работает,пользуюсь. На том устройстве с которого надо зайти(ноутбук) - тоже нужен IPv6 адрес,тоже получаю через teredo. Работает не быстро,но для ssh достаточно. И даже дома веб-сервер на IPv6 сидит,доступный снаружи.

watchcat382
()
Ответ на: комментарий от Soveregn

OMG, разве я где-то писал, что в твоей схеме можно обойтись без STUN?

Нет, я писал о создании на dyndns SRV записи с ip+порт после «пробития» NAT.

Если бы openvpn поддерживал DNS SRV, то можно было бы использовать её напрямую (но судя по этому [Openvpn-devel,v12] Add DNS SRV remote host discovery support поддержки всё ещё нет).

MirandaUser2
()