В продолжении статьи по объединению офисов с помощью не безопасного VPN PPTP

Вы узнаете как обезопаситься с помощью сферического коня в вакууме, то есть OpenVPN.

В этом примере будет использоваться 2048 битный ключ.

Не у всех есть белый IP адрес, не говоря уж о белом статическом IP. В основном оборудование MikroTik находится за NAT’ом, а то и за целой цепочки из NAT’ов. Особенно это касается интернета через 3/4G/LTE модемы и пионерские сети.

Статья так же, как и предыдущая, не претендует на уникальность и написана ради себя и таких же, как я. Разрешено свободное копирование, распространение, адекватная критика.

Подразумевается, что объединяемые сети имеют разные диапазоны IP адресов.

Конкретно в моем случае, офис M имеет 192.168.0.0/24, а офис T — 10.0.0.0/24
Офис B как концепт — 10.10.0.0/24

Для начала нам нужно выбрать и подготовить VDS

Установка OpenVPN сервера

За что я люблю линукс? Консоль и репозитории.
(ц) Я

На всякий случай вводим команду ls -l /dev/net/tun и если получаем ответ вида crw-rw-rw- 1 root root 10, 200 Nov 19 23:02 /dev/net/tun можно идти дальше.

Все операции проводятся под root пользователем.

Установим OpenVPN сервер командой apt-get install openvpn

Генерация RSA ключей

Определимся как и для скольких клиентов мы будем создавать учетные данные (ключи).
Примите во внимание, что после генерации ключей нельзя будет добавлять новых клиентов. Придется заново генерировать для всех.

Как вы поняли — аутентификация будет через ключи. Давайте создадим их.

Создадим директорию командой
mkdir /etc/openvpn/easy-rsa/
Копируем в нее конфигурацию для работы с RSA ключами командой
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

Переходим в эту директорию командой cd /etc/openvpn/easy-rsa/
В этой директории отредактируем файл vars командой nano vars
В этом файле нам нужны только строки export KEY_:

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_OU="MyOrganizationalUnit"
export KEY_CN="example.com"

Данные в них меняем на свои, но они ни на что не влияют. Я указал:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="77"
export KEY_CITY="Moscow"
export KEY_ORG="Roga I Kopyta"
export KEY_EMAIL="ovpn@roga-i.kopyta"
export KEY_OU="IT Otdel"
export KEY_CN="Server"

Инициализируем данные командой
source ./vars
Вылезает предупреждение: NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

Делаем как нам написали, вводим команду
./clean-all

Создаем корневой сертификат командой
./build-ca

Если вылезает ошибка, то в конце файла vars добавляем строку export KEY_ALTNAMES="something" и заново инициализируем данные командой
source ./vars

Корневой сертификат создан, создадим сертификаты для сервера и клиентов.

Генерируем сертификаты сервера и клиентов:
./build-key-server server (укажем пароль gETHoZOSH81JfUHOSSJt)
./build-key M (укажем пароль OUsZCcqY8PSf4OA92mV6)
./build-key T (укажем пароль H2P6cS9jxUom4Dz7Nlhd)
./build-key B (укажем пароль 9FNYQZDRJu7OlbdU8hab)
./build-key Moron (укажем пароль dxFlacdssmHZNrC90ZRi)
./build-key user (укажем пароль LiYQX4rdY0A2drxnQVTI)
Максимальная длина пароля 20 символов.

Либо если мы хотим сделать пин код на сертификат и обойтись одним файлом:
./build-key-pkcs12 client518 (укажем пароль JugsdhgjIHi87) и Export Password — пин код. Создастся файл client518.p12, который можно использовать.
Теперь вместо трех строк с указанием корневого, пользовательского сертификата и ключа, нужно указывать:
pkcs12 client518.p12

Сразу создайте сколько нужно сертификатов, но если нужно добавить еще клиентов:
cd /etc/openvpn/easy-rsa/
source ./vars
Игнорируем ошибку
./build-key client220 (укажем пароль LiYQjhbi7hnjdsfgfTI)
Завершаем генерацию:
./build-dh

