Решил поменять хостера своих VPS
с Dataline
на AdminVPS
, прочитав всю информацию на официальном сайте, решил попробовать приобрести в качестве теста одну из VPS(ок)
, но развернутую не в России, а в Нидерландах (по аналогии можно поступить и с другими странами), ограничился самым минимальным тарифным планом: Тарифный план Micro за 449 руб/месяц, перешел по ссылке
и сделал заказ.
CPU = 1 x 3.4 ГГц
RAM = 2 Gb
HDD = 20 Gb NVMe
Траффик: 80 Тб
OS = Ubuntu 22.04 выбрал
оплатил, и через пару минут на зарегистрированную почту получил данные для входа, а именно
IP: IP адрес моей VPS системы
Login: root
Pass: длиннющий
Провожу предварительную настройку купленной VPS
систему под задачу организации VPN
для собственных нужд на базе Wireguard
, на ней будет развернут WireGuard
сервер, а клиенты будут на Android
телефонах стоять для хождения по различным сайтам и проверке как мои блоги https://{win,lin,net,home,voip}.ekzorchik.ru
отображаются из другой страны. Да просто для самообразования.
Шаг №1:
Подключаюсь к купленной VPS
системы с Ubuntu 22.04 Desktop
которая у меня является дома рабочей системой:
root@ekzorchik:~# ssh -l root 79.133.180.222 The authenticity of host '79.133.180.222 (79.133.180.222)' can't be established. RSA key fingerprint is SHA256:yYXdIurBWobD354osY2q60zi43aaWuMetM2Z9GMLsyY. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '79.133.180.222' (RSA) to the list of known hosts. root@79.133.180.222's password: Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Thu Jun 15 04:38:09 AM UTC 2023 System load: 0.3603515625 Processes: 92 Usage of /: 24.9% of 19.58GB Users logged in: 0 Memory usage: 9% IPv4 address for eth0: 79.133.180.222 Swap usage: 0% Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status The list of available updates is more than a week old. To check for new updates run: sudo apt update root@srv-site1a:~#
Успешно подключился.
На заметку: Я по привычке даже находясь в системе под root
учетной записью все равно использую преддверие команд sudo.
Смотрю сколько места доступно мне в реале:
root@srv-site1a:~# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 198M 892K 197M 1% /run /dev/vda1 20G 4.7G 14G 26% / tmpfs 988M 0 988M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 198M 4.0K 198M 1% /run/user/0 root@srv-site1a:~#
Смотрю сколько оперативной памяти доступно мне в реале:
root@srv-site1a:~# free -m total used free shared buff/cache available Mem: 1975 164 1496 2 314 1665 Swap: 1101 0 1101 root@srv-site1a:~#
Смотрю, как прописаны настройке WAN-ip
в системе:
root@srv-site1a:~# cat /etc/network/interfaces # Generated by SolusVM auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 79.133.180.222 gateway 79.133.180.1 netmask 255.255.255.0 dns-nameservers 8.8.8.8 8.8.4.4 root@srv-site1a:~#
Шаг №2:
Переделываю, как будут прописаны сетевые настройки, не через /etc/network/interface
, а через netplan:
ekzorchik@srv-site1a:~$ sudo nano /etc/network/interfaces # Generated by SolusVM auto lo iface lo inet loopback # auto eth0 # iface eth0 inet dhcp # address 79.133.180.222 # gateway 79.133.180.1 # netmask 255.255.255.0 # dns-nameservers 8.8.8.8 8.8.4.4 ekzorchik@srv-site1a:~$ sudo nano /etc/netplan/00-installer-config.yaml # This is the network config written by 'subiquity' network: ethernets: ens3: # dhcp4: true dhcp4: no addresses: - 79.133.180.222/24 routes: - to: default via: 79.133.180.1 nameservers: addresses: - 8.8.8.8 version: 2 ekzorchik@srv-site1a:~$ sudo netplan apply
Шаг №3:
Запрещаю кому-либо изменять файл /etc/resolv.conf:
sudo systemctl disable systemd-resolved Removed /etc/systemd/system/dbus-org.freedesktop.resolve1.service. Removed /etc/systemd/system/multi-user.target.wants/systemd-resolved.service. sudo systemctl stop systemd-resolved sudo rm /etc/resolv.conf sudo bash -c "echo 'nameserver 8.8.8.8'" | sudo tee -a /etc/resolv.conf sudo chattr +i /etc/resolv.conf sudo lsattr /etc/resolv.conf ----i---------e--- /etc/resolv.conf
Шаг №4:
Устанавливаю под себя утилиты, которые мне нужны для отладки работоспособности:
sudo apt-get install traceroute net-tools -y
Шаг №5:
Провожу базовую настройку системы для последующего использования:
root@srv-site1a:~# rm -Rf /var/lib/apt/lists root@srv-site1a:~# sudo nano /etc/update-manager/release-upgrades [DEFAULT] Prompt=never root@srv-site1a:~# sudo apt-get update && sudo apt-get upgrade -y ekzorchik@srv-site1a:~$ uname -a && lsb_release -a Linux srv-site1a 5.15.0-73-generic #80-Ubuntu SMP Mon May 15 15:18:26 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy ekzorchik@srv-site1a:~$
Шаг №6:
На системе Windows 10 Pro
(Обычно на работе с этой системы работаю) создаю публичный и приватные SSH
ключи для подключения к данной VPS.
Как приобщиться к такому использования, прошу сюда "Подключение к серверу Ubuntu Bionic Server через Putty + Public Key"
На заметку: Я всегда к своим системам делаю что доступ только по ключам SSH
и приватный ключ защищаю парольной фразой, чтобы в случае чего стащив данный ключ он оказался бесполезным при применении.
Шаг №7:
Прописываю публичный SSH
ключ в файл /etc/ssh/authorized_keys
root@srv-site1a:~# sudo nano /etc/ssh/authorized_keys ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBH1hhQut+INfQDfMYbFfGRdr/VpikwFKV8p9r1it1U/TI9K00JbDN7E5V7m17IHT72zTgCcqGaLJrzPHpODbqGk= ecdsa-key-20230615
Шаг №8:
Так как я преимущественно буду подключаться к данной системе в целях администрирования по SSH
, то провожу на основе своего опыта изменения в плане безопасного подключения:
root@srv-site1a:~# sudo useradd -m -p password -s /bin/bash -u 2000 -U ekzorchik root@srv-site1a:~# sudo groupadd sshauth root@srv-site1a:~# sudo usermod -aG sshauth ekzorchik root@srv-site1a:~# sudo usermod -aG sudo ekzorchik root@srv-site1a:~# sudo nano /etc/ssh/sshd_config Include /etc/ssh/sshd_config.d/*.conf Port 33222 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes AuthorizedKeysFile /etc/ssh/authorized_keys IgnoreRhosts yes PermitEmptyPasswords no KbdInteractiveAuthentication no UsePAM yes X11Forwarding yes PrintMotd no PrintLastLog no AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server DebianBanner no AllowGroups sshauth root@srv-site1a:~# root@srv-site1a:~# sudo service ssh restart root@srv-site1a:~# sudo ss -ltp State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:33222 0.0.0.0:* users:(("sshd",pid=3030,fd=3)) LISTEN 0 128 [::]:33222 [::]:* users:(("sshd",pid=3030,fd=4)) root@srv-site1a:~#
Пока от сервера не отключаюсь.
Шаг №9:
На рабочей системе на работе запускаю клиент Putty
(использую версию 0.78
) и настраиваю подключение к VPS
в нидерландах:
(Session)
Host Name (or IP address): 79.133.180.222
Port: 33222
Connection Type: SSH
(Connection) - Data
Auto-login username: ekzorchik
(Connection) - SSH - Auth - Credentials
Private key file for authentication: W:\tips_key\ekzorchik@srv-site1a_private_key.ppk
после возвращаюсь
(Session)
Saved Sessions: указываю имя под которым сохраню настройки подключения, к примеру srv-site1a
и нажимаю "Save"
, затем подключаюсь, нажимаю "Open"
подключение проходит успешно
Using username "ekzorchik". Authenticating with public key "ecdsa-key-20230615" Passphrase for key "ecdsa-key-20230615": Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Thu Jun 15 05:26:07 AM UTC 2023 System load: 0.0 Processes: 92 Usage of /: 25.1% of 19.58GB Users logged in: 1 Memory usage: 11% IPv4 address for eth0: 79.133.180.222 Swap usage: 0% Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. ekzorchik@srv-site1a:~$
Подключение под пользователем прошло успешно, можно сессию от имени root
уже завершить.
Шаг №10:
Устанавливаю в систему надстройку над правилами iptables - firewalld:
ekzorchik@srv-site1a:~$ apt-cache show firewalld | grep Version Version: 1.1.1-1ubuntu1 ekzorchik@srv-site1a:~$ sudo apt-get install -y firewalld ekzorchik@srv-site1a:~$ sudo ufw disable Firewall stopped and disabled on system startup ekzorchik@srv-site1a:~$ sudo systemctl enable firewalld ekzorchik@srv-site1a:~$ sudo systemctl start firewalld ekzorchik@srv-site1a:~$ sudo firewall-cmd --state running ekzorchik@srv-site1a:~$ ip r | awk '{print $5}' | head -n1 eth0 ekzorchik@srv-site1a:~$ sudo firewall-cmd --zone public --change-interface=eth0 --permanent success ekzorchik@srv-site1a:~$ sudo firewall-cmd --add-port=33222/tcp --permanent success ekzorchik@srv-site1a:~$ sudo firewall-cmd --remove-service=ssh --permanent success ekzorchik@srv-site1a:~$ sudo firewall-cmd --reload success ekzorchik@srv-site1a:~$ sudo firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client ports: 33222/tcp protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ekzorchik@srv-site1a:~$
Шаг №11:
Устанавливаю в систему Wireguard:
ekzorchik@srv-site1a:~$ apt-cache show wireguard | grep Version Version: 1.0.20210914-1ubuntu2 ekzorchik@srv-site1a:~$ ekzorchik@srv-site1a:~$ sudo apt-get install -y wireguard-dkms wireguard-tools resolvconf ekzorchik@srv-site1a:~$ sudo reboot ekzorchik@srv-site1a:~$ lsmod | grep wireguard wireguard 94208 0 curve25519_x86_64 36864 1 wireguard libchacha20poly1305 16384 1 wireguard libcurve25519_generic 49152 2 curve25519_x86_64,wireguard ip6_udp_tunnel 16384 1 wireguard udp_tunnel 20480 1 wireguard ekzorchik@srv-site1a:~$
Шаг №12:
Переделываю зоны работы Firewalld
, чтобы была внешняя зона (external)
и зона VPN
туннеля (internal):
ekzorchik@srv-site1a:~$ sudo firewall-cmd --get-zones block dmz drop external home internal public trusted work ekzorchik@srv-site1a:~$ ekzorchik@srv-site1a:~$ sudo firewall-cmd --zone=external --add-port=33222/tcp --permanent sudo firewall-cmd --zone=internal --add-interface=wg0 --permanent sudo firewall-cmd --zone=public --remove-interface=eth0 --permanent sudo firewall-cmd --zone=external --remove-service=ssh --permanent sudo firewall-cmd --zone=external --add-interface=eth0 --permanent ekzorchik@srv-site1a:~$ sudo firewall-cmd --reload
Информация по настройкам зоны internal:
ekzorchik@srv-site1a:~$ sudo firewall-cmd --zone=internal --list-all internal (active) target: default icmp-block-inversion: no interfaces: wg0 sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ekzorchik@srv-site1a:~$
Информация по настройкам зоны external:
ekzorchik@srv-site1a:~$ sudo firewall-cmd --zone=external --list-all external (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ports: 33222/tcp protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ekzorchik@srv-site1a:~$
На заметку: 22341
— это будет порт работы Wireguard
Шаг №13:
Создадим пару закрытого и открытого ключа на системе VPS
которая выступает, как сервер Wireguard:
ekzorchik@srv-site1a:~$ sudo wg genkey | sudo tee /etc/wireguard/privatekey +KYc7Jx2bOcRkTtAL/ZA2NgBHJwmejvySERZFNJHb0z= ekzorchik@srv-site1a:~$ sudo bash -c "wg pubkey < /etc/wireguard/privatekey > /etc/wireguard/pubkey" ekzorchik@srv-site1a:~$ sudo bash -c "cat /etc/wireguard/pubkey" oBgRkPwW1nqTDL3MMwu4ceJznj/AQqKyZL4Rua+GqCI= ekzorchik@srv-site1a:~$
Шаг №14:
Файлы wg0.conf
и privatekey
не должны быть доступны для чтения для обычных пользователей на системе VPS:
ekzorchik@srv-site1a:~$ sudo chmod 600 /etc/wireguard/privatekey ekzorchik@srv-site1a:~$ sudo chmod 600 /etc/wireguard/wg0.conf
Шаг №15:
Создаю публичный ключ для своего смартфона Honor 9X
на котором буду тестировать VPN
до Нидерландов:
ekzorchik@srv-site1a:~$ wg genkey | sudo tee /etc/wireguard/honor9xvpsprivatekey 0L0HHC3hCl2PyqOaXt8VvpF/AVowxvSpCnFTSjF7uHg= ekzorchik@srv-site1a:~$ sudo bash -c "wg pubkey < /etc/wireguard/honor9xvpsprivatekey > /etc/wireguard/honor9xvpspubkey" ekzorchik@srv-site1a:~$ sudo bash -c "cat /etc/wireguard/honor9xvpspubkey" ZnV8NikZMAlIXRH5N6gStngMgfot4Y2uKuW+Ubd35FY= ekzorchik@srv-site1a:~$
Шаг №16:
Настраиваем туннельное устройство, которое будет маршрутизировать трафик VPN
на клиенте:
ekzorchik@srv-site1a:~$ sudo nano /etc/wireguard/wg0.conf [Interface] #указываю имя приватного ключа сервера, sudo bash -c "cat /etc/wireguard/privatekey" PrivateKey = +KYc7Jx2bOcRkTtAL/ZA2NgBHJwmejvySERZFNJHb0z= #Внутренний адрес сервера Address = 10.10.10.1/24 #MTU = 1420 #Порт на котором мой сервер будет принимать подключения ListenPort = 22341 #Table = #в качестве брандмауэера я буду использовать надстройку над правилами iptables => firewalld #ip r | awk ‘{print $5}’ | head -n1 #eth0 PreUp = sysctl -w net.ipv4.ip_forward=1 PreUp = sysctl -w net.ipv4.conf.all.src_valid_mark=1 PostUp = firewall-cmd --zone=external --add-masquerade PostUp = firewall-cmd --zone=external --add-port=22341/udp PreDown = sysctl -w net.ipv4.ip_forward=0 PreDown = sysctl -w net.ipv4.conf.all.src_valid_mark=0 PostDown = firewall-cmd --zone=external --remove-masquerade PostDown = firewall-cmd --zone=external --remove-port=22341/udp #Секция настройки клиента #Client [Peer] #root@ekzorchik:~# cat /etc/wireguard/honor9xvpspubkey PublicKey = ZnV8NikZMAlIXRH5N6gStngMgfot4Y2uKuW+Ubd35FY= AllowedIPs = 10.10.10.2/32
Шаг №17:
Разрешаем транзитный трафик между зонами firewalld:
На заметку: Важный нюанс по данной заметке, у меня в заметках используется утилита firewalld версии 0.8.2 (в OS: Ubuntu 20.04 где Wireguard работает в качестве сервера — все работает, как и написано в заметках моего блога), а начиная с версии 1.0
root@ekzorchik:~# dpkg -l | grep firewalld | head -n 1 ii firewalld 0.8.2-1 all dynamically managed firewall with support for network zones root@ekzorchik:~#
по умолчанию блокируется транзитный трафик между зонами хоть и включена настройка net.ipv4.ip_forward=1, это дело не меняет. А в Ubuntu 22.04 уже устанавливается версия firewalld = 1.1.1-1ubuntu1 и все применяя к ней исходя из моих заметок получается, что не работает, т.е. если Вы на Ubuntu 22.04 Server поднимаете Wireguard-сервер, в этом случае нужно разрешить прохождение трафика с помощью policy object, к примеру, создав правило: client-to-inet
firewall-cmd --permanent --new-policy client-to-inet firewall-cmd --permanent --policy client-to-inet --set-target ACCEPT firewall-cmd --permanent --policy client-to-inet --add-ingress-zone internal firewall-cmd --permanent --policy client-to-inet --add-egress-zone external firewall-cmd --reload
после интернет при подключении через Wireguard с клиентской системы к Ubuntu 22.04 Server (Wireguard-сервер) начинает работать, а туннель как устанавливался, так и устанавливается.
Шаг №18:
Активирую работу сервиса после перезагрузки сервера, чтобы он включался автоматически:
ekzorchik@srv-site1a:~$ sudo systemctl enable wg-quick@wg0.service Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service. ekzorchik@srv-site1a:~$ sudo systemctl start wg-quick@wg0.service ekzorchik@srv-site1a:~$ ip r default via 79.133.180.1 dev eth0 proto static 10.10.10.0/24 dev wg0 proto kernel scope link src 10.10.10.1 79.133.180.0/24 dev eth0 proto kernel scope link src 79.133.180.222 ekzorchik@srv-site1a:~$
Шаг №19:
Создаю конфигурацию для смартфона Honor 9X
на котором буду тестировал функционал работы VPN
туннеля из Нидерландов:
ekzorchik@srv-site1a:~$ nano honor9xvps.conf [Interface] #PrivateKey = CLIENT_PRIVATE_KEY # root@ekzorchik:~# cat /etc/wireguard/honor9xvpsprivatekey PrivateKey = 0L0HHC3hCl2PyqOaXt8VvpF/AVowxvSpCnFTSjF7uHg= # Адрес и маска #[Peer] должны быть одинаковыми и на клиенте, и на сервере # не обязательно Address = 10.10.10.2/24 DNS = 8.8.8.8 [Peer] #PublicKey = SERVER_PUBLIC_KEY #cat /etc/wireguard/pubkey PublicKey = oBgRkPwW1nqTDL3MMwu4ceJznj/AQqKyZL4Rua+GqCI= #Endpoint = SERVER_IP_ADDRESS:PORT Endpoint = 79.133.180.222:22341 AllowedIPs = 0.0.0.0/0 #Key connection alive ## PersistentKeepalive = 15
Шаг №20:
Теперь можно создать QR
код на основе нашего конфига:
ekzorchik@srv-site1a:~$ sudo apt-get install -y qrencode ekzorchik@srv-site1a:~$ qrencode -t png -o honor9xvps.png -r honor9xvps.conf
Шаг №21:
Передаем любым способом полученную картинку в виде qr-КОДА НА ТЕЛЕФОН или скачиваем ее подключившись к серверу через WinSCP
и скопировав ее на рабочий стол, открываю ее
Шаг №22:
На смартфон Honor 9X
устанавливаю приложение из Play Market
или если Вы себе скачиваете apk
файл приложения:
Шаг №23:
Запускаем на смартфоне установленное приложение Wireguard
, нажимаем "+" Плюсик
— выбираем "Сканировать QR-код"
и сканируем открытую картинку выше и если все сделано правильно создается конфигурация, для которой Вы сами даете именование, к примеру добавленные конфигурации выглядят так:
нажимаю на переключатель напротив именования vpsnider
, сессия включается, в правом верхнем углу экрана смартфона появляется иконка "Ключик"
свидетельствующая что VPN
туннель установлен
см. на сервере так ли это:
ekzorchik@srv-site1a:~$ sudo wg show interface: wg0 public key: oBgRkPwW1nqTDL3MMwu4ceJznj/AQqKyZL4Rua+GqCI= private key: (hidden) listening port: 22341 peer: ZnV8NikZMAlIXRH5N6gStngMgfot4Y2uKuW+Ubd35FY= endpoint: 176.59.174.8:46408 allowed ips: 10.10.10.2/32 latest handshake: 1 minute, 42 seconds ago transfer: 703.79 KiB received, 488.34 KiB sent ekzorchik@srv-site1a:~$
из вывода выше видно, что клиент получил назначенный ему IP
адрес в сети VPN
, т.е. 10.10.10.2
Шаг №24:
Проверяем на смартфоне, какой WAN-IP
сейчас, открываем браузер и переходим на URL—адрес 2ip.ru & myip.ru
Отлично, теперь проверяю, что могу заходить на различные ресурсы и меня не блокирует.
Подведем итог, я самостоятельно для себя разобрал как поднимается VPN
-туннель до своего сервера, купленного в другой стране, со всеми нюансами, которые у меня возникли, многое нового узнал и теперь в рамках тестирования буду анализировать работу своих сервисов дабы лучше понимать и применять полученный опыт в работе.
На этом практическая заметка успешно завершена, с уважением автор блога Олло Александр aka ekzorchik.