Купил себе используя мой промо-код «CloudLITE4116» виртуальную машину и хочу сделать ее частью OpenVPN сети, дабы через нее настроить доступ к домашнему почтовому серверу. В качестве операционной системы выбрал Ubuntu 18.04 Server, в дополнении получил белый статический WAN-IP. Это большой плюс в наше время, я за него не плачу все в ходит в стоимость.

Шаг №1: Подключаюсь по ssh к ней сперва сгенерированным паролем при заказе, а после изменяю на свой собственный:

ekzorchik@navy:~$ ssh -l root mail.ekzorchik.com

root@ubuntu18:~# passwd root

Enter new UNIX password:

Retype new UNIX password:

passwd: password updated successfully

root@ubuntu18:~#

Шаг №2: Изменяю порт на SSH подключение и доступ если я в группе:

root@ubuntu18:~# groupadd sshauth

root@ubuntu18:~# usermod -aG sshauth root

root@ubuntu18:~# nano /etc/ssh/sshd_config

Port 22300

AllowGroups sshauth

root@ubuntu18:~# service ssh restart

Шаг №3: Произвожу первоначальную установку системы:

nano default
#!/bin/bash
# Codepage UTF-8

# aka Олло Александр aka ekzorchik (Telegram: @ekzorchik)
# for Ubuntu 18.04 Server amd64

#for wget no use proxy
sed -i 's/#use_proxy = on/use_proxy = off/g' /etc/wgetrc

rm -Rf /var/lib/apt/lists
locklist="/var/lib/apt/lists/lock"
if [ -f $locklist ]
then
	echo "$locklist found i budet delete"
	rm -rf $locklist
else
	echo "$locklist not found"
fi

lockapt="/var/cache/apt/archives/lock"
if [ -f $lockapt ]
then
	echo "$lockapt found i budet delete"
	rm -rf $lockapt
else
	echo "$lockapt not found"
fi

lock="/var/lib/dpkg/lock"
lockfrontend="/var/lib/dpkg/lock-frontend"
lockbackup="/var/lib/dpkg/lock-backup"
if [ -f "$lock" ]
then
        echo "$lock found i budet delete"
        rm -rf $lock
        ls /var/lib/dpkg/lock
else
        echo "$lock not found."
fi
if [ -f "$lockfrontend" ]
then
        echo "$lockfrontend found i budet delete"
        rm -rf $lockfrontend
        ls /var/lib/dpkg/lock-frontend
else
        echo "$lockfrontend not found"
fi
if [ -f "$lockbackup" ]
then
        echo "$lockbackup found i budet delete"
        rm -rf $lockbackup
        ls /var/lib/dpkg/lock-backup
else
        echo "$lockbackup not found"
fi

