Задача: Реализовать подключение миникомпьютера Raspberry Pi3 Model B к OpenVPN серверу посредством которого я получаю второй доступ в свою сеть.

Первый – это через Mikrotik Cloud при динамическом внешнем IP от провайдера, как это делается я уже оформил здесь.

Т.е. будет так:

Raspberry Pi 3 Model B (Raspbian Stretch) + USB Modem (OpenVPN клиент) <-> srv-vps (Ubuntu 18.04 Server) <-> Mikrotik (RB2011UiAS-2HnD (v6.45.2)) <-> LAN(ы)

Что уже есть:

От 15.11.2019

Образ 2018-11-13-raspbian-stretch.img записан на карту памяти (MicroSD размером 32Gb) и вставлен в разъем на миникомпьютере Raspberry Pi 3 Model B

USB Modem ZTE MF823D (+ SIM-карта TELE2, тариф 40Gb за 500рублей)

pi@raspberrypi:~ $ sudo rm -Rf /var/lib/apt/lists

pi@raspberrypi:~ $ sudo apt-get update && sudo apt-get upgrade -y

pi@raspberrypi:~$ sudo rm -f /etc/localtime

pi@raspberrypi:~ $ sudo ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

pi@raspberrypi:~ $ sudo apt-get install ntpdate -y

pi@raspberrypi:~ $ sudo bash -c "echo '@reboot /usr/sbin/ntpdate -s

0.pool.ntp.org > /dev/null'" | sudo -s tee /var/spool/cron/crontabs/root

pi@raspberrypi:~ $ sudo apt-get autoremove -y

pi@raspberrypi:~ $ sudo sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen && sudo locale-gen

pi@raspberrypi:~ $ sudo locale-gen --purge en_GB.UTF-8

pi@raspberrypi:~ $ echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale

pi@raspberrypi:~ $ echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale

pi@raspberrypi:~ $ echo "LANGUAGE="en_US.UTF-8"" | sudo tee -a /etc/default/locale

pi@raspberrypi:~ $ sudo reboot

pi@raspberrypi:~ $ uname -a && lsb_release -a

Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux

No LSB modules are available.

Distributor ID:         Raspbian

Description: Raspbian GNU/Linux 9.11 (stretch)

Release:        9.11

Codename:  stretch

В миникомпьютер подключен USB модем – ZTE

Шаг №1: Выпускаю на OpenVPN-сервер сертификат для клиента который будет использовать на Raspbian Stretch для подключения.

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

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

NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

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

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

Certificate is to be certified until Nov 11 11:15:19 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 ~

root@srv-vpn:~#

root@srv-vpn:~# ls /etc/openvpn/easy-rsa/keys/craspbian.* -l

-rw-r--r-- 1 root root 5513 Nov 14 14:15 /etc/openvpn/easy-rsa/keys/craspbian.crt

-rw-r--r-- 1 root root 1078 Nov 14 14:15 /etc/openvpn/easy-rsa/keys/craspbian.csr

-rw------- 1 root root 1704 Nov 14 14:14 /etc/openvpn/easy-rsa/keys/craspbian.key

root@srv-vpn:~#

root@srv-vpn:~# sudo cp /etc/openvpn/ccd/client1 /etc/openvpn/ccd/craspbian

root@srv-vpn:~# sudo nano /etc/openvpn/ccd/craspbian

iroute 192.168.0.0 255.255.255.0

push "route 172.33.33.0 255.255.255.0"

root@srv-vpn:~# sudo systemctl reload openvpn

Шаг №2: Копирую сертификаты на OwnCloud – я его использую для обмена файлами, наработками, конфигурационными файлами и т.д.

root@srv-vpn:~# mount -t davfs https://<IP&DNS>/remote.php/dav/files/openvpn /media/client -o rw

Please enter the username to authenticate with server

https://<IP&DNS>/remote.php/dav/files/openvpn or hit enter for none.

Username: openvpn

Please enter the password to authenticate user openvpn with server

https://<IP&DNS>/remote.php/dav/files/openvpn or hit enter for none.

Password:

/sbin/mount.davfs: the server certificate does not match the server name

/sbin/mount.davfs: the server certificate is not trusted

issuer:      <IP&DNS>

subject:    <IP&DNS>

identity:  <IP&DNS>

fingerprint: 4c:ba:66:59:71:93:0f:b7:ff:d8:ed:b8:9d:b2:ac:55:49:7f:5d:b3

You only should accept this certificate, if you can

verify the fingerprint! The server might be faked

or there might be a man-in-the-middle-attack.

Accept certificate for this session? [y,N] y

root@srv-vpn:~#

root@srv-vpn:~# cp /etc/openvpn/easy-rsa/keys/craspbian.* /media/client/

root@srv-vpn:~# ls /media/client/ | egrep craspbian*

craspbian.crt

craspbian.csr

craspbian.key

root@srv-vpn:~#

root@srv-vpn:~# umount /media/client

/sbin/umount.davfs: waiting while mount.davfs (pid 29212) synchronizes the cache .. OK

root@srv-vpn:~# exit

Шаг №3: А теперь перехожу к установка OpenVPN клиента для связи с VPS на которой у меня развернут OpenVPN сервер:

pi@raspberrypi:~ $ apt-cache show openvpn | grep Version

Version: 2.4.0-6+deb9u3

pi@raspberrypi:~ $ sudo apt-get install -y openvpn

pi@raspberrypi:~ $ sudo mkdir /etc/openvpn/keys

