Android openvpn default gateway

Как добавить default route для openvpn client ?

На моей vps работают два openvpn сервера (tun0 и tun1):

Запускаю клиент: openvpn —config 1.ovpn

Клиент запускается с оповещением (http://pastie.org/10929341): NOTE: unable to redirect default gateway — Cannot read current default gateway from system

Как сделать так, чтобы весь трафик c tun0 и tun1 шел через openvpn клиент (tun2)?

openvpn, если и правит, то основную таблицу марштуризации, а ваша задача:

весь трафик c tun0 и tun1 шел через openvpn клиент (tun2)?

уже policy based routing. Судя по тому, что у вас одинаковые ip-адреса на tun0 и tun1, нужно маркировать входящие с них пакеты, сохранять маркер в CONNMARK, отправлять пакеты по маркеру (″ip rule fwmark″) в отдельную таблицу маршрутизации с default маршрутом в tun2, а для всего из tun2 восстанавливать маркер пакета из маркера соединения и отправлять в разные таблицы маршрутизации, с default-маршрутами в tun0 и tun1.

Эта задача для скриптов, вызываемых из openvpn при поднятии соединения.

Одинаковы адреса tun0 и tun1 это не имеет значения. Могу исправить это в openvpn server.conf. Это не критично.

Мне нужно самое простое решение. Думаю, openvz настроена так, что openvpn не может менять таблицу, как он это должен делать по-умолчанию, устанавливая подсеть и стандартный шлюз.

Наверное, тут нужно правило для iptables. Но я не понимаю какое.

Спрошу иначе. Как сделать перенаправление всего трафика хоста на интерфейс tun2 с помощью iptables ?

Есть довольно распространенная практика переопределения default gateway, используемая как раз в VPN, основанная на одном фундаментальном принципе, о котором мало кто помнит:

Просто добавьте эту пару маршрутов и эффективным default gateway станет 10.21.0.125, даже не смотря на ваш:

Большая маска всегда побеждает. При этом, нелишне прописать и статический маршрут к серверу, куда там tun2 коннектится, через «старый» default gateway.

Думаю, openvz настроена так, что openvpn не может менять таблицу,

Подумайте ещё, переведите сообщение openvpn, погуглите, посмотрите исходники openvpn, может что-то приведёт вас к простой истине, что деффект в openvpn, а не в openvz. Раз к tun маршруты прописываются, то default пропишется. Только openvpn хочеть видить маршрут по умолчанию обязательно с указанием ip-адреса шлюза, его категорически не устраивает маршрут вида ″default dev Интерфейс″ без ip-адреса.

сделать перенаправление всего трафика хоста

Вы тут определитесь с задачей. Трафик хоста это то, что он генерирует сам, то есть транспортные пакеты openvpn, внутри которых tun0, tun1, tun2. Вы их хотите завернуть сами в себя? И доступ по ssh это тоже трафик хоста.

Если у вас ip-адреса клиентов, с которых они подключаются к tun0 и tun1 статичный и не изменяются, можете делать, как вам посоветовали, переопределить default и забить маршруты к клиентам/серверу.

Наверное, тут нужно правило для iptables.

iptables не занимается маршрутизацией. Через какой интерфейс пойдёт пакет определяет ″ip rule″ и ″ip route″.

Спасибо за ответы.

Объясню подробнее. Мой vps используется как vpn сервер, я качаю торренты, обхожу цензуру с помощью него и др. Сейчас я хочу запустить на этом vps vpn клиент чтобы затем пользоваться double vpn.

tun0 и tun1 это два устройства для двух разных конфигов моего vpn сервера, они не меняются.

Мне нужно соответствующее перенаправление трафика приходящего с устройств tun0 и tun1 в устройство tun2.

iptables не занимается маршрутизацией

Просто добавьте эту пару маршрутов и эффективным default gateway станет 10.21.0.125

Добавил в конфиг строки

Читайте также:  Как удалить виджеты с андроида навсегда

В маршрутах от этого ничего не изменяется (openvpn log).

нелишне прописать и статический маршрут к серверу, куда там tun2 коннектится

у моего vpn провайдера много серверов и в конфигах они указаны в форме доменных имен, то есть маршрут к серверу может быть не статическим и его не прописать универсально один раз.

По-видимому есть два пути решения задачи. Это скрипт route-up для openvpn с вызовами ip route. И iptables правило для перенаправления трафика. Если с помощью iptables можно это сделать.

Добавил в конфиг строки
В маршрутах от этого ничего не изменяется (openvpn log).

В какой? Вы хоть тему бы прочитали на что ссылка дана была. Удалите в серверном конфиге redirect-gateway добавьте то что я написал. По вашим логам вы этого не сделали.

у моего vpn провайдера много серверов и в конфигах они указаны в форме доменных имен, то есть маршрут к серверу может быть не статическим и его не прописать универсально один раз.

Сорри не дочитал. Так у вас сервер не ваш получается? Если да, то все тоже самое, только поднимаем в скрипте прописанном в конфиге клиента up = /path/script
Или в конфиге клиента
route 0.0.0.0 128.0.0.0
route 128.0.0.0 128.0.0.0

гугл пишет, что iptables занимается маршрутизацией

Он гонит как Троцкий. iptables НЕ занимается маршрутизацией. Для этого есть iproute2, а iptables в помощь.

Изменил конфиг клиента. После запуска openvpn клиента полностью пропадает доступ к vps. Перезагружаю сервер через веб интерфейс, чтобы вернуть доступ.

Источник

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.

Читайте также:  Power manager android что это такое

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 сессии происходит, не по таймауту, а так как положено.

Буду рад любой критике и замечаниям. Желаю стабильного коннекта!

Источник

OpenVPN: создание полноценного openVPN gateway

OpenVPN — это система, позволяющая создавать шифрованные туннели между компьютерами по технологии VPN (Virtual Private Network, виртуальная частная сеть).

Основные плюсы такой модели:

  • Просто: настройка занимает менее часа и не требует специальных знаний.
  • Экономно: трафик сжимается lzo.
  • Безопасно: весь трафик шифруется, а клиенты разделены между собой.
  • Иногда по-другому просто никак. 🙂

Несмотря на эти пункты, нормальной статьи о настройке OpenVPN на Хабрахабре я не нашел. Чтож, попытаюсь исправить это своими силами.

Я специально стараюсь не углубляться в технические подробности, но и расписывать принципы сборки ядра и установки ПО в вашем дистрибутиве не буду — это выходит за пределы статьи.

За основу возьмем OpenVPN-2.0.9 и Gentoo Linux в качестве сервера и Linux либо Windows в качестве клиента.

Определися с желаемым.

Примем за основу то, что наш сервер распологается в удаленном датацентре. Т.е. попадать на него мы будет через интернет.

После установки шифрованного туннеля между клиентом и сервером, сервер будет NAT-ить все наши пакеты в Интернет. Также, сервер будет обслуживать DNS и являться firewall-ом для виртуальной локальной сети.

Внешний IP нашего сервера (того, который будет openVPN): 212.212.212.212
Внутренний IP сервера (видимый из туннеля): 10.10.0.1
Пул внутренних адресов openVPN: 10.10.0.2 — 10.10.0.128
Название нашей сети: vpnet
Имя сервера: vpsrv
Имя клиента: vpclient

Зачем нужен внешний IP, думаю, понятно. Внутренний IP нужен для соединения с сервером после поднятия туннеля. Пул адресов — это адреса, которые сервер выдает подключившимся клиентам.
Название сети — это имена конф. файлов и имя сервера в этих конф. файлах. Имена клиента и сервера = имена файлов ключей.

На сервере установлен Gentoo Linux 2008.0, обновленный до последних версий. Ядро — 2.6.29. Вся настройка будет выполняться по SSH.

Настройка ядра.

Замечу сразу, на этом этапе нужно быть крайне осторожным и внимательным. Если кто забыл.

Читайте также:  Навигационный блок android daystar ds 215 для wv tiguan 2

Ядро должно содержать опции ниже на сервере. На клиенте нужны только TUN и ipv4.

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

CONFIG_NF_NAT=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NETFILTER=y
CONFIG_TUN=m

Ну и разумеется поддержка ipv4, сетевой карты и прочего железа. Собираем и устанавливаем ядро. Можно воспользоваться genkernel. Перезагружаемся.

Настройка сервера.

Установка ПО.

Если 🙂 сервер вернулся из ребута, перейдем к установке ПО.

emerge —sync
emerge openvpn bind bind-tools iptables

Ждем, иногда долго. После установки переходим в /etc/init.d/ и выполняем:

ln -s openvpn openvpn.vpnet
rc-update add openvpn.vpnet default
rc-update add named default
rc-update iptables default
./iptables save

Создав symlink на самого себя, мы указали openvpn, что нужно использовать конфигурацию vpnet. В будущем запускаем его только так:

Сейчас запускать не нужно, ибо запускать пока нечего. 🙂
Помимо этого мы добавили iptables, named и openvpn в автозагрузку.

Создадим нужные каталоги и файлы:

mkdir /etc/openvpn/vpnet/
mkdir /etc/openvpn/vpnet/keys
touch /var/log/openvpn.log
touch /etc/openvpn/vpnet.conf

Генерация ключей.

Перейдем в /usr/share/openvpn/easy-rsa/. Откроем файл vars и впишем настроим параметры:

export EASY_RSA=»/usr/share/openvpn/easy-rsa/» #Путь к easy-rsa.
export KEY_CONFIG=»$EASY_RSA/openssl.cnf» #Конфиг OpenSSL
export KEY_DIR=»/etc/openvpn/vpnet/keys» #Каталог, в котором мы будем держать ключи.
export KEY_SIZE=1024 # Размер ключа
export CA_EXPIRE=3650 # Срок действия CA
export KEY_EXPIRE=3650 # Срок действия ключа
export KEY_COUNTRY=»RU» # Двухбуквенный код страны
export KEY_PROVINCE=»XX» # Province, не актуально
export KEY_CITY=»Town» # Город
export KEY_ORG=»Companyname» # Компания
export KEY_EMAIL=»test@mail.ru» # Email

Естественно, значения (компания, путь к ключам и easy-rsa, email) нужно поменять на подходящие вам.

Имопртируем переменные: source ./vars

Теперь создадим ключи.

./clean-all # Убиваем старые ключи, если они были.
openvpn —genkey —secret ta.key # Ключ TLS-auth
./build-dh #Ключ Диффи-Хеллмана.
./pkitool —initca # Certificate Authority для сервера.
./pkitool —server vpsrv # Сертификат сервера.
./pkitool vpclient # Сертификат клиента.

И перенесем остатки в нужное место:

mv ./ta.key /etc/openvpn/vpnet/keys

Все, ключи готовы.

Настройка сервера.

Переходим в /etc/openvpn/, открываем vpnet.conf и пишем туда:

mode server
tls-server
proto tcp-server
dev tap
port 5555 # Порт
daemon
tls-auth /etc/openvpn/vpnet/keys/ta.key 0
ca /etc/openvpn/vpnet/keys/ca.crt
cert /etc/openvpn/vpnet/keys/vpsrv.crt
key /etc/openvpn/vpnet/keys/vpsrv.key
dh /etc/openvpn/vpnet/keys/dh1024.pem
ifconfig 10.10.0.1 255.255.255.0 # Внутренний IP сервера
ifconfig-pool 10.10.0.2 10.10.0.128 # Пул адресов.
push «redirect-gateway def1» # Перенаправлять default gateway на vpn-сервер. Если не нужно — закомментировать.
push «route-gateway 10.10.0.1»
duplicate-cn
verb 3
cipher DES-EDE3-CBC # Тип шифрования.
persist-key
log-append /var/log/openvpn.log # Лог-файл.
persist-tun
comp-lzo

Все опции, в принципе, понятны. Особо важные я отметил комментариями. Пути и названия, адреса — нужно подправить под себя.

Теперь сервер можно запустить командой /etc/init.d/openvpn.vpnet start
Если возникнут проблемы, подробности можно прочитать в log-файле.

Чтобы сервер выпускал наши пакеты во внешнюю сеть нам нужно настроить NAT. Это просто.

Готовим и запускаем iptables:

/etc/init.d/iptables save
/etc/init.d/iptables start

Включаем поддержку IP forwarding:

sysctl net.ipv4.ip_forward=1
echo «sysctl net.ipv4.ip_forward = 1» >> /etc/sysctl.conf

Добавляем правило firewall:

iptables -v -t nat -A POSTROUTING -o EXTERNAL_IF -s VPN_NET/24 -j SNAT —to-source SERVER_IP

EXTERNAL_IF, VPN_NET и SERVER_IP заменить на внешний интерфейс, сеть VPN и внешний (!) IP сервера соответственно.

Снова делаем /etc/init.d/iptables save, чтобы правило применялось при загрузке системы.

Все, можно работать.

Настройка клиента.

Устанавливаем ПО, создаем пути:

emerge openvpn
cd /etc/init.d/
ln -s openvpn openvpn.vpnet-client
rc-update add openvpn.vpnet-client default

mkdir /etc/openvpn/vpnet
mkdir /etc/openvpn/vpnet/client_keys
touch /etc/openvpn/vpnet-client.conf

Берем с сервера файлы:

ca.crt
vpclient.crt
vpclient.key
ta.key

и закидываем их в /etc/openvpn/vpnet/client_keys/ на клиенте.

tls-client
proto tcp-client
remote 212.212.212.212
dev tap
port 5555
cd /etc/openvpn/vpnet
pull
tls-auth /etc/openvpn/vpnet/client_keys/ta.key 1
ca /etc/openvpn/vpnet/client_keys/ca.crt
cert /etc/openvpn/vpnet/client_keys/vpclient.crt
key /etc/openvpn/vpnet/client_keys/vpclient.key
cipher DES-EDE3-CBC
log-append /var/log/openvpn.log
comp-lzo

Опции шифрования и компрессии на клиенте и сервере должны совпадать.

Запускаем клиент. Автоматически установится соединение с сервером, создастся туннель, default gateway — сервер VPN. Если все сделано правильно, то можно ходить в интернет.

Источник

Оцените статью