Предисловие почему возникла такая задача. Т.к. у меня в субботу перестал работать основной провайдер (NetBynet) и я в воскресенье временно перешел на работу через USBмодем ZTE MF823D + SIM карта от мобильного оператора Tele2, то, как мне в этом случае подключаться из вне, ведь выход в интернет — это NAT мобильного оператора. Я пока вижу на этот счет вот такое вот решение: организовать чтобы микротик который является роутером локальной сети инициализировал удаленное подключение к моему VPS серверу, где работает серверная часть сервиса OpenVPN. А вот на VPS будет правило проброс порта, т. е. Я думаю, будет такая схема:

WAN → VPS (Port Forward) <-> OpenVPN ↔ Mikrotik (Port Forward) <-> LAN

Может, конечно, слишком уж усложнено, но главное начать, получить опыт и видение процесса, а уже после оптимизировать.

Что потребуется:

  • VPS сервер с операционной системой Ubuntu 18.04 Server + статический IP-адрес
  • Mikrotik (будет RB2011UiAS-2HnD (v6.45.2)) + USB Modem ZTE MF823D + SIM-карта (Tele2)
  • Желание заняться данным вопросом (у меня с этим проблем нет)

Шаг №1: Подготавливаю систему, а система – это VPS сервис купленный в рамках перехода на URL ссылке

Шаг №2: Устанавливаю пакет openvpn из репозитариев системы + пакет easy-rsa

root@srv-debian:~# ssh -l root <VPS-WAN-IP>

root@srv-vpn:~#

root@srv-vpn:~# apt-cache show openvpn | grep Version

Version: 2.4.4-2ubuntu1.3

Version: 2.4.4-2ubuntu1

root@srv-vpn:~#

root@srv-vpn:~# apt-cache search easy-rsa

easy-rsa - Simple shell based CA utility

root@srv-vpn:~#

root@srv-vpn:~#  apt-get install -y openvpn easy-rsa

Шаг №3: Из запакованного файла примера извлекаю сам пример серверной части OpenVPN:

root@srv-vpn:~# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Шаг №4: Приступаю к составлению своего собственного файла server.conf с учетом требований/возможностей того оборудования которое будет подключаться к текущему серверу через OpenVPN клиент – это Mikrotik.

Функционал Mikrotik по части OpenVPN не поддерживает:

  • UDP соединения
  • LZO сжатие
  • TLS аутентификацию
  • Аутентификация через связку логин и пароль
root@srv-vpn:~# nano /etc/openvpn/server.conf

root@srv-vpn:~# cat /etc/openvpn/server.conf | grep -v "#" | grep -v ";" | grep -v "^$"

port 1194

proto tcp

dev tun0

ca /etc/openvpn/ca.crt

cert /etc/openvpn/server.crt

dh /etc/openvpn/dh2048.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist /var/log/openvpn/ipp.txt

client-config-dir ccd

client-to-client

keepalive 10 120

cipher AES-128-CBC

auth SHA1

user nobody

group nogroup

persist-key

persist-tun

status /var/log/openvpn/openvpn-status.log

log         /var/log/openvpn/openvpn.log

log-append  /var/log/openvpn/openvpn.log

verb 4

explicit-exit-notify 1

root@srv-vpn:~#

root@srv-vpn:~# mkdir /etc/openvpn/ccd

Шаг №5: Создаю самоподписанные сертификаты через комплект скриптов easy-rsa

root@srv-vpn:~# cp -r /usr/share/easy-rsa/ /etc/openvpn

root@srv-vpn:~# mkdir /etc/openvpn/easy-rsa/keys

Заменяю дефолтные значения на свои

root@srv-vpn:~# nano /etc/openvpn/easy-rsa/vars

export KEY_COUNTRY="RU"

export KEY_PROVINCE="RU"

export KEY_CITY="MOSCOW"

export KEY_ORG="RUSSIAN"

export KEY_EMAIL="support@ekzorchik.ru"

export KEY_OU="ekzorchik"

После не забываем сохранить внесенные изменения.

Шаг №6: Генерируем настройки протокола Диффи Хелмана:

root@srv-vpn:~# openssl dhparam -out /etc/openvpn/dh2048.pem 2048

root@srv-vpn:~# cd /etc/openvpn/easy-rsa/

root@srv-vpn:/etc/openvpn/easy-rsa# . ./vars

root@srv-vpn:/etc/openvpn/easy-rsa# ./clean-all

Шаг №7: Создаем центр сертификации (Certification Authority или CA):

root@srv-vpn:/etc/openvpn/easy-rsa# ./build-ca

