VPN с помощью OpenVPN
Вводное слово смотреть в статье Создание vpn туннеля.
Устанавливаем из репозитория сам OpenVPN и документацию к нему. Для дистрибутивов поддерживающих пакет APT команда может выглядеть так:
# apt-get install openvpn openvpn-docs
Если нужно настроить всего одно подключение, т.е. связать два компьютера (шлюза сетей), то настройка будет попроще, для подключения многих клиентов к одному серверу - чуть посложнее.
Содержание
Одно VPN соединение клиент-сервер
Эта инструкция составлена на базе официальной краткой инструкции и по сути ещё более краткий её перевод.
- Создаём ключ:
# openvpn --genkey --secret static.key
- Копируем созданный ключ на сервер и клиент в каталог /etc/openvpn.
- Создаём конфигурационный файл на сервере /etc/openvpn/server.conf:
dev tun ifconfig 10.11.11.1 10.11.11.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 10.9.0.0 255.255.255.0 # Set logging log-append /var/log/openvpn.log status /var/log/openvpn-status.log
- Создаём конфигурационный файл на клиенте /etc/openvpn/client.conf:
remote 81.81.81.1 dev tun ifconfig 10.11.11.2 10.11.11.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 10.0.0.0 255.255.255.0 # Set logging log-append /var/log/openvpn.log status /var/log/openvpn-status.log
У пользователя nobody может быть другая группа. Проверим командой:
# id nobody uid=99(nobody) gid=99(nobody) groups=99(nobody)
- Запускаем openvpn демон на сервере и клиенте:
# /etc/init.d/openvpn start
-Проверяем доступность сетей командой ping. Добавляем openvpn в автозапуск:
# chkconfig openvpn on
На этом всё.
Несколько VPN соединений
Копируем директорию со скриптами /usr/share/doc/openvpn-docs-2.0.9/easy-rsa для AltLinux или /usr/share/doc/openvpn/examples/easy-rsa для Debian в /etc/openvpn/ для более удобного использования. Редактируем файл с переменными /etc/openvpn/easy-rsa/vars и создаём главный единый для всех сертификат (master Certificate Authority (CA) ), которым затем будем подписывать остальные сертификаты:
# source ./vars # ./clean-all # ./build-ca
Скрипт вызывает openssl с соответсвующими ключами и параметрами, создавая подкаталог keys с сертификатом и ключом.
Чтобы создать сертификат вручную нужно было бы запустить команду:
# openssl req -nodes -new -x509 -keyout ca.key -out ca.crt
Создаём для сервера сертификат с ключом и параметры Диффи Хелмана:
# ./build-key-server server # ./build-dh
Создаём сертификат и ключ для клиента:
# ./build-key client
Вместо server и client можно указать имена компьютеров, чтобы потом не путаться, т.к. ключи не имеют отношения к роли хоста, и сервер в одном соединении, используя те же ключи, может быть клиентом в другом.
Настроим сервер
В качестве транспортной сети будем использовать 10.11.11.0/24. То есть из этой подсети будут выделяться адреса для хостов, образующих VPN. В нашем случае один сервер и один клиент.
Скопируем в /etc/openvpn/keys/ созданные файлы ca.crt, dh1024.pem, server.crt, server.key. В Debian вместо расширений crt и key используется pem.
Скопируем в /etc/openvpn/ шаблонный конфигурационный файл /usr/share/doc/openvpn/sample-config-files/server.conf и отредактируем его. У меня без комментариев остались следующие строки:
port 1194 proto udp dev tun server 10.11.11.0 255.255.255.0 ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key dh /etc/openvpn/keys/dh2048.pem user nobody group nobody persist-key persist-tun ifconfig-pool-persist /var/log/openvpn-ipp.txt client-config-dir /etc/openvpn/ccd route 10.11.11.0 255.255.255.0 route 10.9.0.0 255.255.255.0 status /var/log/openvpn-status.log log-append /var/log/openvpn.log client-to-client tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 keepalive 15 120 comp-lzo verb 4 mute 20
У пользователя nobody может быть другая группа. Проверим командой:
# id nobody uid=99(nobody) gid=99(nobody) groups=99(nobody)
Если планируется подключение нескольких клиентов, то для индивидуальной настройки каждого создаём каталог /etc/openvpn/ccd (для Alt Linux см дальше) и в нём файл с именем Common Name сертификата клиента, которое мы указывали при создании сертификата. Уточнить это имя можно посмотрев в созданном сертификате поле CN в строке
Certificate: Data: ... Subject: C=RU, ST=GR, L=Gorod, O=Kontora, CN=OrgName/emailAddress=user@domain.ru
или просто подключиться к серверу и посмотреть в журнале кто подключился. Пусть это будет OrgName, тогда в файле /etc/openvpn/ccd/OrgName указываем:
iroute 10.9.0.0 255.255.255.0 push "route 10.0.0.0 255.255.255.0"
Команды из этого файла будут выполняться при подключении клиента. Первая строка должна добавить маршрут к сети клиента на стороне сервера, вторая наоборот - на клиентской стороне добавить маршрут к сети находящейся за сервером VPN. Если же у нас будет только одно подключение, то обе эти строки могут быть указаны и в главном конфигурационном файле /etc/openvpn/server.conf
В Alt Linux openvpn чрутится, поэтому нужно создать ссылку на /etc/openvpn/ccd:
# ln -s /var/lib/openvpn/etc/openvpn/ccd /etc/openvpn/ccd
То, что он чрутиться именно сюда можно узнать в стартовом скрипте /etc/init.d/openvpn, найдя переменную CHROOTDIR, или выполнив этот скрипт глянуть параметр --chroot в информации о процессе:
# ps ax | grep vpn
Запускаем службу (демон):
# /etc/init.d/openvpn start
Настроим клиента
Скопируем в /etc/openvpn/client-name/ созданные файлы ca.crt, client.crt, client.key.
Скопируем в /etc/openvpn/ шаблонный конфигурационный файл /usr/share/doc/openvpn-docs-2.0.9/sample-config-files/client.conf и отредактируем его. У меня без комментариев остались следующие строки:
client dev tun proto udp remote 81.81.81.1 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun ca /etc/openvpn/client_name/ca.crt cert /etc/openvpn/client_name/client.crt key /etc/openvpn/client_name/client.key comp-lzo verb 4 mute 20 status /var/log/openvpn-client_name-stat.log log-append /var/log/openvpn-client_name.log
Если у нас на этом компьютере больше нет openvpn серверов или клиентов, то можно запустить инициализирующий (стартовый) скрипт:
# /etc/init.d/openvpn start
Если же есть, то запускаем отдельной командой:
# openvpn /etc/openvpn/client.conf &
Если не указывать амперсент (&), то запустив команду мы потереям контроль над консолью, а указав, запустим команду в фоновом режиме. Остановить можно, удалив процесс:
# ps ax | grep vpn 12468 ? Ss 0:28 /usr/sbin/openvpn /etc/openvpn/client.conf # kill -9 12468
Для диагностики могут помочь следующие команды:
# ps ax | grep vpn # route | grep tun # /etc/init.d/openvpn status
Последняя команда работает в Alt Linux, в Debian и Suse нет.
После подключения можно проверить, что именно, какие пакеты ходят через наш тунель:
# tcpdump -i tun0 -n -nn
Также необходимо проверить, что все маршруты поднялись корректно:
# route -n | grep tun0
и если нет, то добавить их вручную для проверки тунелля, а после всё же разобраться и сделать, чтобы они добавлялись автоматически:
# route add -net 10.9.0.0/24 gw 10.11.11.2
здесь мы добавили маршрут в сеть 10.9.0.0 (255.255.255.0) через виртуальный интерфейс 10.11.11.2, созданный OpenVPN.
Создание дополнительного ключа пользователя
После того как всё установлено и созданы сертификаты и ключ сервера, каждый новый ключ пользователя создаётся командой:
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 source ./vars ./build-key ClientName
Примечание: Путь к скрипту build-key может отличаться в разных дистрибутивах
См. также
Создание vpn туннеля - Общая информация по созданию VPN с перечислением нескольких способов.
Cсылки
- Официальное Howto по установке и настройке на английском
- OpenVPN - настройка в Windows и Linux -- статья из журнала Хакер