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.
В ядре нам понадобится следующий функционал, привожу выдержку из конфига:
Перейдем в /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
Чтобы сервер выпускал наши пакеты во внешнюю сеть нам нужно настроить NAT. Это просто.
Готовим и запускаем iptables:
/etc/init.d/iptables save /etc/init.d/iptables start
и закидываем их в /etc/openvpn/vpnet/client_keys/ на клиенте.
Редактируем /etc/openvpn/vpnet-client.conf:
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 dh /etc/openvpn/vpnet/client_keys/dh1024.pem 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. Если все сделано правильно, то можно ходить в интернет.