статьи

Как установить и настроить свой VPN на Windows или Linux [OpenVPN]

Доброго времени суток, дорогие читатели.

В прошлых статьях (раз, два) я рассказывал о том, что такое VPN и как его проверить в деле. В этой же статье мы с вами будем поднимать свой собственный домашний VPN сервер на базе OpenVPN.

vpn

Прежде, чем приступить непосредственно к настройке всего этого хозяйства, сначала разберем как это будет работать. Рассмотрим два примера.

Пример первый:

Мы хотим подключиться к нашей домашней сети и использовать домашние же ресурсы. Дома у нас Windows, на работе/отдыхе/где-то еще у нас тоже Windows.

Пример второй:

Мы хотим весь свой трафик передавать через домашний VPN сервер. Дома у нас Windows, на котором крутится виртуальная машина на Debian 8. Который и будет выступать в роли VPN сервера.

А теперь рассмотрим эти примеры более детально.
Приступим.

Схема сети для первого VPN-примера

У нас сеть домашний компьютер на Windows 10 x64, на нем развернута виртуалка на Debian 8, которая будет использоваться в качестве файлового хранилища, и рабочий ноутбук на Windows 10. Мы хотим с рабочего ноутбука подключиться к домашнему компьютеру и иметь доступ ко всем локальным ресурсам домашней сети.

На маршрутизаторе мы имеем внешний адрес 87.215.46.32, внутренний адрес 192.168.1.1. на домашнем компе мы имеем внутренний адрес 192.168.1.2, а также 192.168.94.2 для подсети VMWare. На виртуальном компе мы имеем адрес 192.168.94.110 и именно этот адрес нам понадобится для удаленного доступа к серверу. В качестве VPN подсети я выбрал 10.10.20.0 с префиксом /24 (маска 255.255.255.0):

Схема сети. Пример 1

Теперь давайте приступим к настройке.

к содержанию ↑

Установка и настройка VPN cервера на основе OpenVPN для первого примера

Скачиваем клиент отсюда (выбираем Installer (32-bit), Windows Vista and later или Installer (64-bit), Windows Vista and later).

На этапе выбора куда, собственно, все это ставить, я бы рекомендовал указать корень диска (например C:\), т.к. могут быть проблемы с правами доступа. На этапе выбора компонент обязательно указываем OpenSSL Utilities и OpenVPN RSA Certificate Management Scripts:

Выбор компонентов OpenVPN

Устанавливаем. В процессе установки адаптера может появиться сообщение о необходимости установить VPN драйвер. Соглашаемся и жмем "Установить":

Предложение установки адаптера OpenVPN

Как только все установили, можно приступить к настройке.

Небольшой ликбез по технологии работы VPN, чтобы вы понимали для чего мы делаем те или иные действия.

Для того, чтобы создать защищенное соединение, в OpenVPN используется аутентификация на цифровых сертификатах стандарта Х.509.

  • Цифровой сертификат представляет собой специальный файл, при помощи которого, например, сайт показывает, что ему можно доверять, или вы можете подписать сертификатом почтовое сообщение/документ и отправить его другому человеку, который по этому сертификату поймет, что файл действительно пришел от вас, а не от кого-то другого, и при этом он не был изменен;
  • Цифровой сертификат невозможно подделать, но можно попытаться подменить (но это легко определить, посмотрев кем был выдан такой сертификат). Любой сертификат веб-сайта или организации подписывается вышестоящим по иерархии сертификатом (сертификатом удостоверяющего центра).

При этом, существуют специальные организации, которые выдают сертификаты конечным потребителям. Такой сертификат есть у любого сайта, поддерживающего протокол HTTPS. Например, открываете сайт gosuslugi.ru и видите, что напротив HTTPS висит замочек:

Защищенный сайт Gosuslugi.ru

Тыкаете на него и видите свойства сертификата. Можете там же просмотреть сам сертификат и узнать кем он был выпущен:

Сертификат веб-сайта Gosuslugi.ru