На этапе генерации ключей — создайте для каждого свой пароль.

Далее генерируем ключ Диффи Хеллмана командой
./build-dh

Создаем ключ для tls аутентификации командой
openvpn --genkey --secret keys/ta.key
Этот ключ нам не пригодится, но создать его не помешает.

Переходим в директорию с ключами командой
cd keys
Копируем оттуда нужные ключи в директорию /etc/openvpn/ командой
cp server.crt server.key ca.crt dh2048.pem ta.key /etc/openvpn/

Для настройки клиентов скачаем ключи из папки /etc/openvpn/easy-rsa/keys
Для этого я использую FileZilla и протокол SFTP

Нам нужны файлы:
ca.crt
ta.key

И для каждого клиента:
client1.crt
client1.key

и т.д.

Настройка OpenVPN сервера

Скопируем пример конфигурации командой
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
Распакуем командой
gzip -d /etc/openvpn/server.conf.gz

Приступим к самой настройке командой
nano /etc/openvpn/server.conf

Рассмотрим содержимое более подробно.

port 1194 # Порт
proto tcp # Протокол, udp быстрее, но микротик его не поддерживает
dev tun #Название виртуального устройства
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh2048.pem
server 10.250.10.0 255.255.255.0 # Подсеть для VPN
ifconfig-pool-persist ipp.txt # Тут будут храниться ip адреса клиентов (работает через раз и не пригодится)
keepalive 10 120
mssfix 1500
tun-mtu 1500
fast-io
txqueuelen 250
sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"
;comp-lzo # Сжатие микротиком не поддерживаетсся
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 4
mute 20
client-to-client # Разрешаем соединения клиентов друг с другом
client-config-dir /etc/openvpn/ccd # Тут будут настройки для каждого филиала

Создаем директорию для настроек клиентов:
mkdir /etc/openvpn/ccd

Для филиалов добавляем файлы индивидуальных настроек:

nano /etc/openvpn/ccd/M, где M это RSA ключ данного клиента
Вписываем маршрут в эту сеть:
iroute 192.168.0.0 255.255.255.0

nano /etc/openvpn/ccd/T
Вписываем маршрут в эту сеть:
iroute 10.0.0.0 255.255.255.0

nano /etc/openvpn/ccd/B
Вписываем маршрут в эту сеть:
iroute 10.10.0.0 255.255.255.0

Перезагружаем
reboot

Должен появится tun0 интерфейс, проверим командой
ifconfig

Настройка MikroTik

Заходим в настройки микротика и перетаскиваем в WinBox сертификат и ключ свежесозданного client220
Далее импортируем сертификат: System -> Certificates -> Import
Сначала crt, за тем key. Получаем такую картину:

Создаем OVPN соединение: Interface -> + -> OVPN Client

Указываем IP, сертификат и далее по скрину. Имя пользователя и пароль не важны.

Операция аналогичная на каждом микротике каждого отделения.

Исходя из тестов, установим на микротике MTU 1472

Маршрутизация MikroTik

Чтобы микротик знал, за каким интерфейсом находится нужная сеть, пропишем маршрут.
IP -> Routes -> +
Маршрут до 192.168.0.0/24 и вообще до любой сети добавляется аналогично.

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

Скачиваем OpenVPN клиент для Windows

Устанавливаем и открываем папку, куда программа установилась
C:\Program Files\OpenVPN\config

Копируем в эту папку файлы корневого сертификата и сертификата пользователя ca.crt, Moron.crt, Moron.key

Создаем файл профиля с разрешением .ovpn

В моем случае это Moron.ovpn

Файл имеет простое содержание:

client
dev tun
proto tcp
remote *.*.*.* 1194 # IP адрес VDS и порт
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt # Корневой сертификат
cert Moron.crt # Сертификат клиента
key Moron.key # Ключ клиента
;pkcs12 Moron.p12 # Если мы генерировали через ./build-key-pkcs12
verb 3
mute 20
route 192.168.0.0 255.255.255.0 # Маршрут до сети M
route 10.0.0.0 255.255.255.0 # Маршрут до сети T
route 10.10.0.0 255.255.255.0 # Маршрут до сети B

