Последние пару месяцев я путешествую по Индии и к интернету приходится подключаться где попало — в интернет-кафе, через чей-то беспарольный WiFi, через GPRS. Предвидя это, перед отъездом из дома я решил настроить себе VPN до моего сервера. Выбор пал на OpenVPN. Разумеется, мне хотелось запускать VPN не через командную строку, а удобно, одним-двумя кликами мыши. На ноутбуке стояла Ubuntu 8.10 и я, недолго думая, установил пакет
Я решил использовать OpenVPN в режиме работы со статическими ключами (pre-shared key), потому что у него есть важное преимущество:
А упомянутый плагин просто тупо запускает OpenVPN с жёстко прописанными в коде параметрами, не давая указать нужные. Вначале стал писать патч, но потом понял, что проще выкинуть и найти альтернативное решение.
После некоторых поисков обнаружился апплет tuntun для Gnome, который работает с OpenVPN принципиально другим способом, используя интерфейс управления последнего.
Итак, вначале я поставил себе на ноутбук OpenVPN, далее написал вот такой конфиг:
И написал два скрипта. Первый,
Второй,
Далее, остаётся самое простое: запустить OpenVPN на сервере и ноутбуке, добавить апплет tuntun на панель gnome стандартным способом, он будет выглядеть вот так (отмечен указателем мыши):

Затем добавить VPN в настройки tuntun (правая кнопка мыши → Preferences → Add):

и в результате получается примерно вот что:

Запуск VPN — левая кнопка мыши на апплете, затем выбрать из списка нужный VPN:

Повторный клик на нужном VPN в списке разрывает соединение.
Про настройку OpenVPN на другой стороне писать не буду, т.к. это уже за рамками данной статьи.
Кому понравилось, прошу помочь с кармой — тогда я перенесу статью в тематический блог.
network-manager-openvpn
, надеясь на простую интеграцию с network manager'ом. Оказалось, что этот плагин непригоден для использования.Я решил использовать OpenVPN в режиме работы со статическими ключами (pre-shared key), потому что у него есть важное преимущество:
… it is a handshake-free protocol without any distinguishing signature or feature (such as a header or protocol handshake sequence) that would mark the ciphertext packets as being generated by OpenVPN. Anyone eavesdropping on the wire would see nothing but random-looking data.
Или, говоря по-русски, шифрованные данные выглядят как случайный набор байтов и определить, что это такое, невозможно.А упомянутый плагин просто тупо запускает OpenVPN с жёстко прописанными в коде параметрами, не давая указать нужные. Вначале стал писать патч, но потом понял, что проще выкинуть и найти альтернативное решение.
После некоторых поисков обнаружился апплет tuntun для Gnome, который работает с OpenVPN принципиально другим способом, используя интерфейс управления последнего.
Итак, вначале я поставил себе на ноутбук OpenVPN, далее написал вот такой конфиг:
dev ovpn
dev-type tun
remote 10.10.10.10 5555 udp
nobind
secret /etc/openvpn/vpn.key 1
cipher AES-256-CBC
mlock
link-mtu 500
#mtu-test
mode p2p
ifconfig 192.168.1.2 192.168.1.1
route-up /etc/openvpn/vpn.routeup.sh
comp-lzo
up-delay
down /etc/openvpn/vpn.down.sh
down-pre
persist-key
persist-tun
ping 30
daemon
verb 1
management 127.0.0.1 4444
management-hold
management-signal
И написал два скрипта. Первый,
/etc/openvpn/vpn.routeup.sh
, выставляет правильный роутинг при поднятии туннеля и вписывает локальный DNS в resolv.conf
:#!/bin/sh
vpn="10.10.10.10"
ns="127.0.0.1"
routedown="/etc/openvpn/$dev.routedown.sh"
[ -z "$dev" ] && { echo "should be run by openvpn" >&2; exit 1; }
origgw=`ip route get $vpn |grep ' via ' |sed -re 's/^.*via +([^ ]+).*$/\1/'`
origdev=`ip route get $vpn |grep ' dev ' |sed -re 's/^.*dev +([^ ]+).*$/\1/'`
[ -z "$origdev" ] && { echo "no route to VPN server, something wrong" >&2; exit 1; }
sed -i -e "1 s/^/nameserver $ns # added for OpenVPN\n/" /etc/resolv.conf
if [ -z "$origgw" ]; then
ip route replace $vpn dev $origdev
else
ip route replace $vpn via $origgw dev $origdev
fi
ip route replace default dev $dev
# Assume route to VPN is equal to default route.
if [ -z "$origgw" ]; then
echo "ip route replace default dev $origdev" >$routedown
else
echo "ip route replace default via $origgw dev $origdev" >$routedown
fi
echo "ip route del $vpn" >>$routedown
echo "sed -i -e '/# added for OpenVPN/ d' /etc/resolv.conf" >>$routedown
Второй,
/etc/openvpn/vpn.down.sh
, возвращает роутинг и DNS в исходное состояние:#!/bin/sh
routedown="/etc/openvpn/$dev.routedown.sh"
if [ -f $routedown ]; then
. $routedown
rm -f $routedown
fi
Далее, остаётся самое простое: запустить OpenVPN на сервере и ноутбуке, добавить апплет tuntun на панель gnome стандартным способом, он будет выглядеть вот так (отмечен указателем мыши):

Затем добавить VPN в настройки tuntun (правая кнопка мыши → Preferences → Add):

и в результате получается примерно вот что:

Запуск VPN — левая кнопка мыши на апплете, затем выбрать из списка нужный VPN:

Повторный клик на нужном VPN в списке разрывает соединение.
Про настройку OpenVPN на другой стороне писать не буду, т.к. это уже за рамками данной статьи.
Кому понравилось, прошу помочь с кармой — тогда я перенесу статью в тематический блог.