Сегодня мы поговорим о хорошо широко применяемой UNIXоидами, но сравнительно малоизвестной цисководам технологии построения виртуальных частных сетей: OpenVPN.
Что собой представляет?
Представляет собой протокол и его реализацию, которую добывают на openvpn.net. Реализация распространяется под свободной лицензией.
Есть еще коммерческая версия с рядом дополнительных возможностей (в частности, автонастройка клиентов), но здесь мы ее не рассматриваем.
Работает на почти любом UNIX (Linux, *BSD, Mac OS X) и Windows. Встроен во Vyatta.
Что умеет?
Протокол работает на сеансовом уровне и использует TCP или UDP. Аутентификация происходит с помощью TLS, шифрование с помощью SSL.
Преимущества:
- Может использовать любой порт TCP или UDP, благодаря чему легко проходит через МСЭ и NAT.
- Может инкапсулировать как сетевой, так и канальный уровень. В последнем случае может быть объединен в мост с другими интерфейсами.
- Может работать как в site-to-site, так и клиент-серверном режиме.
- Site-to-site позволяет одной из сторон иметь динамический внешний адрес.
- В режиме сервера умеет устанавливать клиенту маршруты до своих сетей.
- Поддерживает различные механизмы аутентификации (Pre-shared key, x.509; по логину и паролю в RADIUS, LDAP или системных аккаунтах).
- Сравнительно просто настраивается и отлаживается.
Недостатки:
- Протокол до сих пор не имеет своего RFC или иного стандарта.
- Не поддерживается распространенными аппаратными маршрутизаторами (Cisco, Juniper etc.).
- Требует установки дополнительного ПО на клиентов (установка тривиальна, но все таки).
Пример 1: site-to-site с pre-shared key
Начнем с простого примера: настроим туннель между Vyatta и машиной с RedHat Linux со статическим ключом.
Vyatta
Сгенерируем ключ:
vyatta@vyatta# run vpn openvpn-key generate /etc/tunnel.key Generating OpenVPN key to /etc/tunnel.key Your new local OpenVPN key has been generated
Создаем интерфейс. У OpenVPN на каждый туннель создается отдельный виртуальный интерфейс (что, в общем, удобно с позиции применения на него МСЭ).
edit interfaces openvpn vtun0 set mode site-to-site set local-address 192.168.64.1 # Адрес виртуального интерфейса туннеля на нашей стороне set remote-address 192.168.64.2 # Адрес виртуального интерфейса на другой стороне set local-host 10.91.17.240 # Адрес, на который принимать соединения set protocol tcp-passive # Считаем себя принимающей стороной TCP-соединения set local-port 5555 # Порт, на котором слушать соединения set shared-secret-key-file /etc/tunnel.key # Указываем путь к файлу с ключом
Несколько слов об опции protocol. Она может быть tcp-passive (ждать TCP-соединений), tcp-active (инициировать TCP-соединение) или UDP. В случае с UDP должны быть указаны обе опции local-host и remote-host. Сторона типа tcp-active может иметь только remote-host, сторона tcp-passive только local-host.
Если опция port не установлена, то по умолчанию используется порт 1194. Сторона типа tcp-passive не может иметь remote-port.
Linux
Перемещаем файл с ключом каким-нибудь безопасным методом, например, по SCP. Хотя можно просто прочитать (cat /etc/tunnel.key) и вставить в редактор на удаленной машине, файлы ключей текстовые.
sudo scp /etc/tunnel.key root@10.91.17.10:/etc/openvpn
Теперь пишем конфиг клиента:
dev-type tun # Указывает инкапсуляцию сетевого уровня, на Vyatta так по умолчанию dev tun0 # Указываем имя интерфейса ping 10 # Посылать echo-запрос каждые десять секунд ping-restart 60 # Переподключаться, если не проходит в течение минуты ifconfig 192.168.64.2 192.168.64.1 # Первый адрес локальный, второй удаленный rport 5555 # Порт на удаленной стороне proto tcp-client remote 10.91.17.240 secret /etc/openvpn/tunnel.key
В конфиг можно добавить опцию daemon, в этом случае процесс уйдет в фоновый режим. На этапе настройки и отладки можно ее не включать и видеть весь вывод прямо в консоли.
openvpn /etc/openvpn/tunnel.conf Sun Jan 30 02:49:59 2011 OpenVPN 2.1.1 i386-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] built on Jan 26 2010 Sun Jan 30 02:49:59 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables Sun Jan 30 02:50:00 2011 TUN/TAP device tun0 opened Sun Jan 30 02:50:00 2011 /sbin/ip link set dev tun0 up mtu 1500 Sun Jan 30 02:50:00 2011 /sbin/ip addr add dev tun0 local 192.168.64.2 peer 192.168.64.1 Sun Jan 30 02:50:00 2011 Attempting to establish TCP connection with 10.91.17.240:5555 [nonblock] Sun Jan 30 02:50:01 2011 TCP connection established with 10.91.17.240:5555 Sun Jan 30 02:50:01 2011 TCPv4_CLIENT link local: [undef] Sun Jan 30 02:50:01 2011 TCPv4_CLIENT link remote: 10.91.17.240:5555 Sun Jan 30 02:50:01 2011 Peer Connection Initiated with 10.91.17.240:5555 Sun Jan 30 02:50:02 2011 Initialization Sequence Completed
Соединение поднялось, и ему теперь соответствует интерфейс tun0. Можно убедиться в том, что трафик по нему ходит:
# ping 192.168.64.1 PING 192.168.64.1 (192.168.64.1) 56(84) bytes of data. 64 bytes from 192.168.64.1: icmp_seq=1 ttl=64 time=50.4 ms 64 bytes from 192.168.64.1: icmp_seq=2 ttl=64 time=1.21 ms
На другой стороне логи подключения можно увидеть в «show log|match openvpn».
Заключение
OpenVPN представляет собой достаточно удобный и гибкий протокол. Его можно применять как для дешевых VPN между сетями, так и для вполне серьезных случаев удаленного доступа.
Дальше, надеюсь, рассмотрим клиент-серверный режим и VPN канального уровня.
Ты закрыл мой пробел:) Я про OpenVPN кроме порта 1194 ничего и не знал 🙂
Теперь жду конфига с L2 туннелированием 🙂
добр день.
openVPN классный. Учитывая что встроен в vyatta — классный дважды. Учитывая что в vyatta есть quagga и можно гонять ospf — трижды ура.
интересно было бы попробовать сеть офис + много удаленных филиалов на vyatta. компрессия (для openVPN)опять же, позволит более эффективно использовать каналы. прямо кандидат в аналоги cisco + dmvpn
сайт то мультисайт — такая конфигурация на openVPN возможна?
не тестировали компрессию траффика на предмет производительности (потреблению проца)?
zubastiy: Да, в режиме сервера он может терминировать на себе много туннелей. В том числе гонять трафик между клиентами. С DMVPN у такой конфигурации, правда, мало общего.
Насчет сжатия — если честно, то ни разу не пробовал. Вроде оно должно быть проще шифрования для проца.