Установка и настройка сервера OpenVPN на Debian
Инструкция по установке и настройке OpenVPN-сервера на базе Linux -дистрибутива Debian 8 Jessie.
Для работы OpenVPN необходима поддержка TUN/TAP интерфейса на сервере. Если вы устанавливаете OpenVPN на физической машине, либо используете виртуализацию KVM, в с этим не должно возникнуть проблем.
В случае использования OpenVZ, необходимо активировать поддержку TUN/TAP в настройках контейнера.
Проверяем поддержку в системе tun/tap-интерфейсов:
Клиенты будут использовать на сервере аутентификацию по ключу. Для этого создадим директорию в которую будут скопированы сгенерированные ключи:
И скопируем в нее утилиты и конфиги для работы с ключами:
переходим в созданную директорию:
В файле vars можно настроить параметры ключей и сертификатов. Данный пункт не обязательный и при желании его можно пропустить.
Меняем (по желанию) следующие строки:
Остальное оставляем по умолчанию.
После правки vars инициализируем переменные и очищаем каталог keys/serverот старых сертификатов и ключей:
Создание сертификатов
Создаем корневой сертификат:
В квадратных скобках будут указаны значения по умолчанию, которые вы записали в файле vars. Если вы не планируете их менять, то просто нажимайте Enter.
Генерируем сертификаты сервера и клиента:
Для каждого клиента должны быть сгенерированы отдельные ключи.
Генерируем ключ Диффи — Хеллмана:
Cоздаем ключ для tls-аутификации:
Все сгенерированные сертификаты и ключи находятся в директории /etc/openvpn/easy-rsa/keys/
Копируем сертификаты и ключи сервера в директорию OpenVPN:
На клиентскую машину OpenVPN необходимо скопировать следующие ключи и сертификаты:
client1.crt
client1.key
ca.crt
ta.key
Для понимания назначения и расположения соответствующих файлов, я сделал небольшую таблицу:
Имя файла | Где необходим | Назначение | Секретный |
ca.crt | сервер + все клиенты | Корневой CA-сертификат | НЕТ |
ca.key | машина для подписи ключей | Корневой CA-ключ | ДА |
dh | только сервер | Параметры Diffie Hellman’а | НЕТ |
server.crt | только сервер | Сертификат сервера | НЕТ |
server.key | только сервер | Ключ сервера | ДА |
client1.crt | только клиент1 | Сертификат клиента1 | НЕТ |
client1.key | только клиент1 | Ключ клиента1 | ДА |
client2.crt | только клиент2 | Сертификат клиента2 | НЕТ |
client2.key | только клиент2 | Ключ клиента2 | ДА |
На этом установка сервера OpenVPN завершена, осталось настроить конфигурацию сервера.
Пример конфигурационного файла OpenVPN расположен в директории /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz, копируем и распаковываем его в /etc/openvpn:
# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# gzip -d /etc/openvpn/server.conf.gz
В зависимости от потребностей, изменяем настройки сервера OpenVPN:
Вот моя конфигурация:
Если вам нужно чтобы , чтобы после подключения у клиента весь траффик шел через сервер OpenVPN, то раскомментируйте строку 20:
Таким образом шлюзом по умолчанию для клиентов у вас станет OpenVPN — сервер.
Для повышения безопасности на linux-системах можно понизить права VPN-сервера, раскомментировав в конфиге сервера следующие строки:
Создаем директорию для клиентских настроек и перезагружаем сервер:
После завершения настройки OpenVPN, перезагружаем сервер:
В случае успешного запуска OpenVPN в системе должен появиться новый tun0 интерфейс:
Наличие данного интерфейса означает, что OpenVPN Запущен и работает. Если по каким-либо причинам он не появился, то смотрим лог-файл на наличие ошибок:
После подключения клиента к серверу OpenVPN, если он (клиент) находится в локальной сети, нужно дополнительно настроить маршрутизацию для доступа к ресурсам внутри сети. Для этого создаем файл в каталоге ccd с тем же именем ключа клиента:
Добавим в файл следующие параметры:
Первая строка добавляет маршрут в локальную сеть клиента. Проще говоря — говорит клиенту OpenVPN «ходить» в сеть 192.168.2.0 через сервер OpenVPN. Если ваша локалка связана еще с какой-либо подсетью, то её также нужно указать.
Вторая строка задает DNS-сервер, который будет использоваться после подключения (Если в вашей локальной сети DNS-сервер отсутствует, то можно указать ns от Google — 8.8.8.8, либо не указывать вообще.
Включаем NAT на OpenVPN сервере
Чтобы использовать OpenVPN для выхода в интернет, на сервере необходимо задать правило для маршрутизации трафика из сети OpenVPN в локальную сеть или сеть интернет-провайдера и обратно.
Чтобы включить поддержку IP forwarding, нужно в файле /etc/sysctl.conf раскомментировать строчку:
Применяем изменения (загружаем переменные ядра):
Не забываем прописать правила iptables. Нам нужно разрешить клиентам из подсети 10.10.10.0/24 доступ в интернет, разрешить принимать пакеты из интернета и пропустить трафик клиентов через NAT.
В первой строке мы разрешаем форвардинг пакетов на интерфейсе tun0.
Второй строкой разрешаем форвардинг с tun0 на eth0.
Третей — разрешаем формардинг с eth0 на tun0.
Замените eth0 на имя своего внешнего интерфейса. Следует отметить, что MASQUERADE создает нагрузку на процессор. Поэтому, предпочтительнее использовать SNAT:
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT —to-source ВНЕШНИЙ_IP
(в моем случае внешним IP был локальный адрес OpenVPN-сервера)
Разница между SNAT и MASQUERADE:
Маскарадинг постоянно запрашивает IP адрес у интерфейса, тем самым создавая нагрузку на процессор, в то время как SNAT «знает» IP (в нашем случае мы его указываем явно, т.к он статический).
Сохраняем правила и добавляем их в автозагрузку:
Настройка клиента OpenVPN
Если OpenVPN не установлен, то установим его::
Копируем на компьютер клиента следующие ключи и сертификаты:
Затем переносим их в директорию OpenVPN — /etc/openvpn/
Копируем и распаковываем пример конфигурационного файла в содержимое директории OpenVPN:
и редактируем его:
Добавим в содержимое файла следующие параметры:
Для Windows-машин нужно положить файл client.ovpn в папку:
C:\Program Files\OpenVPN\config\
Опции протокола, шифрования и сжатия у клиента и сервера должны быть одинаковые.
На этом настройка OpenVPN в Debian закончена, проверяем его работоспособность:
Подключаемся с клиентской машины к OpenVPN-серверу , и пингуем с неё OpenVPN-сервер:
Если пинг проходит, то все хорошо, если же нет, то смотрим логи и проверяем настройки маршрутизации.
P.S. Если у вас на сервере динамический IP, то можете воспользоваться скриптом замены IP в конфиге OpenVPN, и последующей его отправкой на email.
Если возникнут какие-либо вопросы — пишите в комментариях.
Источник
Установка и настройка OpenVPN-сервера в Debian
Список разделов
VPN (Virtual Private Network) — виртуальная частная сеть. VPN — система, позволяющая организовать некую виртуальную сеть объединяющую несколько удалённых друг от друга сетей в единое целое посредством сторонней сети, которая при этом может не обеспечивать безопасность. К примеру, объединение сетей филиалов в одну посредством интернета. Безопасность и надёжность обеспечивается за счёт средств криптографии.
Для чего может понадобится VPN-сервер? В профессиональном варианте — для безопасного доступа к серверу или к сети с множеством серверов или рабочих компьютеров. Можно организовать доступ пользователей из любой точки мира с помощью интернета и ноутбука к их рабочим машинам в офисе или доступ системных администраторов к серверам находящимся в локальной сети организации с удалённых рабочих мест.
В куда менее профессиональном варианте — для доступа к закрытым сайтам из офиса. Если злой админ закрыл доступ к нужным вам сайтам и при этом чисто случайно у вас дома работает сервер под Debian 6, то вы можете настроить VPN-тоннель со своей рабочей машины до VPN-сервера у вас дома и наслаждаться интернетом без ограничений.
В данном руководстве мы будем настраивать VPN на основе OpenVPN под управлением Linux Debian 6. Кроме того в тексте приведены длинные выдержки из логов, так как когда настраиваешь первый раз не известно как должно выглядеть нормальное содержимое лога. Также будем рассчитывать, что вы уже настроили сеть.
Проверка
Вторая команда не дала никакого вывода на моем сервере, но работе VPN это не помешало.
Установка OpenVPN-сервера
Предполагаем, что на сервере все действия производятся из-под рута.
В итоге на сервере использовались следующие версии ПО: Debian 6.0.7, OpenVPN 2.1.3-2, OpenSSL 0.9.8o
Генерация ключей
Создаём директорию под ключи:
В нее копируем утилиты и конфиги для работы с ключами:
UPD. Если у вас более новая версия OpenVPN и easy-rsa в поставке нет, то вы можете увидеть следующее сообщение об ошибке:
cp: cannot stat '/usr/share/doc/openvpn/examples/easy-rsa/2.0/*': No such file or directory
Не стоит пугаться. Достаточно установить его из репозитория:
и скопировать файлы из другой директории:
Делается это для того, чтобы после обновления OpenVPN-сервера сделанные нами изменения не перезаписались.
Переходим в эту директорию:
В файле vars настраиваем параметры ключа:
Нас интересует только следующий блок:
Меняем на что-нибудь вроде:
Очищаем от старых сертификатов и ключей папку keys/server:
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. В таких строках можно просто нажимать клавишу “Ввод”.
Генерируем ключ сервера:
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
По ходу дела можно задать пароль для сертификата для большей безопасности.
Генерируем сертификат клиента:
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 для сервера и клиента должны быть различными.
Генерируем ключ Диффи — Хеллмана:
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
Наконец, последний ключ для tls-аутификации:
После этого в директории /etc/openvpn/easy-rsa/keys/ образовалось достаточно некоторое количество файлов часть из которых нужна серверу, а часть — клиенту.
Копируем серверные ключи в директорию /etc/openvpn:
Клиенту же понадобятся следующие ключи:
user.crt
user.key
ca.crt
ta.key
Ключ ta.key понадобится для tls-аутентификации, которую мы будем настраивать на втором этапе.
Настройка OpenVPN-сервера
Базовый конфигурационный файл можно получить следующим образом:
Правим конфигурационный файл VPN-сервера в Debian:
Задаем следующие параметры:
За счёт указанных параметров мы выбираем порт, протокол, тип соединения, указываем сертификаты, задаём параметры VPN-сети, указываем файл в котором хранить параметры соединений (чтобы можно было их восстановить после переподключения клиента), задаём параметры поддержания соединения, просим использовать сжатие передаваемых данных, указываем серверу при перезагрузке не подключаться к ресурсам которые могут быть недоступны из-за понижения привилегий, задаём файл статуса (содержит информацию о подключенных клиентах), лог-файл и уровень подробности отладочной информации.
Если нужно больше отладочной информации, то для параметра verb можно установить значение вплоть до 9. В большинстве случаев вам должно хватить значения 5 или максимум 6.
После этого для проверки запустите сервер из командной строки:
Хотя скорее всего после установки openvpn в Debian, демон будет уже запущен и чтобы он нам не мешался, его стоит остановить:
Если все хорошо, после запуска сервера в логе должно оказаться примерно следующее:
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
Настройка OpenVPN-клиента
Я использовал дистрибутив Linux Mint 14 основанный на Ubuntu, который в свою очередь основан на Debian. На клиенте действия выполнялись под непривилегированным пользователем с применением команды sudo.
Напомню, клиенту нужно передать следующие ключи:
Затем на клиентской машине расположить их в директории /etc/openvpn/.
Копируем файл с примерной конфигурацией клиента в нужную директорию:
Далее приведён список базовых директив позволяющих подключиться к настроенному ранее серверу:
В конфигурационном файле пишем, что это клиент, задаём тот же тип подключения и протокол, что и для сервера, адрес и порт сервера, предлагаем не ограничивать количество попыток подключиться, задаём отсутствие привязки к конкретному порту на клиенте, отключаем доступ после перезагрузки к к потенциально не безопасным хостам, указываем файлы сертификатов, включаем проверку того, что сертификат сервера сгенерирован как сертификат сервера, задаём использование сжатия, а также путь до журнала и степень подробности отладочной информации.
После этого, если все нормально то в консоли ничего не должно появляться и не должно отображаться приглашения командной строки. В логе клиента /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 (можно открыть еще одну консоль):
Мы настроили OpenVPN-сервер в Debian по минимуму, проверили его работоспособность. Осталось добавить tls-шифрование и завернуть на VPN-сервер весь трафик клиента.
Добавляем tls-шифрование
На сервере пишем в /etc/openvpn/server.conf:
На клиенте в /etc/openvpn/client.conf:
Фактически разница только в первой строке. На сервере в конце строки ставим ноль, на клиенте — единицу.
Снова соединяемся, пингуем 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/[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-сервер
Тут требуется заменить конфигурационный файл только на сервере. Добавляем строки:
Первая строка меняет шлюз по умолчанию на заданный на VPN-сервере. После отключения будет возвращён шлюз, который был задан на клиенте ранее.
Вторая строка задает DNS-сервер, который будет использоваться после подключения к VPN-серверу.
Также нам необходимо на сервере задать правило для маршрутизации трафика из сети VPN-сервера в локальную сеть или сеть интернет-провайдера. В debian это можно сделать правилом для iptables:
Теперь можно по нормальному запустить openvpn-сервер и клиент:
Единственное неудобство, при запуске демона на клиенте будет постоянно поддерживаться VPN-соединение. О том, как отключить автозагрузку демона можно прочитать в статье про управление автозагрузкой в debian.
Если вы используете Linux на вашем рабочем компьютере, то для удобного подключения к VPN можно использовать модуль к Network-Manager.
Дополнительные параметры
client-to-client — позволяет клиентам VPN-сервера связываться друг с другом.
duplicate-cn — параметр нужно добавить если вы для всех клиентов создали одинаковые ключи, но клиенты при этом представляются различными common name.
max-clients 100 — ограничение максимального числа одновременно подключенных клиентов
Для повышения безопасности на linux-системах можно понизить права VPN-сервера:
Источник