Установка и настройка 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="[email protected]"

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

export KEY_COUNTRY="RU"
export KEY_PROVINCE="Leningradskaya"
export KEY_CITY="SaintPetersburg"
export KEY_ORG="Firm"
export KEY_EMAIL="[email protected]"

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

# 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 [[email protected]]:

В квадратных скобках указываются значения по умолчанию, те которые были заданы в файле 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 [[email protected]]:

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:'[email protected]'
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 [[email protected]]:

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:'[email protected]'
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-аутификации:

openvpn --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:

nano /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 <modulus omitted>
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

Настройка OpenVPN-клиента

Я использовал дистрибутив Linux Mint 14 основанный на Ubuntu, который в свою очередь основан на Debian. На клиенте действия выполнялись под непривилегированным пользователем с применением команды sudo.

Устанавливаем программы:

sudo aptitude install openvpn openssl

Напомню, клиенту нужно передать следующие ключи:

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

Затем на клиентской машине расположить их в директории /etc/openvpn/.

Копируем файл с примерной конфигурацией клиента в нужную директорию:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

Правим:

sudo nano /etc/openvpn/client.conf

Далее приведён список базовых директив позволяющих подключиться к настроенному ранее серверу:

client
dev tun
proto tcp
remote 10.172.120.217 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert user.crt
key user.key
ns-cert-type server
comp-lzo
log /var/log/openvpn.log
verb 3

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

Проверяем:

cd /etc/openvpn
sudo openvpn client.conf

После этого, если все нормально то в консоли ничего не  должно появляться и не должно отображаться приглашения командной строки. В логе клиента /var/log/openvpn.log долно появиться примерно следующее:

Mon Apr  1 19:25:08 2013 OpenVPN 2.2.1 x86_64-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Oct  8 2012
Mon Apr  1 19:25:08 2013 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Mon Apr  1 19:25:08 2013 LZO compression initialized
Mon Apr  1 19:25:08 2013 Control Channel MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ]
Mon Apr  1 19:25:08 2013 Socket Buffers: R=[87380->131072] S=[16384->131072]
Mon Apr  1 19:25:08 2013 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Apr  1 19:25:08 2013 Local Options hash (VER=V4): '69109d17'
Mon Apr  1 19:25:08 2013 Expected Remote Options hash (VER=V4): 'c0103fa8'
Mon Apr  1 19:25:08 2013 Attempting to establish TCP connection with [AF_INET]109.172.12.237:1194 [nonblock]
Mon Apr  1 19:25:09 2013 TCP connection established with [AF_INET]109.172.12.237:1194
Mon Apr  1 19:25:09 2013 TCPv4_CLIENT link local: [undef]
Mon Apr  1 19:25:09 2013 TCPv4_CLIENT link remote: [AF_INET]109.172.12.237:1194
Mon Apr  1 19:25:09 2013 TLS: Initial packet from [AF_INET]109.172.12.237:1194, sid=63c7901c 31cf5b65
Mon Apr  1 19:25:10 2013 VERIFY OK: depth=1, /C=RU/ST=LO/L=SaintPetersburg/O=Firm/CN=debgate/[email protected]
Mon Apr  1 19:25:10 2013 VERIFY OK: nsCertType=SERVER
Mon Apr  1 19:25:10 2013 VERIFY OK: depth=0, /C=RU/ST=LO/L=SaintPetersburg/O=Firm/CN=server/[email protected]
Mon Apr  1 19:25:10 2013 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Apr  1 19:25:10 2013 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr  1 19:25:10 2013 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Apr  1 19:25:10 2013 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr  1 19:25:10 2013 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Mon Apr  1 19:25:10 2013 [server] Peer Connection Initiated with [AF_INET]109.172.12.237:1194
Mon Apr  1 19:25:13 2013 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
Mon Apr  1 19:25:13 2013 PUSH: Received control message: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5'
Mon Apr  1 19:25:13 2013 OPTIONS IMPORT: timers and/or timeouts modified
Mon Apr  1 19:25:13 2013 OPTIONS IMPORT: --ifconfig/up options modified
Mon Apr  1 19:25:13 2013 OPTIONS IMPORT: route options modified
Mon Apr  1 19:25:13 2013 ROUTE default_gateway=172.16.100.1
Mon Apr  1 19:25:13 2013 TUN/TAP device tun0 opened
Mon Apr  1 19:25:13 2013 TUN/TAP TX queue length set to 100
Mon Apr  1 19:25:13 2013 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Mon Apr  1 19:25:13 2013 /sbin/ifconfig tun0 10.8.0.6 pointopoint 10.8.0.5 mtu 1500
Mon Apr  1 19:25:13 2013 /sbin/route add -net 10.8.0.1 netmask 255.255.255.255 gw 10.8.0.5
Mon Apr  1 19:25:13 2013 Initialization Sequence Completed

