OpenVPN на Android: прозрачное переключение между WiFi и «Мобильными данными» без разрыва соединений
Здравствуйте, разрешите поделиться своим опытом.
Есть приложения критичные к разрывам связи, переподключение происходит мучительно и вообще не всегда. Поставил перед собой цель, сделать прыжки маршрутов и физических подключений прозрачными, что бы связь была постоянной и TCP коннект не рвался.
И поможет в этом старый, добрый и ламповый «openvpn». Но установка и настройка — тема давно избитая, трогать её, здесь не планируется.
Что нам нужно:
- Сервер Linux с постоянным IP (vps, vds, dedic или просто домашний)
- Openvpn на сервере и клиенте, настроенные на работу по UDP.
- iproute2 — собственно для фокуса нужна работающая утилита ip на Android.
- Так же потребуется внести изменения в исходный код openvpn-settings c последующий сборкой apk.
Приступим
Начнем с правки «openvpn-settings». Суть в том, что при любом изменении в сетевой конфигурации нативному демону openvpn посылается команда SIGUSR1, что заставляет его отключаться и подключаться по новой. Для наших целей это вред, но нам все равно желательно иметь возможность выполнять некоторые действия при изменении сетевой конфигурации.
Кто-то скажет, но ведь есть persist-tun. Отвечаю, работает не так, как хочется, openvpn дергает скрипты «лежать-вставать» каждый раз, когда приходит SIGUSR1. И в принципе отличить по имеющимся переменным перезапуск от старта, без выкрутасов почти не возможно. Это подрывает всю затею, а хочется просто и надежно.
Поэтому мы заменим отправку SIGUSR1 на вызов shell скрипта.
Скачиваем исходники командой
hg clone code.google.com/p/android-openvpn-settings
Открываем файл
\src\de\schaeuffelhut\android\openvpn\service\ManagementThread.java
Находим функцию public void sendSignal(int s) её мы и будем редактировать.
Комментируем отправку SIGUSR1 и вставляем вызов нашего скрипта с правами рут.
Файл скрипта у нас будет называться точно так же как и файл подключения, но дополненный расширением sh.
Должно получится так:
Всё, можно собирать, подписывать, устанавливать. Перед установкой обязательно деинсталлируйте старый «openvpn-setting» из системы.
Далее проверим конфигурации подключения openvpn.
Сервер
На сервере требуется внести директиву float, поскольку мы будем менять физическое соединение, а с ним и IP. Так же сервер должен транслировать внутренний адрес нашего клиента во внешнюю сеть. Для настройки этого мне удобней использовать директивы up и down.
up «/bin/sh /etc/openvpn/androidupdown»
down «/bin/sh /etc/openvpn/androidupdown»
Скрипт должен быть примерно таким:
Клиент
Во первых надо убрать директиву redirect-gateway, если она есть. Но задать up и down с указанием скрипта, который выполнит настройку маршрутов. Если вы помните, мы условились, что имя файла будет повторять имя конфигурации с добавление sh. Да, мы будем вызывать один и тот же скрипт и из демона, и из монитора.
Если конфигурация называется «testconfig.ovpn», то пусть будет так:
up «/system/bin/sh /sdcard/openvpn/testconfig.ovpn.sh»
down «/system/bin/sh /sdcard/openvpn/testconfig.ovpn.sh»
Здесь стоит немного пояснить.
Мы создаем альтернативную таблицу маршрутизации под номером 100 в которой указываем шлюзом по умолчанию vpn туннель. И добавляем правило маршрутизации, которое заворачивает весь трафик в нашу таблицу под номером 100, раньше чем он попадет в основную таблицу под именем main.
В альтернативной таблице есть маршрут, который выталкивает пакеты предназначенные для сервера, обратно в цепочку правил. Далее они попадут в основную таблицу маршрутизации. Там они смогут найти основной маршрут физического соединения. Но, а если не найдут, такое случатся во время реконнектов, то это не страшно. Openvpn может потерпеть некоторое время, но разумеется не вечно. Только сообщения в логах, напомнят об отсутствии связи непродолжительное время.
Не забывайте скрипты должны заканчиваться переводом строки.
Для разрешения запуска скриптов на Android, необходимо установить «Built-in + script» в «Preferences» которые вызываются по долгому тапу на подключении. Теперь можно пробовать.
В результате тестирования оказалось, что некоторые программы сами проверяют состояние сети и пытаются переподключаться во время любых изменений. Тут либо просить авторов исправить ситуацию. Либо самостоятельно де компилировать и исправлять. В любом случае закрытие TCP сессии происходит, не по таймауту, а так как положено.
Буду рад любой критике и замечаниям. Желаю стабильного коннекта!
Источник
Подключение по PPTP с Android.
- Сообщений: 109
- Спасибо получено: 0
Соединил офис и телефон.
Остановился на шаге 3 из vpnki.ru/questions/step-by-step-troubles. le-android-pptp-l2tp :
ping 172.16.x.x ни с телефона в офис, ни с офиса в телефон не проходят (ни IPv4, ни TCP).
ping 172.16.0.1 проходит и с офиса и с телефона.
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
Со страницы vpnki.ru/my-settings/tools-menu/tools проверил, что ping 172.16.x.x проходит и до телефона и до офиса, что ping до маршрутизатора офиса проходит, что веб сервер офиса, находящийся за маршрутизатором офиса, отвечает по внутреннему адресу сети.
Как посмотреть в Android маршруты?
Что посоветуете?
Мой оператор мобильного интернета телефона — «Velcom».
- admin
—>
- Не в сети
- Administrator
- vpnki support
- Сообщений: 3198
- Репутация: 20
- Спасибо получено: 255
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
С сайта по прежнему успешно проходит 172.16.x.x и телефона и компьютера:
к телефону с сайта
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 431.787/750.852/1091.500/246.728 ms, pipe 2
к компьютеру с сайта
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 41.224/42.694/43.651/1.068 ms
Маршруты на телефоне видимо не правильные (смотреть vpnki.ru/settings/router/settings-zyxel-keenetic ) после установки связи с вашим сервером: аналогичные маршрутам маршрутизатора в офисе.
Дополнительно настроил разрешающее правило для входящих ICMPv4 и ICMPv6 подключений в Firewall Windows.
Может быть маршруты должны быть к сети
172.16.0.0 — 172.31.255.255 (маска подсети для бесклассовой (CIDR) адресации: 255.255.0.0 или /16)!
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
Например на маршрутизаторе офиса вижу только маршрут
172.16.0.1/32 0.0.0.0 PPTP0
Предполагаю, что должен быть маршрут
172.16.0.0/16 0.0.0.0 PPTP0
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
Настройте автоматическую выдачу маршрута
172.16.0.0/16 0.0.0.0 PPTP0
.
Также я проверил, что мною прописанные в подключении PPTP в телефоне маршруты в Android не отображаются программой NetStat.
Но они реально создаются. Проверил, что в VPN идёт только трафик с указанных в свойствах VPN соединения маршрутов.
Как добавить шлюз для маршрута в свойствах VPN соединения на Android?
Получается только добавить маршрут без шлюза. Какой синтаксис?
- admin
—>
- Не в сети
- Administrator
- vpnki support
- Сообщений: 3198
- Репутация: 20
- Спасибо получено: 255
Galaxy-Group пишет: Например на маршрутизаторе офиса вижу только маршрут
172.16.0.1/32 0.0.0.0 PPTP0
Предполагаю, что должен быть маршрут
172.16.0.0/16 0.0.0.0 PPTP0
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
Маршрут к сети маршрутизатора на телефоне тоже писать вручную?
x.y.z.k/m 172.16.a.b PPTP0
Маршрут к сети маршрутизатора на каждом маршрутизаторе остальных офисов тоже писать вручную?
x2.y2.z2.k2/m1 172.16.a2.b2 PPTP01
x1.y1.z1.k1/m1 172.16.a1.b1 PPTP02
У меня последние обновления для Keenetic. Неужели все владельцы Keenetic пишут вручную?
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
- admin
—>
- Не в сети
- Administrator
- vpnki support
- Сообщений: 3198
- Репутация: 20
- Спасибо получено: 255
Galaxy-Group пишет: Маршрут к сети маршрутизатора на телефоне тоже писать вручную?
x.y.z.k/m 172.16.a.b PPTP0
Маршрут к сети маршрутизатора на каждом маршрутизаторе остальных офисов тоже писать вручную?
x2.y2.z2.k2/m1 172.16.a2.b2 PPTP01
x1.y1.z1.k1/m1 172.16.a1.b1 PPTP02
У меня последние обновления для Keenetic. Неужели все владельцы Keenetic пишут вручную?
Должны приезжать по DHCP. Мне все приезжает.
- admin
—>
- Не в сети
- Administrator
- vpnki support
- Сообщений: 3198
- Репутация: 20
- Спасибо получено: 255
Galaxy-Group пишет: Постоянно отключается VPN соединение с мобильного телефона.
Почему?
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
И что мне сделать, чтобы получить доступ к домашней сети офисного маршрутизатора с телефона через PPTP с Android при условии, что со страницы инструментов доступ есть, а с телефона с Android нет?
И что мне сделать, чтобы получить доступ к телефону с Android с домашней сети офисного маршрутизатора через PPTP при условии, что со страницы инструментов доступ есть, а с домашней сети маршрутизатора нет?
ICMPv4 в Firewall компьютера разрешён — поэтому ping внутреннего адреса компьютера с установленных VPN соединений должен проходить успешно. Но фигу.
Маршруты прописаны и тут и тут.
Но на всякий случай напишите, какие должны быть маршруты.
Считаю, что проблема по вашей вине: «вы не объединяете мои туннели», «вы объединили все туннели всех пользователей для доступа к ним, но не между собой», вы запретили ICMPv4 на 172.16.0.1.
- Galaxy-Group
Автор темы —>
- Не в сети
- Пользователь заблокирован
- Сообщений: 109
- Спасибо получено: 0
Вот здесь как раз работает.
Вы не ту тему закрыли.
В домашней сети офисного маршрутизатора работает только по PPTP.
Сейчас включён PPTP.
Я же объяснил, что IPSec не устанавливается соединение.
Я заподозрил неверный ключ.
Вы отрицаете неверность ключа и закрываете актуальную тему вместо улаженой.
Офисная сеть подключена к сети, в которой подключение к интернету сейчас имеет адреса такие:
AmigoISP
Состояние Доступ в Интернет
Адрес IPv4
172.20.1.111
Маска подсети 255.255.255.0
Ваших адресов я не знаю.
Вижу, что даёте мне маршрут 172.16.0.0/16 0.0.0.0 PPTP0 автоматически.
Эти сети не пересекаются.
Тем более, что о подключении к интернету вышестоящего маршрутизатора мой офисный маршрутизатор понятия не имеет.
Так что про адреса не актуально.
Сейчас включил IPSec.
Решил прислать журналы событий после включения IPSec. Напомню, что не подключается по IPSec. Напомню, что сейчас мы говорил о Keenetic. И перенесите эти сообщения в тему про IPSec, а эту тему закройте.
Вот лог:
===========================================
Jan 12 23:28:09ndmCore::Syslog: the system log has been cleared.
Jan 12 23:28:29ndmNetwork::Interface::Supplicant: «L2TP0»: authnentication is unchanged.
Jan 12 23:28:29ndmNetwork::Interface::Base: «L2TP0»: description saved.
Jan 12 23:28:29ndmNetwork::Interface::Ppp: «L2TP0»: peer set.
Jan 12 23:28:29ndmNetwork::Interface::Supplicant: «L2TP0»: identity is unchanged.
Jan 12 23:28:29ndmNetwork::Interface::IP: «L2TP0»: IP address cleared.
Jan 12 23:28:29ndmNetwork::Interface::Ppp: «L2TP0»: remote address erased.
Jan 12 23:28:29ndmNetwork::Interface::IP: «L2TP0»: interface is non-global.
Jan 12 23:28:29ndmNetwork::Interface::IP: «L2TP0»: TCP-MSS adjustment enabled.
Jan 12 23:28:29ndmNetwork::Interface::Secure: «L2TP0»: preshared key was set.
Jan 12 23:28:29ndmNetwork::Interface::Ppp: «L2TP0»: disabled connection.
Jan 12 23:28:29ndmNetwork::Interface::PppTunnel: «L2TP0»: try to resolve remote endpoint via 100.100.104.100.
Jan 12 23:28:29ndmNetwork::Interface::PppTunnel: «L2TP0»: remote endpoint is resolved to «193.232.49.4».
Jan 12 23:28:29ndmNetwork::Interface::PppTunnel: «L2TP0»: local endpoint is resolved to «x.x.x.2» (via «GigabitEthernet0/Vlan2»).
Jan 12 23:28:29ndmNetwork::Interface::PppTunnel: «L2TP0»: added host route to 193.232.49.4 via x.x.x.1 (GigabitEthernet0/Vlan2).
Jan 12 23:28:29ndmNetwork::Interface::Base: «L2TP0»: static MTU reset to default.
Jan 12 23:28:29ndmNetwork::Interface::Base: «L2TP0»: network MTU is 1400.
Jan 12 23:28:29ndmNetwork::Interface::L2tp: «L2TP0»: updating IP secure configuration.
Jan 12 23:28:29ndmIpSec::Manager: «L2TP0»: IP secure connection was added.
Jan 12 23:28:29ndmNetwork::Interface::Base: «L2TP0»: interface is up.
Jan 12 23:28:29ndmNetwork::Interface::Base: «L2TP0»: schedule cleared.
Jan 12 23:28:29ndmDns::InterfaceSpecific: static name server list cleared on L2TP0.
Jan 12 23:28:29ndmCore::ConfigurationSaver: saving configuration.
Jan 12 23:28:31ndmIpSec::Manager: create IPsec reconfiguration transaction.
Jan 12 23:28:31ndmIpSec::Manager: crypto map «VirtualIPServer» has different Xauth settings from crypto map «L2TP0».
Jan 12 23:28:31ndmIpSec::Manager: crypto map «VirtualIPServer» has different proposal from crypto map «L2TP0».
Jan 12 23:28:31ndmIpSec::Manager: skip crypto map «L2TP0» due to incompatible settings with crypto map «VirtualIPServer».
Jan 12 23:28:31ndmIpSec::Manager: add config for crypto map «VirtualIPServer».
Jan 12 23:28:31ndmIpSec::Manager: IPsec reconfiguration transaction was created.
Jan 12 23:28:31ndmIpSec::Configurator: start applying IPsec configuration.
Jan 12 23:28:31ndmIpSec::Configurator: IPsec configuration applying is done.
Jan 12 23:28:31ndmIpSec::Configurator: start reloading IKE keys task.
Jan 12 23:28:31ipsec08[CFG] rereading secrets
Jan 12 23:28:31ipsec08[CFG] loading secrets
Jan 12 23:28:31ipsec08[CFG] loaded IKE secret for @mykeenetic.net
Jan 12 23:28:31ipsec08[CFG] loaded IKE secret for cmap:L2TP0
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for XXXX
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl1
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl2
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl3
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl4
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl5
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl6
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl7
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl8
Jan 12 23:28:31ipsec08[CFG] loaded (5) secret for stl9
Jan 12 23:28:31ipsec08[CFG] rereading ca certificates from ‘/tmp/ipsec/ipsec.d/cacerts’
Jan 12 23:28:31ipsec08[CFG] rereading aa certificates from ‘/tmp/ipsec/ipsec.d/aacerts’
Jan 12 23:28:31ipsec08[CFG] rereading ocsp signer certificates from ‘/tmp/ipsec/ipsec.d/ocspcerts’
Jan 12 23:28:31ipsec08[CFG] rereading attribute certificates from ‘/tmp/ipsec/ipsec.d/acerts’
Jan 12 23:28:31ipsec08[CFG] rereading crls from ‘/tmp/ipsec/ipsec.d/crls’
Jan 12 23:28:31ndmIpSec::Configurator: reloading IKE keys task done.
Jan 12 23:28:31ndmIpSec::Configurator: start reloading IPsec config task.
Jan 12 23:28:31ipsec10[CFG] received stroke: delete connection ‘VirtualIPServer’
Jan 12 23:28:31ipsec10[CFG] deleted connection ‘VirtualIPServer’
Jan 12 23:28:31ipsec00[DMN] signal of type SIGHUP received. Reloading configuration
Jan 12 23:28:31ipsec11[CFG] received stroke: add connection ‘VirtualIPServer’
Jan 12 23:28:31ipsec11[CFG] reusing virtual IP address pool 172.20.0.1-172.20.0.65
Jan 12 23:28:31ipsec11[CFG] added configuration ‘VirtualIPServer’
Jan 12 23:28:31ipsec00[CFG] loaded 0 entries for attr plugin configuration
Jan 12 23:28:32ndmIpSec::IpSecNetfilter: start reloading netfilter configuration.
Jan 12 23:28:32ndmIpSec::Configurator: reloading IPsec config task done.
Jan 12 23:28:32ndmIpSec::IpSecNetfilter: netfilter configuration reloading is done.
Jan 12 23:28:33ndmCore::ConfigurationSaver: configuration saved.
Jan 12 23:28:38ndmDhcp::Client: DHCP server is not responding.
Jan 12 23:28:38ndmNetwork::Interface::IP: «GigabitEthernet0/Vlan2»: IP address cleared.
Jan 12 23:28:38nimproxyNDM IGMP/Multicast proxy stopped (exit status: 0).
Jan 12 23:28:38upnpshutting down MiniUPnPd
Jan 12 23:28:38ndmCore::Server: client disconnected.
Jan 12 23:28:40nimproxyNDM IGMP/Multicast proxy (version 0.0.26) started.
Jan 12 23:28:48ndhcpcGigabitEthernet0/Vlan2: received OFFER for x.x.x.2 from x.x.x.1.
Jan 12 23:28:48ndhcpcGigabitEthernet0/Vlan2: received ACK for x.x.x.2 from x.x.x.1.
Jan 12 23:28:49ndmDhcp::Client: configuring interface ISP.
Jan 12 23:28:49ndmNetwork::Interface::IP: «GigabitEthernet0/Vlan2»: IP address is x.x.x.2/24.
Jan 12 23:28:49ndmDhcp::Client: obtained IP address x.x.x.2/24.
Jan 12 23:28:49ndmDhcp::Client: interface «ISP» is global, priority 700.
Jan 12 23:28:49ndmDhcp::Client: adding a default route via x.x.x.1.
Jan 12 23:28:49ndmDhcp::Client: adding name server x.x.x.1.
Jan 12 23:28:49ndmDns::Manager: name server x.x.x.1 added, domain (default).
Jan 12 23:28:49nimproxyNDM IGMP/Multicast proxy stopped (exit status: 0).
Jan 12 23:28:51nimproxyNDM IGMP/Multicast proxy (version 0.0.26) started.
Jan 12 23:28:51ndmCore::Server: started Session /var/run/ndm.core.socket.
Jan 12 23:28:51upnpHTTP listening on port 50650
Jan 12 23:28:51upnpListening for NAT-PMP/PCP traffic on port 5351
===========================================
Возможно эта писанина поможет в решении проблемы с IPSec.
Это журнал с событиями после попытки подключения соединения к вам по IPSec по вашей инструкции для Keenetic для подключения по IPSec.
Источник