Предисловие почему возникла такая задача. Т.к. у меня в субботу перестал работать основной провайдер (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.