# WireGuard setup :bulb: ###### tags: `wireguard` `vpn` `PiVPN` `pivpn` [link](https://trashbox.ru/link/how-to-make-own-vpn-for-free) [PiVPN](https://pc-01.tech/wireguard-vpn/) [интересно](https://www.linuxbabe.com/ubuntu/wireguard-vpn-server-ubuntu) # Установка на отдельный сервер ## подготовка :sheep: `apt update && sudo apt upgrade -y` `sed -i 's/\#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf` `sysctl -p` ## установка `apt install wireguard -y` - Сгенерируем пару ключей для сервера. server_privatekey `wg genkey | tee VPNserver_privatekey | wg pubkey > VPNserver_publickey` - Для каждого клиентского устройства также создадим пару ключей `wg genkey | tee client01_privatekey | wg pubkey > client01_publickey` `wg genkey | tee client02_privatekey | wg pubkey > client02_publickey` - Создадим конфигурационный файл: `nano /etc/wireguard/wg0.conf` > Для каждого клиентского устройства надо добавить раздел Peer по подобному принципу, указав IP-адрес, отличающийся четвёртым числом от ранее введённых (например, для второго клиента я введу AllowedIPs = 10.0.0.3/32, для третьего — AllowedIPs = 10.0.0.4/32 и так далее), и добавив его публичный ключ: ``` [Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = <PRIV_SERV>= PostUp = iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT PostUp = iptables -A FORWARD -i wg-server -o wg-server -j DROP PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] # client01 PublicKey = <PUB_CLIENT> AllowedIPs = 10.0.0.2/32 [Peer] # client02 PublicKey = <PUB_CLIENT> AllowedIPs = 10.0.0.3/32 ``` - Сохраним файл комбинацией клавиш Ctrl+X, нажмем Y и подтвердим клавишей Enter. Запустим сервис: `wg-quick up wg0` - задать права на директорию `chmod 600 /etc/wireguard/ -R` - Сразу добавим его в автозапуск, чтобы VPN автоматически стартовал после перезагрузки сервера: `systemctl enable wg-quick@wg0.service` `systemctl restart wg-quick@wg0` ## Скрипт создания нового опльзователя - bash ``` #!/bin/bash echo "Enter the username: " read username last_ip=$(tail -n 1 /etc/wireguard/wg0.conf | awk '{print $3}') if [ -z "$last_ip" ]; then next_ip="10.0.0.2/32" else last_octet=$(echo $last_ip | awk -F. '{print $4}' | awk -F/ '{print $1}') next_octet=$((last_octet+1)) next_ip="10.0.0.$next_octet/32" fi echo "Generating key pair for $username..." private_key=$(wg genkey) public_key=$(echo $private_key | wg pubkey) # /etc/wireguard/wg0.conf echo "Adding user to the server config..." echo "[Peer]" >> /etc/wireguard/wg0.conf echo "# $username" >> /etc/wireguard/wg0.conf echo "PublicKey = $public_key" >> /etc/wireguard/wg0.conf echo "AllowedIPs = $next_ip" >> /etc/wireguard/wg0.conf # user conf echo "Adding user to the client config..." echo "[Interface]" >> /etc/wireguard/conf/$username.conf echo "Address = $next_ip" >> /etc/wireguard/conf/$username.conf echo "PrivateKey = $private_key" >> /etc/wireguard/conf/$username.conf echo "DNS = 8.8.8.8, 8.8.4.4" >> /etc/wireguard/conf/$username.conf echo "[Peer]" >> /etc/wireguard/conf/$username.conf echo "PublicKey = <PublicKey>=" >> /etc/wireguard/conf/$username.conf echo "PersistentKeepalive = 25" >> /etc/wireguard/conf/$username.conf echo "Endpoint = <YOUR_DOMAIN_OR_IP>:51820" >> /etc/wireguard/conf/$username.conf echo "AllowedIPs = 0.0.0.0/0, ::/0" >> /etc/wireguard/conf/$username.conf echo "Generating QR code for $username..." qrencode -t ansiutf8 < /etc/wireguard/conf/$username.conf > /etc/wireguard/conf/$username.qr # restart service echo "Restarting WireGuard service..." systemctl restart wg-quick@wg0 cat /etc/wireguard/conf/$username.qr echo "User $username created successfully!" echo "Client configuration file and QR code can be found in /etc/wireguard/conf/$username.conf and /etc/wireguard/conf/$username.qr respectively." ``` - python ``` #!/usr/bin/env python3 username = input("Enter the username: ") with open("/etc/wireguard/wg0.conf", "r") as f: lines = f.readlines() last_line = lines[-1] if last_line.startswith("[Peer]"): last_ip = last_line.split("=")[-1].strip() last_octet = int(last_ip.split(".")[-1].split("/")[0]) next_octet = last_octet + 1 next_ip = "10.0.0.{}/32".format(next_octet) else: next_ip = "10.0.0.2/32" import subprocess private_key = subprocess.run(["wg", "genkey"], capture_output=True).stdout.decode("utf-8").strip() public_key = subprocess.run(["wg", "pubkey"], input=private_key.encode("utf-8"), capture_output=True).stdout.decode("utf-8").strip() with open("/etc/wireguard/wg0.conf", "a") as f: f.write("\n[Peer]\n") f.write("# {}\n".format(username)) f.write("PublicKey = {}\n".format(public_key)) f.write("AllowedIPs = {}\n".format(next_ip)) with open("/etc/wireguard/conf/{}.conf".format(username), "w") as f: f.write("[Interface]\n") f.write("Address = {}\n".format(next_ip)) f.write("PrivateKey = {}\n".format(private_key)) f.write("DNS = 8.8.8.8, 8.8.4.4\n") f.write("\n[Peer]\n") f.write("PublicKey = <PublicKEY>\n") f.write("PersistentKeepalive = 25\n") f.write("Endpoint = vpn2.<YOUR_DOMAIN>.ru:51820\n") f.write("AllowedIPs = 0.0.0.0/0, ::/0\n") import os os.system("qrencode -t ansiutf8 < /etc/wireguard/conf/{}.conf > /etc/wireguard/conf/{}.qr".format(username, username)) os.system("systemctl restart wg-quick@wg0") print("User {} created successfully!".format(username)) print("Client configuration file and QR code can be found in /etc/wireguard/conf/{}.conf and /etc/wireguard/conf/{}.qr respectively.".format(username, username)) ``` ## Подключение к VPN :rocket: - для мобильных устройств удобно использавать QR код `apt install qrencode -y` - создадим файлы для клиентов - не забываем менять IP адреса `nano client01.conf` ``` [Interface] Address = 10.0.0.2/32 PrivateKey = <PRIV_CLIENT> DNS = 8.8.8.8, 8.8.4.4 [Peer] PublicKey = <PUB_SERV> Endpoint = <IP>:51820 PersistentKeepalive = 20 AllowedIPs = 0.0.0.0/0, ::/0 ``` `nano client02.conf` ``` [Interface] Address = 10.0.0.3/32 PrivateKey = <PRIV_CLIENT> DNS = 8.8.8.8, 8.8.4.4 [Peer] PublicKey = <PUB_SERV> Endpoint = <IP>:51820 PersistentKeepalive = 20 AllowedIPs = 0.0.0.0/0, ::/0 ``` ### Натсройка для смартфона :iphone: - Сохраним файл комбинацией клавиш Ctrl+X, нажмем Y и подтвердим клавишей Enter. Сгенерируем QR-код: - скачать app [wireguard](https://www.wireguard.com/install/) для смартфона `qrencode -t ansiutf8 < client01.conf` ![](https://i.imgur.com/vvo2c79.png) ### Настройка для ПК :computer: - для ПК можно скопировать или переписать файл конфигурации и подсунуть клиенту # Установка на Mikrotik :fire: ### настройка интерфейса и пира - обновить микрот до 7й версии - создать новый интерфейс wireguard * после нажатия Apply нолучим Private и Public Keys ![](https://i.imgur.com/I8t9YNp.png) - переходим во вкладку IP -> Addresses и задаем адрес и подесть для интерфейса wireguard ![](https://i.imgur.com/mtJukVb.png) - на компьютере идем в клиента wireguard и создаем новый пустой тонель ![](https://i.imgur.com/5W0bxnX.png) - при этом приложение генерит нам публичный и приватный ключи клиента - прописываем конфигурацию ![](https://i.imgur.com/PfxywzO.png) `[Interface]` - приватный ключ генерится по умолчанию в приложением - Address пишем адрем который будет у клиента при подключении из диапазона подсети wireguard ограничение маской /32 делаемся для запрета обмена данными меду пирами `[Peer]` - PublicKey - копируем с интерфейса WireGuard на mikrotik - Endpoint - адрес и порт куда подключаемся ``` [Interface] PrivateKey = cG************+M0Q= Address = 10.0.0.3/32 DNS = 8.8.8.8, 8.8.4.4 [Peer] PublicKey = qP0***************jE= AllowedIPs = 0.0.0.0/0 Endpoint = external_ip:13231 ``` - сохраняем настройки - возвращаемся к настройкам wireguard, переходим во вкладку Peers и создаем новый Peer - вносим Allowed Address из диапазона адресов wiregaurd с маской /32 ![](https://i.imgur.com/X9aW1yQ.png) ### настройка сетевого взаимодействия что бы у клиента работала сеть нужно настроить разрешающее правило и NAT - разрешим входящие на WAN порт из интернета на UDP 13231 > возможно надо изменить WAN интерфейс на свой куда приходит интернет ``` /ip firewall filter add action=accept chain=input comment=WireGuard dst-port=13231 in-interface=ether1 protocol=udp ``` - настроим правило NAT ``` ip firewall/nat/ add action=masquerade chain=srcnat out-interface=ether1 src-address=10.0.0.0/24 ``` - если мы не хотим пускать пользователей VPN во веутреннюю сеть, то надо сделать запрещиющее правило на все возможные внутренние адреса - зададим все внутренние адреса ``` /ip firewall address-list add address=0.0.0.0/8 comment=RFC6890 list=not_in_internet add address=172.16.0.0/12 comment=RFC6890 list=not_in_internet add address=192.168.0.0/16 comment=RFC6890 list=not_in_internet add address=10.0.0.0/8 comment=RFC6890 list=not_in_internet add address=169.254.0.0/16 comment=RFC6890 list=not_in_internet add address=127.0.0.0/8 comment=RFC6890 list=not_in_internet add address=224.0.0.0/4 comment=Multicast list=not_in_internet add address=198.18.0.0/15 comment=RFC6890 list=not_in_internet add address=192.0.0.0/24 comment=RFC6890 list=not_in_internet add address=192.0.2.0/24 comment=RFC6890 list=not_in_internet add address=198.51.100.0/24 comment=RFC6890 list=not_in_internet add address=203.0.113.0/24 comment=RFC6890 list=not_in_internet add address=100.64.0.0/10 comment=RFC6890 list=not_in_internet add address=240.0.0.0/4 comment=RFC6890 list=not_in_internet ``` - настроим блокирующее праавило ``` /ip firewall filter add action=reject chain=forward comment="VLAN Reject" dst-address-list=not_in_internet log=yes reject-with=icmp-net-prohibited src-address=10.0.0.0/24 ```