Установка и настройка OpenVPN сервера в Debian

VPN (Virtual Private Network) — виртуальная частная сеть. VPN — система, позволяющая организовать некую виртуальную сеть объединяющую несколько удалённых друг от друга сетей в единое целое посредством сторонней сети, которая при этом может не обеспечивать безопасность. К примеру, объединение сетей филиалов в одну посредством интернета. Безопасность и надёжность обеспечивается за счёт средств криптографии.

Для чего может понадобится VPN-сервер? В профессиональном варианте — для безопасного доступа к серверу или к сети с множеством серверов или рабочих компьютеров. Можно организовать доступ пользователей из любой точки мира с помощью интернета и ноутбука к их рабочим машинам в офисе или доступ системных администраторов к серверам находящимся в локальной сети организации с удалённых рабочих мест.

В куда менее профессиональном варианте — для доступа к закрытым сайтам из офиса. Если злой админ закрыл доступ к нужным вам сайтам и при этом чисто случайно у вас дома работает сервер под Debian 6, то вы можете настроить VPN-тоннель со своей рабочей машины до VPN-сервера у вас дома и наслаждаться интернетом без ограничений.

В данном руководстве мы будем настраивать VPN на основе OpenVPN под управлением Linux Debian 6. Кроме того в тексте приведены длинные выдержки из логов, так как когда настраиваешь первый раз не известно как должно выглядеть нормальное содержимое лога. Также будем рассчитывать, что вы уже настроили сеть.

Проверка

ls -l /dev/net/tun
lsmod | grep tun

Вторая команда не дала никакого вывода на моем сервере, но работе VPN это не помешало.

Установка OpenVPN-сервера
Предполагаем, что на сервере все действия производятся из-под рута.

aptitude install openvpn openssl

В итоге на сервере использовались следующие версии ПО: Debian 6.0.7, OpenVPN 2.1.3-2, OpenSSL 0.9.8o

Генерация ключей
Создаём директорию под ключи:

mkdir /etc/openvpn/easy-rsa/

В нее копируем утилиты и конфиги для работы с ключами:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

UPD. Если у вас более новая версия OpenVPN и easy-rsa в поставке нет, то вы можете увидеть следующее сообщение об ошибке:

cp: cannot stat '/usr/share/doc/openvpn/examples/easy-rsa/2.0/*': No such file or directory

Не стоит пугаться. Достаточно установить его из репозитория:

aptitude install easy-rsa

и скопировать файлы из другой директории:

cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

Делается это для того, чтобы после обновления OpenVPN-сервера сделанные нами изменения не перезаписались.

Переходим в эту директорию:

cd /etc/openvpn/easy-rsa/

В файле vars настраиваем параметры ключа:

nano vars

Нас интересует только следующий блок:

export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="me@myhost.mydomain"

Меняем на что-нибудь вроде:

export KEY_COUNTRY="RU" export KEY_PROVINCE="Leningradskaya" export KEY_CITY="SaintPetersburg" export KEY_ORG="Firm" export KEY_EMAIL="me@domain.ru"

Инициируем переменные:

source ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

Очищаем от старых сертификатов и ключей папку keys/server:

./clean-all

Создаем сертификат:

./build-ca
Generating a 1024 bit RSA private key
............................................................++++++
......................++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [Leningradskaya]:
Locality Name (eg, city) [SaintPetersburg]:
Organization Name (eg, company) [Firm]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Firm CA]:debgate
Name []:vasya
Email Address [me@domain.ru]:

В квадратных скобках указываются значения по умолчанию, те которые были заданы в файле vars. В таких строках можно просто нажимать клавишу “Ввод”.

Генерируем ключ сервера:

./build-key-server server
Generating a 1024 bit RSA private key
......++++++
.................++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [Leningradskaya]:
Locality Name (eg, city) [SaintPetersburg]:
Organization Name (eg, company) [Firm]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Name []:
Email Address [me@domain.ru]:
Please enter the following '
extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject'
s Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'Leningradskaya'
localityName :PRINTABLE:'SaintPetersburg'
organizationName :PRINTABLE:'Firm'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'me@domain.ru'
Certificate is to be certified until Mar 24 14:50:43 2023 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

По ходу дела можно задать пароль для сертификата для большей безопасности.

Генерируем сертификат клиента:

./build-key user
Generating a 1024 bit RSA private key
..............................++++++
..++++++
writing new private key to 'user.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [LO]:
Locality Name (eg, city) [SaintPetersburg]:
Organization Name (eg, company) [Firm]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [user]:
Name []:
Email Address [me@domain.ru]:

Please enter the following '
extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject'
s Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'LO'
localityName :PRINTABLE:'SaintPetersburg'
organizationName :PRINTABLE:'Firm'
commonName :PRINTABLE:'user'
emailAddress :IA5STRING:'me@domain.ru'
Certificate is to be certified until Mar 28 13:30:46 2023 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Если вы создаёте VPN для корпоративной сети не пренебрегайте паролями. Также для каждого клиента нужно сгенерировать отдельные ключи. Однако можно использовать и один ключ для множества клиентов, однако у данного варианта есть недостатки.