У VPN ситуация похожая. Но здесь не только у сервера есть сертификат, но и у клиента. Они обмениваются этими сертификатами и проверяют сертификат партнера с помощью сертификата УЦ (Удостоверяющего центра, которым у нас выступает сервер) и таким образом определяют что партнеру можно доверять.

Так что для организации защищенного соединения между клиентом и серверов минимальный набор будет состоять из:

  • Сертификат УЦ (CA);
  • Сертификат сервера;
  • Сертификат клиента;
  • Закрытый ключ УЦ;
  • Закрытый ключ сервера;
  • Закрытый ключ клиента;
  • Ключевая последовательность Диффи-Хеллмана. Про сам алгоритм я расписывать не буду, если есть желание, можно глянуть этот ролик. Там довольно простым языком рассказывают о нем :)

Переходим в директорию с программой и идем в папку easy-rsa (у меня она находится в E:\OpenVPN\easy-rsa).

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

Создайте текстовый файлик под названием, например, generate-all, вставьте туда следующее содержимое:

@echo off
rem SETLOCAL enabledelayedexpansion
rem fullfill the vars under '-------' lines
:START
rem -------------VARS--------------
rem Edit this variable to point to
rem the openssl.cnf file included
rem with easy-rsa.
set PATH="E:\program files\OpenVPN"
set KEY_CONFIG=openssl-1.0.0.cnf
rem Edit this variable to point to
rem your soon-to-be-created key
rem directory.
rem
rem WARNING: clean-all will do
rem a rm -rf on this directory
rem so make sure you define
rem it correctly!
set KEY_DIR=%PATH%\certs
rem Increase this to 2048 if you
rem are paranoid. This will slow
rem down TLS negotiation performance
rem as well as the one-time DH parms
rem generation process.
set KEY_SIZE=1024
rem These are the default values for fields
rem which will be placed in the certificate.
rem Change these to reflect your site.
rem Don't leave any of these parms blank.
set KEY_COUNTRY=RU
set KEY_PROVINCE=CA
set KEY_CITY=Moscow
set KEY_ORG=barnak-VPN
set KEY_EMAIL=mail
set KEY_CN=barnak-CA
set KEY_NAME=name
set KEY_OU=ou
set PKCS11_MODULE_PATH=path
set PKCS11_PIN=pin
rem ----------------------------------------
rem ------------INIT SCRIPT-----------------
rem delete the KEY_DIR and any subdirs quietly
IF NOT EXIST %KEY_DIR% mkdir %KEY_DIR%
IF NOT EXIST %KEY_DIR%\index.txt (
rem copy in a fesh index file so we begin with an empty database
copy index.txt.start %KEY_DIR%\index.txt
rem copy in a fresh serial file so we begin generating keys at index 01
copy serial.start %KEY_DIR%\serial. 
)
rem -----------------------------------------
echo.
echo Enter action:
echo 1 - Create CA certificate
echo 2 - Create DH file
echo 3 - Create Server Certficate
echo 4 - Create Client Certficate
echo 0 - Exit
set /P act=""
IF %act% == 1 (
 goto GEN-CA
) else IF %act% == 2 (
 goto GEN-DH
) else IF %act% == 3 (
 goto SRV-CRT
) else IF %act% == 4 (
 goto CLIENT-CRT
) else IF %act% == 0 (
 goto EXIT
) else (
 echo ERROR: Invalid action!
 goto START
)

:GEN-CA
rem build a cert authority valid for ten years, starting now
%PATH%\bin\openssl req -days 3650 -nodes -new -x509 -keyout %KEY_DIR%\ca.key -out %KEY_DIR%\ca.crt -config %KEY_CONFIG%
if ERRORLEVEL 0 echo CA certificate succesfully created
goto START

:GEN-DH
rem build a dh file for the server side
%PATH%\bin\openssl dhparam -out %KEY_DIR%/dh%KEY_SIZE%.pem %KEY_SIZE%
if ERRORLEVEL 0 echo DH file succesfully created
goto START

