VPN с помощью OpenVPN

Материал из СисадминВики (SysadminWiki.ru)
(перенаправлено с «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сылки