Как добавить 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.
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.
Настройка ядра.
Замечу сразу, на этом этапе нужно быть крайне осторожным и внимательным. Если кто забыл.
Ядро должно содержать опции ниже на сервере. На клиенте нужны только 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. Если все сделано правильно, то можно ходить в интернет.
Источник