В логе сервера добавится следующее:

Mon Apr  1 19:33:20 2013 MULTI: multi_create_instance called
Mon Apr  1 19:33:20 2013 Re-using SSL/TLS context
Mon Apr  1 19:33:20 2013 LZO compression initialized
Mon Apr  1 19:33:20 2013 Control Channel MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ]
Mon Apr  1 19:33:20 2013 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Apr  1 19:33:20 2013 Local Options hash (VER=V4): 'c0103fa8'
Mon Apr  1 19:33:20 2013 Expected Remote Options hash (VER=V4): '69109d17'
Mon Apr  1 19:33:20 2013 TCP connection established with [AF_INET]81.95.28.26:47278
Mon Apr  1 19:33:20 2013 TCPv4_SERVER link local: [undef]
Mon Apr  1 19:33:20 2013 TCPv4_SERVER link remote: [AF_INET]81.95.28.26:47278
Mon Apr  1 19:33:21 2013 81.95.28.26:47278 TLS: Initial packet from [AF_INET]81.95.28.26:47278, sid=1fc06478 887428ff
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 VERIFY OK: depth=1, /C=RU/ST=LO/L=SaintPetersburg/O=Firm/CN=debgate/[email protected]
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 VERIFY OK: depth=0, /C=RU/ST=LO/L=SaintPetersburg/O=Firm/CN=user/[email protected]
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Mon Apr  1 19:33:22 2013 81.95.28.26:47278 [user] Peer Connection Initiated with [AF_INET]81.95.28.26:47278
Mon Apr  1 19:33:22 2013 user/81.95.28.26:47278 MULTI: Learn: 10.8.0.6 -> user/81.95.28.26:47278
Mon Apr  1 19:33:22 2013 user/81.95.28.26:47278 MULTI: primary virtual IP for user/81.95.28.26:47278: 10.8.0.6
Mon Apr  1 19:33:24 2013 user/81.95.28.26:47278 PUSH: Received control message: 'PUSH_REQUEST'
Mon Apr  1 19:33:24 2013 user/81.95.28.26:47278 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)

При этом с клиента должен пинговаться адрес 10.8.0.1 (можно открыть еще одну консоль):

PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=18.7 ms

Мы настроили OpenVPN-сервер в Debian по минимуму, проверили его работоспособность. Осталось добавить tls-шифрование и завернуть на VPN-сервер весь трафик клиента.

Добавляем 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 <modulus omitted>
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/[email protected]
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/[email protected]
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.

Заворачиваем весь трафик на VPN-сервер

Тут требуется заменить конфигурационный файл только на сервере. Добавляем строки:

push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"

Первая строка меняет шлюз по умолчанию на заданный на VPN-сервере. После отключения будет возвращён шлюз, который был задан на клиенте ранее.

Вторая строка задает DNS-сервер, который будет использоваться после подключения к VPN-серверу.

Также нам необходимо на сервере задать правило для маршрутизации трафика из сети VPN-сервера в локальную сеть или сеть интернет-провайдера. В debian это можно сделать правилом для iptables:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Подробности ищите в статье про настройку NAT и DHCP-сервера под Debian.

Теперь можно по нормальному запустить openvpn-сервер и клиент:

/etc/init.d/openvpn start

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

Если вы используете Linux на вашем рабочем компьютере, то для удобного подключения к VPN можно использовать модуль к Network-Manager.

Дополнительные параметры

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

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

user nobody
group nogroup

Очень подробная и понятная статья может быть найдена по ссылке http://lithium.opennet.ru/articles/openvpn/openvpn-howto.html

UPD. Если после всего у вас проблемы с NAT и устройством TUN, то включите поддержку форвардинга. Для этого в файле /etc/sysctl.conf установите следующий параметр:

net.ipv4.ip_forward=1

и затем примените его командой:

sysctl -p

Наверх

Опубликовано