grep: /etc/openvpn/easy-rsa/openssl.cnf: No such file or directory

pkitool: KEY_CONFIG (set by the ./vars script) is pointing to the wrong

version of openssl.cnf: /etc/openvpn/easy-rsa/openssl.cnf

The correct version should have a comment that says: easy-rsa version 2.x

root@srv-vpn:/etc/openvpn/easy-rsa# ln -s openssl-1.0.0.cnf openssl.cnf

root@srv-vpn:/etc/openvpn/easy-rsa# ./build-ca

Can't load /root/.rnd into RNG

140151202861504:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd

Country Name (2 letter code) [RU]:

State or Province Name (full name) [RU]:

Locality Name (eg, city) [MOSCOW]:

Organization Name (eg, company) [RUSSIAN]:

Organizational Unit Name (eg, section) [ekzorchik]:

Common Name (eg, your name or your server's hostname) [RUSSIAN CA]:

Name [EasyRSA]:

Email Address [support@ekzorchik.ru]:

root@srv-vpn:/etc/openvpn/easy-rsa#

Шаг №8: Создаю/Сгенерирую сертификат для самого сервера:

root@srv-vpn:/etc/openvpn/easy-rsa# ./build-key-server server

Can't load /root/.rnd into RNG

140386292023744:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd

Generating a RSA private key

Country Name (2 letter code) [RU]:

State or Province Name (full name) [RU]:

Locality Name (eg, city) [MOSCOW]:

Organization Name (eg, company) [RUSSIAN]:

Organizational Unit Name (eg, section) [ekzorchik]:

Common Name (eg, your name or your server's hostname) [server]:

Name [EasyRSA]:

Email Address [support@ekzorchik.ru]:

Certificate is to be certified until Sep 13 09:47:05 2029 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

root@srv-vpn:/etc/openvpn/easy-rsa#

Шаг №9: Теперь необходимо скопировать сгенерированный сертификат в корневую директорию OpenVPN:

root@srv-vpn:/etc/openvpn/easy-rsa# cd ~

root@srv-vpn:~# cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

root@srv-vpn:~# ls -l /etc/openvpn/

total 60

-rw-r--r-- 1 root root  1749 Sep 16 12:49 ca.crt

drwxr-xr-x 2 root root  4096 May 14 11:25 client

-rw-r--r-- 1 root root   424 Sep 16 12:33 dh2048.pem

drwxr-xr-x 3 root root  4096 Sep 16 12:41 easy-rsa

drwxr-xr-x 2 root root  4096 May 14 11:25 server

-rw-r--r-- 1 root root 10999 Sep 16 12:17 server.conf

-rw-r--r-- 1 root root 10976 Sep 16 12:12 server.conf.save

-rw-r--r-- 1 root root  5621 Sep 16 12:49 server.crt

-rw------- 1 root root  1708 Sep 16 12:49 server.key

-rwxr-xr-x 1 root root  1301 May 14 11:25 update-resolv-conf

root@srv-vpn:~#

Шаг №10: Перезапускаю OpenVPN сервис:

root@srv-vpn:~# systemctl restart openvpn && systemctl status openvpn |head -n5 && netstat -tulpn | grep openvpn

● openvpn.service - OpenVPN service

   Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)

   Active: active (exited) since Mon 2019-09-16 12:51:10 MSK; 6ms ago

  Process: 28558 ExecStart=/bin/true (code=exited, status=0/SUCCESS)

 Main PID: 28558 (code=exited, status=0/SUCCESS)

Но вот у меня он почему-то не поднялся, команда netstat ничего не показала. Разбираюсь!!!

root@srv-vpn:~# nano /etc/sysctl.conf

net.ipv4.ip_forward=1

root@srv-vpn:~# sysctl -p

net.ipv4.ip_forward = 1

root@srv-vpn:~#

root@srv-vpn:~# systemctl enable openvpn@server

Created symlink /etc/systemd/system/multi-user.target.wants/openvpn@server.service → /lib/systemd/system/openvpn@.service.

root@srv-vpn:~#

root@srv-vpn:~# systemctl status openvpn@server.service

● openvpn@server.service - OpenVPN connection to server

   Loaded: loaded (/lib/systemd/system/openvpn@.service; indirect; vendor preset: enabled)

   Active: activating (auto-restart) (Result: exit-code) since Mon 2019-09-16 13:02:24 MSK; 875ms ago

     Docs: man:openvpn(8)

           https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage

           https://community.openvpn.net/openvpn/wiki/HOWTO

  Process: 28750 ExecStart=/usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf

 Main PID: 28750 (code=exited, status=1/FAILURE)

root@srv-vpn:~# systemctl stop openvpn@server.service

root@srv-vpn:~# systemctl start openvpn@server.service

Job for openvpn@server.service failed because the control process exited with error code.

See "systemctl status openvpn@server.service" and "journalctl -xe" for details.

root@srv-vpn:~# openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf

root@srv-vpn:~# netstat -tulpn | grep openvpn

root@srv-vpn:~# tail -f /var/log/openvpn

openvpn/     openvpn.log 

root@srv-vpn:~# tail -f /var/log/openvpn/openvpn.log

Options error: --explicit-exit-notify can only be used with --proto udp

Use --help for more information.

^C

root@srv-vpn:~# nano /etc/openvpn/server.conf

#explicit-exit-notify 1

#tls-auth ta.key 0 # This file is secret

root@srv-vpn:~# systemctl stop openvpn@server && systemctl start openvpn@server && systemctl status openvpn@server | head -n5 && netstat -tulpn | grep openvpn

root@srv-vpn:~# tail -f /var/log/openvpn/openvpn.log

Options error: You must define private key file (--key) or PKCS#12 file (--pkcs12)

Use --help for more information.

tail: /var/log/openvpn/openvpn.log: file truncated

Options error: You must define private key file (--key) or PKCS#12 file (--pkcs12)

Use --help for more information.

^C

root@srv-vpn:~#

root@srv-vpn:~# touch /var/log/openvpn/openvpn-status.log

Шаг №11: У меня в файле server.conf пропущена строчка которую добавляю ниже:

root@srv-vpn:~# nano /etc/openvpn/server.conf

key /etc/openvpn/server.key

root@srv-vpn:~# openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --key /etc/openvpn/keys/ca.key --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf && netstat -tulpn | grep openvpn

tcp        0      0 0.0.0.0:1194            0.0.0.0:*               LISTEN      4500/openvpn       

root@srv-vpn:~#

Шаг №12: Так разобрался чего не хватало. Теперь перезапускаю сервис OpenVPN по-другому:

root@srv-vpn:~# systemctl stop openvpn@server && systemctl start openvpn@server && systemctl status openvpn@server | head -n5 && netstat -tulpn | grep openvpn● openvpn@server.service - OpenVPN connection to server

   Loaded: loaded (/lib/systemd/system/openvpn@.service; indirect; vendor preset: enabled)

   Active: active (running) since Tue 2019-09-17 10:44:51 MSK; 12ms ago

     Docs: man:openvpn(8)

           https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage

tcp        0      0 0.0.0.0:1194            0.0.0.0:*               LISTEN      4538/openvpn       

root@srv-vpn:~#

Вот теперь сервис работает.

root@srv-vpn:~# ip r

default via <VPS-WAN-IP-GW> dev eth0 onlink

10.8.0.0/24 via 10.8.0.2 dev tun0

10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1

<VPS-WAN-IP>/24 dev eth0 proto kernel scope link src <VPS-WAN-IP>

root@srv-vpn:~#

Шаг №13: Генерирую сертификат для клиента (в роли клиента у меня Mikrotik) через который будет производиться подключение к данному серверу Ubuntu 18.04 Server + OpenVPN Server:

На заметку: Именование сертификатов только на английском и именование без пробелов и спецсимволов.

root@srv-vpn:~# cd /etc/openvpn/easy-rsa/

root@srv-vpn:/etc/openvpn/easy-rsa# . ./vars

root@srv-vpn:/etc/openvpn/easy-rsa# ./build-key client1

Can't load /root/.rnd into RNG

140644942246336:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd

Using configuration from /etc/openvpn/easy-rsa/openssl.cnf

Can't load /root/.rnd into RNG

139757250793920:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd

Check that the request matches the signature

Signature ok

Generating a RSA private key

Certificate is to be certified until Sep 13 10:18:28 2029 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

root@srv-vpn:/etc/openvpn/easy-rsa#

root@srv-vpn:/etc/openvpn/easy-rsa# cd ~

Шаг №14: Копирую файлы client1.crt & client1.key На Mikrotik самым безопасным способом который у Вас есть и желательно не через FTP (FTP-не должен быть выставлен во вне, только ftps). Способы: SSH, Telegram. В моем случае я копирую на другой хостинг который подключен к Mikrotik через публичные ключи SSH:

root@srv-vpn:~# scp -P 22900 /etc/openvpn/easy-rsa/keys/{client1.crt,client1.key} ekzorchik@remote.ru:/home/ekzorchik

ekzorchik@remote.ru's password:

client1.crt 100% 5505     4.0MB/s   00:00   

client1.key 100% 1704   550.4KB/s   00:00   

root@srv-vpn:~#

Шаг №15: Подключаюсь к Mikrotik по SSH (из доверенной системы) и выполняю команды импортирования клиентских ключей:

[admin@MikroTik] > certificate import file-name=client1.crt

passphrase:

     certificates-imported: 1

     private-keys-imported: 0

            files-imported: 1

       decryption-failures: 0

  keys-with-no-certificate: 0

[admin@MikroTik] > certificate import file-name=client1.key

passphrase:

     certificates-imported: 0

     private-keys-imported: 1

            files-imported: 1

       decryption-failures: 0

  keys-with-no-certificate: 0

[admin@MikroTik] >

[admin@MikroTik] > interface ovpn-client add connect-to=<VPS-WAN-IP> auth=sha1 certificate=client1.crt_0 name=openvpn user=client1 port=1194 profile=default cipher=aes128

Шаг №16: Проверяю, а поднялось ли соединение:

[admin@MikroTik] > ip address print

Flags: X - disabled, I - invalid, D - dynamic

 #   ADDRESS            NETWORK         INTERFACE                                                                 

 0 D <VPS-WAN-IP>/24    <VPS-WAN-0>     ether1                                                                                              

 1 D 10.8.0.6/32        10.8.0.5 openvpn                                                                                                                         

[admin@MikroTik] >

[admin@MikroTik] > interface ovpn-client monitor openvpn

    status: connected

    uptime: 7m29s

  encoding: AES-128-CBC/SHA1

       mtu: 1500

Ответ да, мой Mikrotik установил vpn соединение.

Проверяю, вижу ли я srv-vpn с Mikrotik(а):

[admin@MikroTik] > ping address=10.8.0.1 interface=openvpn

  SEQ HOST                                     SIZE TTL TIME  STATUS             

    0 10.8.0.1                                   56  64 5ms 

    1 10.8.0.1                                   56  64 6ms 

    sent=2 received=2 packet-loss=0% min-rtt=5ms avg-rtt=5ms max-rtt=6ms

[admin@MikroTik] >

А вот если из сети за Mikrotik(ом) также проверить, вижу ли я систему srv-vps – ответ нет:

root@srv-debian:~# ping 10.8.0.1

PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.

^C

--- 10.8.0.1 ping statistics ---

2 packets transmitted, 0 received, 100% packet loss, time 30ms

root@srv-debian:~#

Дело в том, что на Микротике нужно создать правило masquerade

[admin@MikroTik] > ip firewall nat add chain=srcnat out-interface=openvpn action=masquerade

root@srv-debian:~# ping 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_seq=1 ttl=63 time=6.21 ms

64 bytes from 10.8.0.1: icmp_seq=2 ttl=63 time=3.43 ms

^C

--- 10.8.0.1 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 2ms

rtt min/avg/max/mdev = 3.430/4.817/6.205/1.389 ms

root@srv-debian:~#

А что говорят логи на Ubuntu 18.04:

root@srv-vpn:~# tail -f /var/log/openvpn/openvpn-status.log

OpenVPN CLIENT LIST

Updated,Tue Sep 17 11:05:16 2019

Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since

client1,<MIKROTIK-NAT-TELE2>:49627,2957,4257,Tue Sep 17 11:04:15 2019

ROUTING TABLE

Virtual Address,Common Name,Real Address,Last Ref

10.8.0.6,client1,<MIKROTIK-NAT-TELE2>:49627,Tue Sep 17 11:04:16 2019

GLOBAL STATS

Max bcast/mcast queue length,0

END

^C

root@srv-vpn:~#

вижу установленное соединение, проверяю вижу ли я адрес 10.8.0.6 который получил Mikrotik при установленном OpenVPN соединении:

root@srv-vpn:~# ping 10.8.0.6 -c 1  | head -n2

PING 10.8.0.6 (10.8.0.6) 56(84) bytes of data.

64 bytes from 10.8.0.6: icmp_seq=1 ttl=64 time=6.45 ms

А адрес srv-vpn – 10.8.0.1

Итого я развернул OpenVPN сервер на Ubuntu 18.04 Server и подключил к нему OpenVPN клиентскую часть на Mikrotik RB2011UiAS-2HnD (v6.45.2), но здесь я не показал, как настроить правила брандмауэра и маршруты дабы трафик при подключении на внешний IP перенаправлял меня во внутреннюю сеть за Mikrotik. Об этом в следующей заметке. Т.к. все нужно оттестировать. Запомните, ставите задачу и разбиваете ее на множество мелких, соединяете их и получаете свою задачу. А пока на этом всё, с уважением автор блога Олло Александр aka ekzorchik.