OpenVPN

Материал из Etersoft wiki
Перейти к: навигация, поиск

OpenVPN

Пришло время описать OpenVPN. Так как эта статья является второй после IPSec, то писать введение считаю необязательным.

Простая симметричная схема

С точки зрения организации соединения, клиент и сервер поднимают между собой туннель. Функционально клиент от сервера не отличается. Однако применение дополнительных команд push '...' в конфигурационном файле одной стороны избавляет от явного их написания на другой. Рассмотрим простейший случай с авторизацией по статическому ключу. Рисунок прилагается. OpenVPN.jpg

Сначала создадим этот самый ключ:

 # openvpn --genkey --secret static.key

Полученный в результате файл поместим в нужное место (будет явно указано в конфиге).

Теперь сам конфиг ( /etc/openvpn/server.conf ):

dev tun
port 1194
ifconfig 10.10.10.1 10.10.10.2
secret /etc/openvpn/static.key

# Use compression on the VPN link
comp-lzo

# Make the link more resistent to connection failures
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
 
# Run OpenVPN as a daemon and drop privileges to user/group nobody
user nobody
group nobody
daemon
 
# Allow client to reach entire server subnet
route 192.168.0.0 255.255.255.0

# Set logging
log-append /var/log/openvpn.log
status /var/log/openvpn-status.log
verb 3

Комментарии:

  • Некоторые опции являются умолчательными, например порт: 1194 - его можно и не указывать. Кстати, по записям, используется протокол UDP, если указан dev tun, или TCP в случае dev tap. Это важно для правил файерволла, но явно это не проверялось.
  • ifconfig поднимает виртуальные интерфейсы в пространстве tun, т.е. виртуальные шлюзы, на которые должны роутиться запросы из соединяемых в vpn подсетей.
  • Применяемое сжатие и дополнительные записи для пингования - стандартны. Скопировано не глядя.
  • Пользователь nobody должен быть в системе, коль мы его указываем. Обычно, так оно и есть, но можно использовать и другой аккаунт, в чем смысла особого нет.
  • Строка route указывает нашему "серверу", какая реальная подсеть доступна на другой стороне. Без этого окажется доступным только непосредственно "клиентский" компьютер, но не другие в его подсети. (Явно не проверялось).
  • Логи - не сильная сторона OpenVPN. Надо попробовать verb 5 в следующий раз. А на 3-м уровне информация кое-какая есть, но о природе ошибок, с которыми столкнулись, судить (особенно с непривычки) трудно. В status обновляется статистика по трафику, а в log'е - успех или неуспех соединения, временные дисконнекты и т.п.

Аналогично приведу конфигурационный файл другой стороны ( /etc/openvpn/client.conf ):

#remote de01.eterhost.ru
remote 144.76.183.114
port 1194
dev tun
ifconfig 10.10.10.2 10.10.10.1
secret /etc/openvpn/static.key

# Use compression on the VPN link
comp-lzo

# Make the link more resistent to connection failures
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
 
# Run OpenVPN as a daemon and drop privileges to user/group nobody
user nobody
group nobody
daemon
  
# Allow client to reach entire server subnet
route 192.168.1.0 255.255.255.0 10.10.10.1

  
# Set logging
log-append /var/log/openvpn.log
status /var/log/openvpn-status.log
verb 3

Отличия минимальны:

  • remote - явно указывает к кому подключаемся. Аналогичную команду можно применить и на "сервере", если у обеих сторон внешние фиксированные ip.
  • Обратите внимание: адреса в ifconfig поменялись порядком.
  • Здесь в команде route явно указан шлюз (третий параметр, он необязателен). В данном случае это мало что меняет, но полезно указать случай, когда его явное указание имеет важное значение.
Особенности OpenVZ

Если мы поднимаем OpenVPN внутри контейнера, то необходимо ему дать возможность работать с tun-устройством. Кратко (выполнить на стороне хоста):

modprobe tun

CTID=250

vzctl set $CTID --devnodes net/tun:rw --save
vzctl set $CTID --devices c:10:200:rw --save
vzctl set $CTID --capability net_admin:on --save
vzctl exec $CTID mkdir -p /dev/net
vzctl exec $CTID mknod /dev/net/tun c 10 200
Проблемы доступа в подсети

После запуска OpenVPN службы при данных настройках машины стали успешно пинговаться. Причем по разным ip: как из адресного пространства tun (10.10.10.x), так и реальных ip: 192.168.x.y. Однако, это касается только случая когда я делал пинги с машины, на которой поднят OpenVPN-клиент, на машину, где тоже поднят OpenVPN-клиент. Что до других машин - то попытка пинговать или подключиться по ssh к другим машинам подсетей (в обоих направлениях) к успеху не привела: молчание в ответ... Причина оказалась в том, что клиенты VPN подняты НЕ НА ШЛЮЗОВЫХ компьютерах подсетей. Это приводит к тому, что когда, машина получает ping, она должна ответить на него, но куда ? Выяснилось, что на tun-адрес 10.10.10.x, но на неклиентских машинах подсетей нет никакой информации о том, где эти ip находятся, поэтому они отсылают ответ на default gateway. Которые тоже ничего о ни не знают.

To be continued...