apt-get update && sudo apt-get upgrade -y
rm -rf /var/lib/dpkg/updates/*

sed -i '/Prompt/s/lts/never/' /etc/update-manager/release-upgrades
dpkg --configure -a

#Timezone
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
apt-get autoremove -y
# Удаляю из системы пакет Cloud Init
sudo bash -c "echo 'datasource_list: [ None ]' sudo -s tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg"
sudo apt purge -y cloud-init
sudo rm -Rf /etc/cloud /var/lib/cloud

#NTP
sudo apt-get install ntpdate mercurial bikeshed -y
sudo bash -c "echo '@reboot /usr/sbin/ntpdate -s 0.pool.ntp.org > /dev/null'" | sudo -s tee /var/spool/cron/crontabs/root
ntpdate -s 0.pool.ntp.org

#Install nuznoe in work
apt-get install htop mc software-properties-common -y
purge-old-kernels --keep 1 -y
sudo locale-gen en_US.UTF-8
sudo sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen && sudo locale-gen
echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale
echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale
echo "LANGUAGE="en.US.UTF-8"" | sudo tee -a /etc/default/locale
root@ubuntu18:~# chmod +x default 
root@ubuntu18:~# ./default

root@mail:~# nano /etc/hosts
95.181.198.14   mail.ekzorchik.com autodiscovery.ekzorchik.com
root@mail:~# nano /etc/hostname
mail.ekzorchik.com
root@mail:~# nano /etc/netplan/99-netcfg-vmware.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses:
        - 95.181.198.14/24
      gateway4: 95.181.198.1
      nameservers:
        addresses:
          - 95.131.31.206
          - 178.20.234.206
root@mail:~# nano /etc/sysctl.conf
net.ipv4.ip_forward=1
root@mail:~# sysctl -p
net.ipv4.ip_forward = 1
root@mail:~#

Шаг №4: Удаляю дефолтную сеть видимо использовавшуюсь при подготовке образа инженерами Dataline:

root@mail:~# rm /etc/network/interfaces

root@mail:~# netplan apply

Шаг №5: Устанавливаю в систему надстройку над правилами iptables которую я использую — это firewalld:

ufw disable

apt-get install -y firewalld

systemctl enable firewalld

systemctl start firewalld

firewall-cmd --state

firewall-cmd --set-default-zone=public

firewall-cmd --zone=public --add-port=22400/tcp --permanent

firewall-cmd --zone=public --remove-service=ssh --permanent

firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

firewall-cmd --reload

firewall-cmd --zone=public --list-all

systemctl restart firewalld.service

Шаг №6: на OpenVPN сервере создаю сертификат для клиента:

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

root@ekzorchik:/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@ekzorchik:/etc/openvpn/easy-rsa# ./build-key mailekzorchikcom

Can't load /root/.rnd into RNG

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

Generating a RSA private key

...............................................................................+++++

....................................................+++++

writing new private key to 'mailekzorchikcom.key'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

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) [mailekzorchikcom]:mail.ekzorchik.com

Name [EasyRSA]:

Email Address [support@ekzorchik.ru]:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

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

Can't load /root/.rnd into RNG

140594945466816: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

The Subject's Distinguished Name is as follows

countryName :PRINTABLE:'RU'

stateOrProvinceName :PRINTABLE:'RU'

localityName :PRINTABLE:'MOSCOW'

organizationName :PRINTABLE:'RUSSIAN'

organizationalUnitName:PRINTABLE:'ekzorchik'

commonName :PRINTABLE:'mail.ekzorchik.com'

name :PRINTABLE:'EasyRSA'

emailAddress :IA5STRING:'support@ekzorchik.ru'

Certificate is to be certified until Oct 18 19:13:32 2031 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@ekzorchik:/etc/openvpn/easy-rsa# ls keys/mail*

keys/mailekzorchikcom.crt keys/mailekzorchikcom.csr keys/mailekzorchikcom.key

root@ekzorchik:/etc/openvpn/easy-rsa#

root@ekzorchik:/etc/openvpn/easy-rsa/keys# scp -P 22300 mail* root@mail.ekzorchik.com:/root/

root@vpn.ekzorchik.ru's password:

mailekzorchikcom.crt 100% 5554 10.3MB/s 00:00

mailekzorchikcom.csr 100% 1090 2.8MB/s 00:00

mailekzorchikcom.key 100% 1704 4.9MB/s 00:00

root@ekzorchik:/etc/openvpn/easy-rsa/keys#

root@ekzorchik:/etc/openvpn/easy-rsa/keys# scp -P 22400 ca.crt root@mail.ekzorchik.com:/root/

root@ekzorchik:~# cp /etc/openvpn/ccd/mikrotik /etc/openvpn/ccd/mailekzorchikcom

root@ekzorchik:~# nano /etc/openvpn/ccd/mailekzorchikcom

push "route 172.35.35.0 255.255.255.0"

push "route 172.33.33.0 255.255.255.0"

root@ekzorchik:~# systemctl restart openvpn

Шаг №7: На VPS on mail.ekzorchik.com устанавливаю OpenVPN клиент:

root@mail:~# apt-get install -y openvpn

root@mail:~# mkdir /etc/openvpn/keys

root@mail:~# mv ca.crt mailekzorchikcom.crt mailekzorchikcom.key /etc/openvpn/keys/

root@mail:~# chown -R root:root /etc/openvpn/keys/

root@mail:~# chmod -R 600 /etc/openvpn/keys/

root@mail:~# nano /etc/openvpn/client.conf

client

dev tun0

proto tcp

remote vpn.ekzorchik.ru 1194

resolv-retry infinite

nobind

user nobody

group nogroup

persist-key

persist-tun

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/mailekzorchikcom.crt

key /etc/openvpn/keys/mailekzorchikcom.key

cipher AES-128-CBC

auth SHA1

verb 4

mute 20

status /var/log/openvpn-status.log

log /var/log/openvpn.log

root@mail:~# touch /var/log/openvpn.log

root@mail:~# nano /etc/default/openvpn

AUTOSTART="client"

На заметку: сервис при запуске ищет клиентский конфигурационный файл в каталоге /etc/openvpn/client.conf

root@mail:~# systemctl status openvpn@client

● openvpn@client.service - OpenVPN connection to client

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

Active: activating (auto-restart) (Result: exit-code) since Wed 2021-10-20 23:20:42 MSK; 4s ago

Docs: man:openvpn(8)

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

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

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

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

Шаг №8: Чтобы одновременно работал openvpn клиент и ssh подключение:

root@mail:~# nano /etc/rc.local

#!/bin/bash

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128

ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')

ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

exit 0

root@mail:~#

root@mail:~# systemctl enable openvpn

root@mail:~# reboot

На заметку: Если этого не сделать я потеряю доступ к mail.ekzorchik.com и придется через личный кабинет подключаться к консоли виртуальной машины перезагружать ее, т.к. нет маршрута.

Проверяю, что конфигурационный файл корректен и соединение устанавливается:

root@mail:~# openvpn --config /etc/openvpn/client.conf

соединение установлено, но если я не прописал в /etc/rc.local сеть OpenVPN увижу только из консоли и подключиться из вне к VPS не смогу, поэтому нужна перезагрузка.

Шаг №9: После перезагрузки проверяю, что могу подключиться по SSH и подключившись вижу сеть через OpenVPN:

ekzorchik@navy:~$ ssh -l root mail.ekzorchik.com -p 22300

root@mail:~# ip r

0.0.0.0/1 via 10.8.0.21 dev tun0

default via 95.181.198.1 dev eth0 proto static

10.8.0.0/24 via 10.8.0.21 dev tun0

10.8.0.21 dev tun0 proto kernel scope link src 10.8.0.22

95.181.198.0/24 dev eth0 proto kernel scope link src 95.181.198.14

128.0.0.0/1 via 10.8.0.21 dev tun0

172.33.33.0/24 via 10.8.0.21 dev tun0

172.35.35.0/24 via 10.8.0.21 dev tun0

root@mail:~# ping 172.33.33.16

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

64 bytes from 172.33.33.16: icmp_seq=1 ttl=63 time=5.90 ms

64 bytes from 172.33.33.16: icmp_seq=2 ttl=63 time=8.48 ms

^C

--- 172.33.33.16 ping statistics ---

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

rtt min/avg/max/mdev = 5.904/7.193/8.483/1.292 ms

root@mail:~#

смотрю на vpn.ekzorchik.ru что соединение установлено:

root@ekzorchik:~# tail -f /var/log/openvpn/ipp.txt | grep mail

mail.ekzorchik.com,10.8.0.20

Отлично, подключаюсь и могу взаимодействовать с сетью за OpenVPN, что мне и требовалось. В последующий практический заметках я буду показывать чтобы не забыть дальнейшие шаги по настройки почтового сервиса.

А пока заметка завершена. С уважением автор блога Олло Александр aka ekzorchik.