:SRV-CRT
set /P SRV_NAME="Enter Server Name: "
IF [%SRV_NAME%] == [] (
echo ERROR: Server name must not be empty!
goto SRV-CRT
)
set KEY_CN=%SRV_NAME%
rem build a request for a cert that will be valid for ten years
%PATH%\bin\openssl req -days 3650 -nodes -new -keyout %KEY_DIR%\%SRV_NAME%.key -out %KEY_DIR%\%SRV_NAME%.csr -config %KEY_CONFIG%
rem sign the cert request with our ca, creating a cert/key pair
%PATH%\bin\openssl ca -days 3650 -out %KEY_DIR%\%SRV_NAME%.crt -in %KEY_DIR%\%SRV_NAME%.csr -extensions server -config %KEY_CONFIG%
rem delete any .old files created in this process, to avoid future file creation errors
del /q %KEY_DIR%\*.old
IF NOT ERRORLEVEL 0 echo ERROR!
goto START

:CLIENT-CRT
set /P CLIENT_NAME="Enter Client Name: "
IF [%CLIENT_NAME%] == [] (
echo ERROR: Client Name must not be empty!
goto CLIENT-CRT
)
set KEY_CN=%CLIENT_NAME%
rem build a request for a cert that will be valid for ten years
%PATH%\bin\openssl req -days 3650 -nodes -new -keyout %KEY_DIR%\%CLIENT_NAME%.key -out %KEY_DIR%\%CLIENT_NAME%.csr -config %KEY_CONFIG%
rem sign the cert request with our ca, creating a cert/key pair
%PATH%\bin\openssl ca -days 3650 -out %KEY_DIR%\%CLIENT_NAME%.crt -in %KEY_DIR%\%CLIENT_NAME%.csr -config %KEY_CONFIG%
rem delete any .old files created in this process, to avoid future file creation errors
del /q %KEY_DIR%\*.old
IF NOT ERRORLEVEL 0 echo ERROR!
goto START

:EXIT

После этого сохраните скрипт как .bat файл (либо просто поменяйте ему расширение на .bat).

Теперь надо внести некоторые корректировки в этот скрипт. Нас интересуют следующие строчки:

set PATH="E:\OpenVPN"

Где мы указываем папку с программой (путь).
Идем дальше.

set KEY_COUNTRY=RU
set KEY_PROVINCE=CA
set KEY_CITY=Moscow
set KEY_ORG=barnak-VPN
set KEY_EMAIL=mail
set KEY_CN=barnak-CA
set KEY_NAME=name
set KEY_OU=ou
set PKCS11_MODULE_PATH=path
set PKCS11_PIN=pin

Здесь (см.выше) мы указываем информацию для сертификатов (они у нас будут использоваться для аутентификации между сервером и клиентом). Можно использовать пробелы:

  • KEY_PROVINCE, - указываем что хотим или оставляем по умолчанию;
  • KEY_CITY, - ваш город (или любой город);
  • KEY_ORG, - название вашего ИП :) (можно что угодно писать);
  • KEY_EMAIL, - указываем что хотим или оставляем по умолчанию;
  • KEY_CN, - название вашего сервера;
  • KEY_NAME, - указываем что хотим или оставляем по умолчанию;
  • KEY_OU, - указываем что хотим или оставляем по умолчанию;
  • PKCS11_MODULE_PATH, - указываем что хотим или оставляем по умолчанию;
  • PKCS11_PIN, - указываем что хотим или оставляем по умолчанию.

После этого сохраняем изменения и запускаем скрипт. При первом запуске вы увидите что было скопировано два файла. Так и должно быть. У вас создалась папка, в которой будут лежать сертификаты и ключи:

Скрипт для генерации OpenVPN

Вводим 1 и нажимаем Enter. Вас попросят ввести информацию о сертификате. Т.к. мы ее заполнили ранее, то просто нажимаете Enter, пока вам не напишет "CA certificate successfully created":

Выпуск СА сертификата

Кому интересно что это за поля и где их увидеть:

  • Открываете папку keys (или как вы ее назвали), открываете ca.crt, переходите на вкладку "Состав" и щелкаете по опции "Издатель":

Состав сертификата УЦ

