Как стать автором
Обновить

Удобный запуск туннеля OpenVPN на ноутбуке

Время на прочтение3 мин
Количество просмотров5.7K
Последние пару месяцев я путешествую по Индии и к интернету приходится подключаться где попало — в интернет-кафе, через чей-то беспарольный WiFi, через GPRS. Предвидя это, перед отъездом из дома я решил настроить себе VPN до моего сервера. Выбор пал на OpenVPN. Разумеется, мне хотелось запускать VPN не через командную строку, а удобно, одним-двумя кликами мыши. На ноутбуке стояла Ubuntu 8.10 и я, недолго думая, установил пакет 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 на другой стороне писать не буду, т.к. это уже за рамками данной статьи.

Кому понравилось, прошу помочь с кармой — тогда я перенесу статью в тематический блог.
Теги:
Хабы:
+11
Комментарии5

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн