Задача: Реализовать подключение миникомпьютера 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(ы)
Что уже есть:
- «Настройка OpenVPN Server to Client Mikrotik»
- после данная заметка дополнена: этой «OpenVPN туннель до своей сети за Mikrotik»
- «Настройка OpenVPN клиента на смартфоне»
- «Подключение через webdav к OwnCloud 10» — служит для передачи клиентских сертификатов.
От 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.