Теперь нужно выпустить ключевую последовательность Диффи-Хеллмана. Вводим 2 и ждем, пока ключи сгенерируются:

Генерация ключей Диффи-Хеллмана

После этого выпускаем сертификат для нашего сервера. Вводим 3, далее нас попросят ввести имя сервера:

Выпуск сертификата сервера

Далее методично нажимаем Enter пока не появится фраза "Sign the certificate?", после чего нажимаем и Enter. Появится вопрос: "1 out of 1 certificate requests certified, commit?" на который мы отвечаем утвердительно. Сертификат готов.

Для клиента проделываем всё аналогично.

После этого настраиваем конфигурацию сервера, для чего переходим в папку config и создаем файл server.ovpn, куда вставляем следующее:

port 1120
proto tcp
dev tun
dev-node OpenVPN
ca E:\\OpenVPN\\certs\\ca.crt
cert E:\\OpenVPN\\certs\\barnak-SRV.crt
key E:\\OpenVPN\\certs\\barnak-SRV.key # This file should be kept secret
dh E:\\OpenVPN\\certs\\dh1024.pem
server 10.10.20.0 255.255.255.0
push "route 10.10.20.0 255.255.255.0"
keepalive 10 120
cipher AES-128-CBC # AES
comp-lzo
max-clients 10
status openvpn-status.log
verb 4
mute 20
sndbuf 0
rcvbuf 0

Что здесь что:

  • port 1120, - номер порта, к которому будут подключаться клиенты;
  • proto tcp, - тип протокола (tcp или udp). TCP более медленный вариант, но если вы ходите через прокси-сервер, это единственный способ;
  • dev tun, - режим подключения (tun или tap, туннель или мост). В общем-то режим моста нужен для специфических приложений (типа тех, что используют IPX протокол, им нужно отправлять broadcast сообщения и тп.). Обычно хватает туннельного режима;
  • dev-node OpenVPN, - название вашего адаптера (используется только для режима подключения tap). Заходите в свойства сетевого адаптера и меняете название на то, которое вам больше нравится: Сетевой адаптер OpenVPN
  • ca E:\\OpenVPN\\certs\\ca.crt, - путь до сертификата УЦ. Обратите внимание на наше воспитание. Пьянки, гулянки, диско и панки обратный слеш (\) здесь указывается дважды;
  • cert E:\\OpenVPN\\certs\\barnak-SRV.crt, - путь до сертификата сервера;
  • key E:\\OpenVPN\\certs\\barnak-SRV.key, - путь до закрытого ключа сервера;
  • dh E:\\OpenVPN\\certs\\dh1024.pem, - путь до ключевой последовательности Диффи-Хеллмана;
  • server 10.10.20.0 255.255.255.0, - виртуальная подсеть и маска вашего VPN соединения. Когда к серверу будут подключаться, то сетевой адрес вы получите именно из этого диапазона. При этом, первый адрес всегда использует сервер;
  • push "route 10.10.20.0 255.255.255.0, - здесь указывается наша виртуальная подсеть. Эта команда нужна, чтобы при установлении соединения ваши VPN клиенты могли подключаться не только непосредственно к вам, но и к другим VPN компьютерам в вашей сети. При этом, таким образом можно добавлять несколько маршрутов;
  • keepalive 10 120, - отвечает за проверку доступности партнера. Будет отсылать пинги каждые 10 секунд, если от партнера не получен ответ в течение 120 секунд;
  • cipher AES-128-CBC, - алгоритм шифрования. Оставляйте этот, он самый надежный из предлагаемых :)
  • comp-lzo, - сжимание данных через VPN соединение (для уменьшения трафика);
  • max-clients 10, - сколько клиентов к вам может единовременно подключиться;
  • status openvpn-status.log, - название журнала, в котором будет краткая информация о том, кто подключился и т.п.: Пример вывода файла openvpn-status.log
  • verb 4, - уровень детализации логов. Чем больше, тем выше детализация;
  • mute 20, - Не выводить в логе больше 20 одинаковых сообщений (чтобы не засорять его);
  • sndbuf 0, - буфер для отправленных пакетов. 0 означает, что OpenVPN будет использовать системные настройки, что обычно увеличивает вашу пропускную способность;
  • rcvbuf 0, - буфер для полученных пакетов. Аналогично предыдущему.