Шаг №4: Инициализирую подключение к OwnCloud под клиентом с логином Openvpn и копирую сгенерированные сертификаты на текущую систему Raspbian Stretch:

pi@raspberrypi:~ $ sudo apt-get install -y davfs2

pi@raspberrypi:~ $ sudo mount -t davfs https://IP&DNS/remote.php/dav/files/openvpn /media/pi -o rw

Username: openvpn

Password:

pi@raspberrypi:~ $ df -H | grep /media/pi

https://IP&DNS/remote.php/dav/files/openvpn  1.1G  5.7M  1.1G   1% /media/pi

pi@raspberrypi:~ $

pi@raspberrypi:~ $ sudo cp /media/pi/craspbian.* /etc/openvpn/keys/

pi@raspberrypi:~ $ sudo cp /media/pi/ca.crt /etc/openvpn/keys/

pi@raspberrypi:~ $ sudo chown -R root:root /etc/openvpn/keys/

pi@raspberrypi:~ $ sudo chmod 600 /etc/openvpn/keys/*

pi@raspberrypi:~ $ sudo umount /media/pi

/sbin/umount.davfs: waiting while mount.davfs (pid 9685) synchronizes the cache .. OK

pi@raspberrypi:~ $

Шаг №5: Создаю клиентский файл подключения OpenVPN:

pi@raspberrypi:~ $ sudo nano /etc/openvpn/client/client.conf

client

dev tun0

proto tcp

remote <vpn.remote.ru> 1194

resolv-retry infinite

nobind

user nobody

group nogroup

persist-key

persist-tun

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/craspbian.crt

key /etc/openvpn/keys/craspbian.key

cipher AES-128-CBC

auth SHA1

verb 4

mute 20

status /var/log/openvpn-status.log

log /var/log/openvpn.log

pi@raspberrypi:~ $ sudo touch /var/log/openvpn.log

Проверяю:

pi@raspberrypi:~ $ sudo openvpn --config /etc/openvpn/client/client.conf

соединение устанавливается, об этом мне говорит OpenVPN-сервер:

root@srv-vpn:~# tail -f /var/log/openvpn/ipp.txt | grep craspbian

craspbian,10.8.0.20

а адрес удаленной системы, точнее Raspbian – 10.8.0.22

root@srv-vpn:~# ssh -l pi 10.8.0.22 "uname -a"

The authenticity of host '10.8.0.22 (10.8.0.22)' can't be established.

ECDSA key fingerprint is SHA256:arZvAjl0O8wkh9lf1WbcTI4lr4QbwB7KBKngCAQHP0Y.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '10.8.0.22' (ECDSA) to the list of known hosts.

pi@10.8.0.22's password:

Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux

root@srv-vpn:~#

Так работает, а теперь нужно настроить чтобы OpenVPN туннель поднимался автоматически при перезагрузке миникомпьютера:

pi@raspberrypi:~ $ sudo systemctl enable openvpn

Synchronizing state of openvpn.service with SysV service script with /lib/systemd/systemd-sysv-install.

Executing: /lib/systemd/systemd-sysv-install enable openvpn

pi@raspberrypi:~ $

pi@raspberrypi:~ $ sudo systemctl daemon-reload

pi@raspberrypi:~ $ cat /lib/systemd/system/openvpn.service

# This service is actually a systemd target,

# but we are using a service since targets cannot be reloaded.

[Unit]

Description=OpenVPN service

After=network.target

[Service]

Type=oneshot

RemainAfterExit=yes

ExecStart=/bin/true

ExecReload=/bin/true

WorkingDirectory=/etc/openvpn

[Install]

WantedBy=multi-user.target

pi@raspberrypi:~ $

pi@raspberrypi:~ $ sudo cp /etc/openvpn/client/client.conf /etc/openvpn/client.conf

pi@raspberrypi:~ $ sudo nano /etc/default/openvpn

#AUTOSTART="all"

AUTOSTART="client"

Проверяю, а поднимется ли туннель если отправить Raspbian в перезагрузку:

pi@raspberrypi:~ $ sudo reboot

Connection to 10.8.0.22 closed by remote host.

Connection to 10.8.0.22 closed.

ekzorchik@navy:~$

После проверяю, а поднялся ли туннель:

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

192.168.0.0/24,craspbian,176.59.41.245:1099,Thu Nov 14 21:38:17 2019

10.8.0.22,craspbian,176.59.41.245:1099,Thu Nov 14 21:41:57 2019

Ура туннель поднимается сам.

Итого порядок настройки OpenVPN клиента на Raspberry Pi 3 Model B операционной оси Raspbian Stretch

1) Создаю клиентский сертификат на OpenVPN-сервере

2) Копирую его любым самым безопасным способом на Raspbian

3) Устанавливаю пакет openvpn

4) Клиентский конфигурационный файл (client.conf) на подключение к OpenVPN-серверу располагаю в корне каталога /etc/openvpn

5) Включаю работу openvpn-сервиса с клиентский соединением client.conf

6) Включаю сервис и стартую:

pi@raspberrypi:~ $ sudo systemctl enable openvpn

pi@raspberrypi:~ $ sudo systemctl daemon-reload

7) Отправляю операционную систему Raspbian в перезагрузку

8) На OpenVPN-сервере проверяю, что соединение установилось:

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

192.168.0.0/24,craspbian,176.59.53.160:16947,Thu Nov 14 21:43:41 2019

10.8.0.22,craspbian,176.59.53.160:16947,Thu Nov 14 21:48:13 2019

Заметка полностью работоспособна. На этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.