Обратите внимание, что значения полей Common Name для сервера и клиента должны быть различными.

Генерируем ключ Диффи — Хеллмана:

./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

Наконец, последний ключ для tls-аутификации:
o

penvpn --genkey --secret keys/ta.key

После этого в директории /etc/openvpn/easy-rsa/keys/ образовалось достаточно некоторое количество файлов часть из которых нужна серверу, а часть — клиенту.

Копируем серверные ключи в директорию /etc/openvpn:

cd keys cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

Клиенту же понадобятся следующие ключи:

user.crt
user.key
ca.crt
ta.key

Ключ ta.key понадобится для tls-аутентификации, которую мы будем настраивать на втором этапе.

Настройка OpenVPN-сервера
Базовый конфигурационный файл можно получить следующим образом:

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz

/etc/openvpn/ gzip -d /etc/openvpn/server.conf.gz

Правим конфигурационный файл VPN-сервера в Debian:

mcedit /etc/openvpn/server.conf

Задаем следующие параметры:

port 1194 proto tcp dev tun ca ca.crt cert server.crt key server.key dh dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log verb 3

За счёт указанных параметров мы выбираем порт, протокол, тип соединения, указываем сертификаты, задаём параметры VPN-сети, указываем файл в котором хранить параметры соединений (чтобы можно было их восстановить после переподключения клиента), задаём параметры поддержания соединения, просим использовать сжатие передаваемых данных, указываем серверу при перезагрузке не подключаться к ресурсам которые могут быть недоступны из-за понижения привилегий, задаём файл статуса (содержит информацию о подключенных клиентах), лог-файл и уровень подробности отладочной информации.
Если нужно больше отладочной информации, то для параметра verb можно установить значение вплоть до 9. В большинстве случаев вам должно хватить значения 5 или максимум 6.

После этого для проверки запустите сервер из командной строки:

openvpn /etc/openvpn/server.conf

Хотя скорее всего после установки openvpn в Debian, демон будет уже запущен и чтобы он нам не мешался, его стоит остановить:

/etc/init.d/openvpn stop

Если все хорошо, после запуска сервера в логе должно оказаться примерно следующее:

Sat Mar 30 19:04:57 2013 OpenVPN 2.1.3 x86_64-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [MH] [PF_INET6] [eurephia] built on Feb 21 2012
Sat Mar 30 19:04:57 2013 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Sat Mar 30 19:04:57 2013 Diffie-Hellman initialized with 1024 bit key
Sat Mar 30 19:04:57 2013 /usr/bin/openssl-vulnkey -q -b 1024 -m
Sat Mar 30 19:04:58 2013 TLS-Auth MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ]
Sat Mar 30 19:04:58 2013 Socket Buffers: R=[87380->131072] S=[16384->131072]
Sat Mar 30 19:04:58 2013 ROUTE default_gateway=10.78.88.1
Sat Mar 30 19:04:58 2013 TUN/TAP device tun0 opened
Sat Mar 30 19:04:58 2013 TUN/TAP TX queue length set to 100
Sat Mar 30 19:04:58 2013 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Sat Mar 30 19:04:58 2013 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Sat Mar 30 19:04:58 2013 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Sat Mar 30 19:04:58 2013 Listening for incoming TCP connection on [undef]
Sat Mar 30 19:04:58 2013 TCPv4_SERVER link local (bound): [undef]
Sat Mar 30 19:04:58 2013 TCPv4_SERVER link remote: [undef]
Sat Mar 30 19:04:58 2013 MULTI: multi_init called, r=256 v=256
Sat Mar 30 19:04:58 2013 IFCONFIG POOL: base=10.8.0.4 size=62
Sat Mar 30 19:04:58 2013 IFCONFIG POOL LIST
Sat Mar 30 19:04:58 2013 user,10.8.0.4
Sat Mar 30 19:04:58 2013 MULTI: TCP INIT maxclients=1024 maxevents=1028
Sat Mar 30 19:04:58 2013 Initialization Sequence Completed

Добавляем tls-шифрование
На сервере пишем в /etc/openvpn/server.conf:

tls-auth ta.key 0 cipher DES-EDE3-CBC

На клиенте в /etc/openvpn/client.conf:

tls-auth ta.key 1 cipher DES-EDE3-CBC

Фактически разница только в первой строке. На сервере в конце строки ставим ноль, на клиенте — единицу.

Снова соединяемся, пингуем 10.8.0.1. Если пинг проходит, значит все хорошо.

Если VPN-сервер перезапустить, то после соединения с клиентом в логе будет примерно следующее:

Mon Apr 1 19:51:31 2013 OpenVPN 2.1.3 x86_64-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [MH] [PF_INET6] [eurephia] built on Feb 21 2012
Mon Apr 1 19:51:31 2013 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Mon Apr 1 19:51:31 2013 Diffie-Hellman initialized with 1024 bit key
Mon Apr 1 19:51:31 2013 /usr/bin/openssl-vulnkey -q -b 1024 -m
Mon Apr 1 19:51:31 2013 Control Channel Authentication: using 'ta.key' as a OpenVPN static key file
Mon Apr 1 19:51:31 2013 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr 1 19:51:31 2013 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr 1 19:51:31 2013 TLS-Auth MTU parms [ L:1544 D:168 EF:68 EB:0 ET:0 EL:0 ]
Mon Apr 1 19:51:31 2013 Socket Buffers: R=[87380->131072] S=[16384->131072]
Mon Apr 1 19:51:31 2013 ROUTE default_gateway=10.78.88.1
Mon Apr 1 19:51:31 2013 TUN/TAP device tun0 opened
Mon Apr 1 19:51:31 2013 TUN/TAP TX queue length set to 100
Mon Apr 1 19:51:31 2013 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Mon Apr 1 19:51:31 2013 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Mon Apr 1 19:51:31 2013 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Apr 1 19:51:31 2013 Listening for incoming TCP connection on [undef]
Mon Apr 1 19:51:31 2013 TCPv4_SERVER link local (bound): [undef]
Mon Apr 1 19:51:31 2013 TCPv4_SERVER link remote: [undef]
Mon Apr 1 19:51:31 2013 MULTI: multi_init called, r=256 v=256
Mon Apr 1 19:51:31 2013 IFCONFIG POOL: base=10.8.0.4 size=62
Mon Apr 1 19:51:31 2013 IFCONFIG POOL LIST
Mon Apr 1 19:51:31 2013 user,10.8.0.4
Mon Apr 1 19:51:31 2013 MULTI: TCP INIT maxclients=1024 maxevents=1028
Mon Apr 1 19:51:31 2013 Initialization Sequence Completed
Mon Apr 1 19:51:41 2013 MULTI: multi_create_instance called
Mon Apr 1 19:51:41 2013 Re-using SSL/TLS context
Mon Apr 1 19:51:41 2013 LZO compression initialized
Mon Apr 1 19:51:41 2013 Control Channel MTU parms [ L:1544 D:168 EF:68 EB:0 ET:0 EL:0 ]
Mon Apr 1 19:51:41 2013 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Apr 1 19:51:41 2013 Local Options hash (VER=V4): '7c7a0a5e'
Mon Apr 1 19:51:41 2013 Expected Remote Options hash (VER=V4): '2dcdad92'
Mon Apr 1 19:51:41 2013 TCP connection established with [AF_INET]81.95.28.26:47413
Mon Apr 1 19:51:41 2013 TCPv4_SERVER link local: [undef]
Mon Apr 1 19:51:41 2013 TCPv4_SERVER link remote: [AF_INET]81.95.28.26:47413
Mon Apr 1 19:51:42 2013 81.95.28.26:47413 TLS: Initial packet from [AF_INET]81.95.28.26:47413, sid=340c8886 5f2db145
Mon Apr 1 19:51:42 2013 81.95.28.26:47413 VERIFY OK: depth=1, /C=RU/ST=LO/L=SaintPetersburg/O=Firm/CN=debgate/emailAddress=me@debain-help.ru
Mon Apr 1 19:51:42 2013 81.95.28.26:47413 VERIFY OK: depth=0, /C=RU/ST=LO/L=SaintPetersburg/O=Firm/CN=user/emailAddress=me@debain-help.ru
Mon Apr 1 19:51:43 2013 81.95.28.26:47413 Data Channel Encrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Mon Apr 1 19:51:43 2013 81.95.28.26:47413 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr 1 19:51:43 2013 81.95.28.26:47413 Data Channel Decrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Mon Apr 1 19:51:43 2013 81.95.28.26:47413 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr 1 19:51:43 2013 81.95.28.26:47413 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Mon Apr 1 19:51:43 2013 81.95.28.26:47413 [user] Peer Connection Initiated with [AF_INET]81.95.28.26:47413
Mon Apr 1 19:51:43 2013 user/81.95.28.26:47413 MULTI: Learn: 10.8.0.6 -> user/81.95.28.26:47413
Mon Apr 1 19:51:43 2013 user/81.95.28.26:47413 MULTI: primary virtual IP for user/81.95.28.26:47413: 10.8.0.6
Mon Apr 1 19:51:45 2013 user/81.95.28.26:47413 PUSH: Received control message: 'PUSH_REQUEST'
Mon Apr 1 19:51:45 2013 user/81.95.28.26:47413 SENT CONTROL [user]: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5' (status=1)

Как видно, появились строки про ключ ta.key, также изменились строки про cipher.

Дополнительные параметры
client-to-client — позволяет клиентам VPN-сервера связываться друг с другом.
duplicate-cn — параметр нужно добавить если вы для всех клиентов создали одинаковые ключи, но клиенты при этом представляются различными common name.
max-clients 100 — ограничение максимального числа одновременно подключенных клиентов

Для повышения безопасности на linux-системах можно понизить права VPN-сервера:

user nobody group nogroup

(C)

Оставьте комментарий