Для более детального файла конфигурации можем перейти в папку sample-config и там открыть файл конфигурации текстовым редактором. Там есть комментарии к каждой опции.

После того, как вы подготовили файл настроек, применяем их, дважды кликая на файл. Откроется окно OpenVPN и начнет запускаться сервер:

Подключенный сервер OpenVPN

Если у вас просто пустой экран, то откройте файл журнала (\OpenVPN\log\;.log). В нем будет написано почему VPN не запускается.

к содержанию ↑

Настройка клиента OpenVPN для первого примера

С сервером мы закончили, теперь переходим к клиенту. Скачиваем все то же приложение, устанавливаем где нам удобнее. Переносим сертификат и ключ клиента, сертификат УЦ (у меня это: ca.crt, barnak-client.crt, barnak-client.key) в любое удобное для вас место.

Заходим в папку Config (у меня это C:\Program Files\OpenVPN\Config), создаем файл client.ovpn со следующим содержимым:

client
dev tun
dev-node OpenVPN
proto tcp
remote 87.215.46.32 1120
resolv-retry infinite
nobind
ca C:\\Program files\\OpenVPN\\keys\\ca.crt
cert C:\\Program files\\OpenVPN\\keys\\barnak-client.crt
key C:\\Program files\\OpenVPN\\keys\\barnak-client.key
ns-cert-type server
cipher AES-128-CBC
comp-lzo
verb 3
mute 20

Что у нас появилось нового:

  • client, - означает, что мы являемся клиентом;
  • remote 89.215.46.32 1120, - здесь указываем IP адрес (или DNS имя) нашего сервера и его порт;
  • resolv-retry infinite, - программа будет каждый раз узнавать IP адрес по DNS имени (если мы указывали DNS имя). Удобно тем, кто пользуется ноутбуками и не всегда подключен к сети;
  • nobind, - указываем, что мы не используем определенный локальный порт (т.е. программа будет выбирать случайный доступный порт);
  • ;http-proxy [proxy server] [proxy port #], - если вы используете прокси, то уберите ";". Здесь можно указать адрес (или DNS имя) прокси сервера и его порт;
  • ;http-proxy-retry # retry on connection failures,- переподключаться к прокси при обрыве связи. Также уберите ";", если вы собираетесь использовать прокси;
  • ns-cert-type server, - проверяем, что в сертификате сервера написано, что он сервер, а не клиент.

Теперь сохраняем настройки и запускаем VPN клиент. Через пару минут он подключится:

Подключенный OpenVPN

Следом настроим наше файловое хранилище.

к содержанию ↑

Настройка файлового хранилища на базе Debian

Для начала отвечу на вопрос: "А почему линукс, а не винда?". Да просто на виртуалке его намного быстрее настроить и он меньше требует ресурсов. Есть еще более компактные дистрибутивы типа TinyCore (самый маленький дистрибутив, что я находил), которые вовсе занимают 30 MB оперативной памяти и 2 GB жесткого диска, но нам сейчас это не подходит :)

Подключаемся к Debian. Устанавливаем пакет Samba командой:

apt-get install samba

Создаем учетную запись для подключения к этому хранилищу командой:

smbpasswd -a <имя пользователя Linux>

Далее нас попросят ввести пароль для этого пользователя, что мы и делаем. При этом стоит обратить внимание, что пользователь должен уже существовать (в первом случае он мне не дал создать пользователя, т.к. тот не существовал):

Создание пользователя user в Samba

Создаем папку, которая и будет выступать нашей общей директорией:

mkdir /home/user/testshare

После чего настраиваем Самбу. Открываем файл конфигурации любым текстовым редактором:

vim.tiny /etc/samba/smb.conf

Прокручиваем в самый низ и добавляем следующие строки:

[test share]
 path = /home/user/testshare
 available = yes
 valid users = user
 read only = no
 browsable = yes
 public = yes
 writable = yes

..где:

  • [test share], - название общей директории, которое будет отображаться в Windows;
  • path, - пусть до общей папки;
  • valid users, - кто может подключаться к этой папке.

Ну и всякие настройки доступа, которые нам сейчас не интересны.

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

service samba restart

Если не помогло, то можно перезагрузиться (что тоже очень быстро).

Теперь самое главное. Мы не сможем подключиться к общей папке, пока не пропишем маршрут на Debian. Т.к. наш VPN клиент знает куда подключаться, а наша виртуалка не знает куда отвечать (если только ваш VPN сервер не является шлюзом по умолчанию для всех компов, к которым вы хотите подключаться). В моем примере VPN сервер не является шлюзом по умолчанию, так что маршрут нужен.

Добавляем следующую строчку:

route add -net 10.10.20.0/24 gw 192.168.94.2

Эта команда означает, что мы хотим для любого адреса из сети 10.10.20.0 255.255.255.0 отправлять все пакеты на шлюз 192.168.94.2.

Теперь закиньте что-нибудь в общую папку или просто создайте текстовый файлик, чтобы проверить, что все доступно, например так:

echo 12345 > /home/user/testshare/test.txt

После этого тестируем нашу общую папку:

Проверяем доступность общей папки в Samba

Вводим учетные данные нашего Samba пользователя и видим, что всё доступно :)

Общая папка Samba доступна

А сейчас давайте несколько усложним задачу. Помимо файлового хранилища, мы хотим перенести наш VPN сервер на вторую виртуалку с Debian ( :) ) и к тому же мы хотим, чтобы весь трафик шел через него.

к содержанию ↑

Схема сети для второго примера VPN

У нас сеть домашний компьютер на Windows 10 x64, на нем развернута виртуалка на Debian 8, которая будет использоваться в качестве файлового хранилища, еще одна виртуалка, которая будет выступать VPN сервером, и рабочий ноутбук на Windows 10. Мы хотим с рабочего ноутбука подключиться к VPN серверу и иметь доступ ко всем локальным ресурсам домашней сети.

На маршрутизаторе мы имеем внешний адрес 87.215.46.32, внутренний адрес 192.168.1.1. на домашнем компе мы имеем внутренний адрес 192.168.1.2, а также 192.168.94.2 для подсети VMWare. На виртуальном клиенте мы имеем адрес 192.168.94.110 и именно этот адрес нам понадобится для удаленного доступа к нему. На виртуальном VPN сервере мы имеем адрес 192.168.94.100. В качестве VPN подсети я выбрал всю ту же 10.10.20.0 с префиксом /24 (маска 255.255.255.0).

Схема сети. Пример 2

Собственно, теперь перейдем к настройке этого примера.

к содержанию ↑

Настройка OpenVPN сервера для второго примера

Подключаемся к нашему серверу, входим под рутом и скачиваем openvpn:

aptitude install openvpn openssl

После установки копируем скрипты в папку программы:

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

Далее переходим в папку /etc/openvpn/easy-rsa и открываем файл vars текстовым редактором. Здесь нас интересуют следующие опции:

export KEY_SIZE=1024

export KEY_COUNTRY="RU"

export KEY_PROVINCE="CA"

export KEY_CITY="Moscow"

export KEY_ORG="barnak VPN"

export KEY_EMAIL="test"

export KEY_OU="test"

Соответственно что делать с этими полями вы уже знаете :)

export KEY_SIZE=1024 - длина ключа. Можно указать 2048, но особого смысла в этом не будет, только VPN медленнее станет работать.

Теперь эти переменные надо инициировать:

source ./vars

Мы получим предупреждение, что при запуске скрипта clean-all оно удалит все содержимое папки с ключами (а это папка с программой). Но нам ничего чистить не нужно, так что не обращаем внимания.

Теперь создаем сертификат УЦ:

./build-ca

После этого ключи DH:

./build-dh

Сертификат и ключи сервера:

./build-key-server debian-srv

