# 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`

### Настройка для ПК :computer:
- для ПК можно скопировать или переписать файл конфигурации и подсунуть клиенту
# Установка на Mikrotik :fire:
### настройка интерфейса и пира
- обновить микрот до 7й версии
- создать новый интерфейс wireguard
* после нажатия Apply нолучим Private и Public Keys

- переходим во вкладку IP -> Addresses и задаем адрес и подесть для интерфейса wireguard

- на компьютере идем в клиента wireguard и создаем новый пустой тонель

- при этом приложение генерит нам публичный и приватный ключи клиента
- прописываем конфигурацию

`[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

### настройка сетевого взаимодействия
что бы у клиента работала сеть нужно настроить разрешающее правило и 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
```