Параметры можно передавать и с сервера, если прописать их в файле
nano /etc/openvpn/ccd/Имя_сертификата
push "route 10.0.0.0 255.255.255.0"
push "route 192.168.0.0 255.255.255.0"
push "route 10.10.0.0 255.255.255.0"

Но лучше прописывать до конкретного IP, команда
push "route 192.168.0.210"

Запускаем OpenVPN клиент, в трее правой кнопкой жмем подключиться.

Теперь у вас есть надежно защищенная сеть между офисами и работниками.

Отзыв сертификата

Случается, что ключ потеряли, или работник уволился. Нужно заменить сертификат или вовсе заблокировать.

В случае замены утери сертификата или если имя не привязано к пользователю — просто перегенириуем его заново с тем же именем (у меня не сработало). Как это сделать описано в разделе ниже.

Для отзыва сертификата добавим его в список отозванных (Капитан Очевидность намекает)

cd /etc/openvpn/easy-rsa/
source ./vars
./revoke-full client220
Вылезает ошибка 23 и в /etc/openvpn/easy-rsa/keys создается файл crl.pem

Переносим его в /etc/openvpn командой
mv "/etc/openvpn/easy-rsa/keys/crl.pem" "/etc/openvpn/crl.pem"
Добавляем в /etc/openvpn/server.conf
Путь до этого файла:
crl-verify /etc/openvpn/crl.pem
Сохраняем и перезагружаем

С этой темной материей нужно быть аккуратным.

Добавление сертификата

Если нужно добавить нового пользователя, как я описывал выше, нужно:

cd /etc/openvpn/easy-rsa/
source ./vars
Игнорируем ошибку
./build-key client518 (укажем пароль JugsdifytuIHi87)
Либо если мы хотим сделать пин код на сертификат и обойтись одним файлом:
./build-key-pkcs12 client518 (укажем пароль JugsdhgjIHi87) и Export Password — пин код. Создастся файл client518.p12, который можно использовать.
Теперь вместо трех строк с указанием корневого, пользовательского сертификата и ключа, нужно указывать:
pkcs12 client518.p12
Завершаем генерацию:
./build-dh

Мы получим сертификат для нового клиента, либо если мы укажем имя существующего сертификата, то просто его заменим. Старый становится недействительным.

mtu

Загадочная вещь, пока с ней не столкнешься, не разберешься.

Сеть в отделениях имеет mtu 1500, OpenVPN mtu жестко не прописан. Windows Server 2008R2 имеет mtu 1500
Чтобы терминальный доступ не показывал черное окно — значение mtu OpenVPN должно быть больше или равно mtu Windows Server.
Найти mtu можно командой: ping нужный_IP -f -l 1472
Уменьшая или увеличивая 1472, находим наибольшее фрагментированное значение и прибавляем 28

Доступ в Интернет

OpenVPN создан для безопасного доступа в сеть. Но чтобы этот доступ заработал — внесем дополнительные правила:
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.250.10.0/24 -o eth0 -j SNAT --to-source IP_АДРЕС_VDS

А в клиентские Windows настройки OpenVPN добавим строчки:
redirect-gateway def1
dhcp-option DNS 8.8.8.8

Теперь при подключении — интернет проходит через OpenVPN

Чтобы правила не слетали, сохраним их командой:
iptables-save > /etc/iptables_rules
Добавим их в автозагрузку:
nano /etc/rc.local
Перед exit добавим строчку:
/sbin/iptables-restore < /etc/iptables_rules

В заключении

При написании статьи, все операции я проделывал лично не один десяток раз и могу с уверенностью сказать: если у вас не получается — внимательней следуйте инструкции.

Я смогу ответить только на общие вопросы и сразу предупреждаю: если хотите, чтобы я за вас все настроил — будьте готовы заплатить исходя из объема задачи.

Если данная реализация слишком сложная — можно поднять VPN PPTP сервер по более простой инструкции.