И клиента:

./build-key client

Теперь создаем файл конфигурации сервера:

vim.tiny /etc/openvpn/server.conf

Добавляем туда следующее:

port 1194

proto tcp

dev tun

ca ca.crt

cert debian-srv.crt

key debian-srv.key

dh dh1024.pem

server 10.10.20.0 255.255.255.0

keepalive 10 120

cipher AES-128-CBC # AES

comp-lzo

max-clients 10

persist-key

persist-tun

client-to-client

status openvpn-status.log

log /var/log/openvpn.log

verb 4

mute 20

sndbuf 0

rcvbuf 0

push "route 10.10.20.0 255.255.255.0"

push "redirect-gateway def1"

Из новых настроек здесь следующие:

  • persist-key, - позволяет избежать некоторых проблем с доступностью при понижении прав (только для Linux);
  • persist-tun, - аналогично;
  • client-to-client, - позволяет клиентам видеть друг друга. Без этой опции клиенты смогут видеть только сервер и его ресурсы, но не других клиентов (аналог AP Isolation);
  • log /var/log/openvpn.log, - где будет храниться журнал событий openvpn;
  • push "redirect-gateway def1", - добавляет клиентам маршрут к VPN серверу, чтобы весь трафик ходил через него.

Теперь, чтобы мы все-таки могли открывать сайты, будучи подключенным к VPN, надо на сервере прописать правило NAT:

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

Где 10.10.20.0/24 - ваша виртуальная VPN подсеть.

Сохраняем правило NAT в файл:

iptables-save > /etc/network/iptables.conf

Теперь открываем текстовым редактором настройки сетевых интерфейсов:

vim.tiny /etc/network/interfaces

И добавляем к интерфейсу eth0 (или какой вы используете) строчку для автозагрузки правила:

post-up /sbin/iptables-restore < /etc/network/iptables.conf

Вот как это выглядит у меня:

Содержимое файла interfaces

Это нужно для того, чтобы при перезагрузке сервера правила NAT не удалилось.

И последний штрих. нужно включить IP Forwarding. Без этого скорее всего ваш NAT не заработает. Открываем текстовым редактором файл  /etc/sysctl.conf, находим строчку net.ipv4.ip_forward=1, раскомментируем ее (либо выставляем 1) и применяем командой:

sysctl -p

Теперь можно запускать OpenVPN. делается это довольно просто командой:

openvpn server.conf

Теперь сервер настроен и переходим к клиенту.

к содержанию ↑

Настройка VPN-клиента для второго примера

В общем-то здесь ничего нового. Только нужно предварительно стянуть ключи и сертификаты с нашего сервера. Я использовал для этого pscp. Пуск - Выполнить - CMD:

C:\Downloads\pscp -r -P 2200 root@87.215.46.32:/etc/openvpn/easy-rsa/keys/* C:\Program Files\OpenVPN\keys\

где:

  • C:\Downloads\pscp - путь до программы;
  • -r - копировать каталоги;
  • -P 2200 - порт для подключения к виртуалке;
  • root@87.215.46.32 - имя пользователя и адрес сервера;
  • /etc/openvpn/easy-rsa/keys/* - путь до ключей и сертификатов на сервере;
  • C:\Program Files\OpenVPN\keys\ - путь куда их копировать.

А дальше все, как в прошлый раз :)

Ну и.. На сим, пожалуй, можно переходить к послесловию.

к содержанию ↑

Послесловие

Вот мы и добрались до конца.

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

Как и всегда, если есть какие-то вопросы, мысли, дополнения и всё такое прочее, то добро пожаловать в комментарии к этой записи.

PS: За существование оной статьи отдельное спасибо другу проекта и члену нашей команды под ником “barn4k“.

  • Sonikelf

    Мощь..

    • Sol

      Не то слово...

  • Pavel

    Чет я не понял зачем такие сложности. А просто Team Viwer поставить не пойдет? Или уровень шифрование в нем не достаточно?

    • barn4k

      Через Teamviewer скорость будет крайне медленной, настроек VPN у него нет, какой трафик заворачивать, а какой нет - в нем не настроить, через прокси может не работать (если прокси блокирует все порты, кроме 80 и 443, то работать не будет), для телефона VPN не включить, и тп. Плюс надо держать комп с Teamviewer включенным все время, есть ограничение на кол-во клиентов. В то время, как OpenVPN можно поднять на своем маршрутизаторе без особых проблем и там гибкие настройки.

    • Sonikelf

      Совершенно не вариант.. Я бы даже сказал, что это вообще два разных подхода к самой сути даже :)

  • tvark

    Ага, сильно-сильно!!!
    Вот только вопрос... а разве нельзя обойтись одной реальной железкой, на которой будет стоять Debian и он будет выступать и VPN-сервером и Файловым хранилищем... или в одну корзину как говорится разные яйца не камильфо складывать???

    • barn4k

      Можно и на одной железке.
      У меня настроен OpenVPN сервер на маршрутизаторе TPLINK WR1043ND V2, при этом я могу из любой точки мира подключиться по DNS имени и пользоваться всеми локальными ресурсами своей сети.

    • Sonikelf

      Смотря, как говорится, где и зачем :)

  • Дмитрий

    Спасибо за статью. Осталось освоить и попробовать :)

    • barn4k

      Не за что :)

    • Sonikelf

      Лишь бы на пользу :)

  • zxy

    фуф)) Классно, давно хотел от вас такую статью.
    Но Дмитрий выше прав, надо осваивать..
    Как-то оно с наскока страшно :)
    Ну и про дебиан не понятно. Его же тоже устанавливать-настраивать?

    • barn4k

      Дебиан - это пример. OpenVPN можно поднять на чем вам удобнее, будь то Windows, Linux, Mac или ваш роутер

  • Вадим

    Спасибо за статью , обязательно попробую :)
    Вопрос такой , ясли я пользуюсь не VMWare а VirtualBox , то в настройках машины в разделе Сеть какой тип подключения указывать ? И ещё насчет 24 порта это как-то связано с разными виртуалками или можно использовать по умолчанию ?

    • barn4k

      Тип подключения - NAT или Bridged. Лучше всего первое, меньше настраивать.
      про 24 порта не понял. Если вы про префикс /24, то это маска сети, где может быть 254 устройства. По-умолчанию она и используется.

      • Вадим

        Спасибо , понял .

  • Сергей

    Спасибо за материал, очень полезно знать) Не могли бы разъяснить, в чем кардинальная разница между этими двумя примерами? В обоих случаях подключение к домашней сети идет через VPN-сервер, только в первом случае он крутится на физической машине с Windows 10, а во втором - на виртуалке под линуксом, правильно понимаю? В чем тогда принципиальные отличия?

    • barn4k

      Разница в том, что когда VPN крутится на виртуалке под линуксом, нужно еще дополнительные действия делать, а именно настраивать правила маршрутизации. Т.к. ваш шлюз не знает о том, что вы хотите через VPN какой-то трафик отправлять или получать.
      Ну и я описал два самых распространенных примера, когда есть только винда и когда еще есть какой-нибудь сервачок или виртуалки, которые все время запущены.

      • Сергей

        Ага, понял. Спасибо)

  • Дмитрий

    А для чего вообще vpn в локальной сети? Что бы от подмены пакетов защититься? другой причины не вижу

    • Дмитрий

      Уже разобрался, почитав другие статьи

  • Алексей

    День добрый!
    Подскажите пожалуйста по скрипту - "generate-all"

    При его копировании и запуске, вылетает ошибка "quot" не является внутренней или внешней
    командой, исполняемой программой или пакетным файлом."

    При игнорировании ошибки и дойдя до пункта 3, другая ошибка " Не удается найти C:\certs\*.old "

    И да, путь с установленным openvpn в скрипте менял на set PATH="C:\OpenVPN"
    Менял эти самые " на ковычки, но тогда синтаксис не правильный пишет
    Спасибо!

 

* - комментарии могут появляться не сразу, попасть в спам или быть удалены за несоответствие правилам