Рубрики
debian daemons \ демоны \ службы \ сервисы

debian 11 / wireguard

Ссылки:

https://habr.com/ru/company/xakep/blog/699000/
https://www.wireguard.com/quickstart/
https://manpages.debian.org/unstable/wireguard-tools/wg-quick.8.en.html
https://www.procustodibus.com/blog/2021/03/wireguard-allowedips-calculator/

Сервер

0. Устанавливаем:
apt install wireguard wireguard-tools

1. Генерируем ключи
!!! Генерировать ключи также надо будет на клиенте
cd /etc/wireguard
umask 077; wg genkey | tee privatekey | wg pubkey > publickey

2. Создаем конфиг
/etc/wireguard/wg0.conf
-----------------------
## Set Up WireGuard VPN on Debian By Editing/Creating wg0.conf File ##
[Interface]
## My VPN server private IP address ##
Address = 10.0.0.1/24

## My VPN server port ## UDP
ListenPort = 51100

## VPN server's private key i.e. /etc/wireguard/privatekey ##
PrivateKey = YOU_PRIVAT_KEY

## Save and update this config file when a new peer (vpn client) added ##
## SaveConfig = true

[Peer]
## Desktop/client VPN public key ##
PublicKey = YOU_CLIENT_PUBLIC_KEY
 
## client VPN IP address (note  the /32 subnet) ##
AllowedIPs = 10.0.0.2/32


-----------------------

3. Запускаем и проверяем
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0

Конфиг для клиента

[Interface]
## This Desktop/client's private key ##
PrivateKey =  YOU_PRIVAT_KEY
 
## Client ip address ##
Address = 10.0.0.2/24
 
[Peer]
## Debian 11 server public key ##
PublicKey = YOU_SERVER_PUBLIC_KEY
 
## set ACL ##
AllowedIPs = 10.0.0.0/24
 
## Your Debian 11 LTS server's public IPv4/IPv6 address and port ##
Endpoint = YOU_IP_ADDRESS_SERVER_WG:51100
 
##  Key connection alive ##
PersistentKeepalive = 20

пример конфига с правилами для интерфейсов

!!! в данном примере поднимается NAT и создаются правила в iptables
#`ip route | awk '/default/ {print $5; exit}'` - узнаем имя интерфейса который смотрит в интернет
#`ip addr show $(ip route | awk '/default/ { print $5 }') | grep "inet" | grep -v "inet6" | head -n 1 | awk '/inet/ {print $2}' | awk -F/ '{print $1}'` - узнаем ip интерфейса

[Interface]
Address = 10.0.0.1/24
SaveConfig = true
PostUp = iptables -t nat -A POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADE
PostUp = ip rule add from `ip addr show $(ip route | awk '/default/ { print $5 }') | grep "inet" | grep -v "inet6" | head -n 1 | awk '/inet/ {print $2}' | awk -F/ '{print $1}'` table main
PostUp = iptables -I FORWARD 1 -i `ip route | awk '/default/ {print $5; exit}'` -o wg0 -j ACCEPT
PostUp = iptables -I FORWARD 1 -i wg0  -o ` ip route | awk '/default/ {print $5; exit}'` -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADE
PostDown = ip rule del from `ip addr show $(ip route | awk '/default/ { print $5 }') | grep "inet" | grep -v "inet6" | head -n 1 | awk '/inet/ {print $2}' | awk -F/ '{print $1}'` table main
PostDown = iptables -D FORWARD -i `ip route | awk '/default/ {print $5; exit}'` -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0  -o ` ip route | awk '/default/ {print $5; exit}'` -j ACCEPT

ListenPort = 51100
FwMark = 0xca6c
PrivateKey =  YOU_PRIVAT_KEY

[Peer]
PublicKey = YOU_CLIENT_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 25

[Peer]
PublicKey = YOU_CLIENT_PUBLIC_KEY
AllowedIPs = 10.0.0.3/32
PersistentKeepalive = 25



iptables server

PostUp = iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostUp = iptables -I FORWARD 1 -i ens3 -o wg3public -j ACCEPT
PostUp = iptables -I FORWARD 1 -i wg3public  -o ens3 -j ACCEPT
PostUp = iptables  -A INPUT -p udp -m udp --dport 62001 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i ens3 -o wg3public -j ACCEPT
PostDown = iptables -D FORWARD -i wg3public  -o ens3 -j ACCEPT
PostDown = iptables  -D INPUT -p udp -m udp --dport 62001 -j ACCEPT

Как отправить весть трафик в тунель wg0 на клиенте

Самый простой способ использовать "ip route"
# ip route add 0.0.0.0/0 dev wg0 - вот так вот ничего не заработает
Используем трюк например как для openvpn и перенаравим весь трафик в wg0:
ip r a 0.0.0.0/1 dev wg0 
Использование /1 вместо /0 гарантирует, что он имеет приоритет над маршрутом /0 по умолчанию.
P.S не совсем так, просто маска по уже и трафик от сети 10/8 туда за летит. (если надо считайте маску под свои цели)

Также мы можем перенаправить лишь один IP в наш wg0
ip r a 195.201.201.32 dev wg0


Пример конфига для клиента с наворачиванием трафика в интерфейс wg0

[Interface]
Address = 10.0.0.4/24
DNS = 8.8.8.8, 8.8.4.4
PrivateKey = PRIVAT_KEY_CLIENT
PostUp = ip r a 0.0.0.0/1 dev wg0 
PostDown = ip r d 0.0.0.0/1 dev wg0 
[Peer]
PublicKey = PUBLIC_KEY_SERVER_WG
AllowedIPs = 0.0.0.0/0
Endpoint = IP_WG_SERVER:PORT_WG_SERVER
PersistentKeepalive = 25

PresharedKey

0. генерируем PresharedKey:
wg genpsk


1. Редактируем wg0 на клиентах и серверах и добавляем PresharedKey 
vim wg0.conf
--------------
...
[Peer]
## Desktop/client VPN public key ##
PresharedKey = YOU_GENERATION_PresharedKey
...
-------------


for linux all traffic to WG0

root@yoctoproject:/home# cat /etc/wireguard/wg0.conf
[Interface]
## This Desktop/client's private key ##
PrivateKey = PRIVAT_KEY_CLIENT

PostUp = ip route del default  dev enp1s0
PostUP = ip route add default  dev wg0
PostUp = ip route add IP_ADDRESS_WG_SERVER via IP_ADDRESS_GATEWAY_ROUTER_CLIENT
PostDown = ip route del IP_ADDRESS_WG_SERVER via IP_ADDRESS_GATEWAY_ROUTER_CLIENT dev enp1s0
PostDown = ip route add default via IP_ADDRESS_GATEWAY_ROUTER_CLIENT dev enp1s0

## Client ip address ##
Address = IP_ADDRES_CLIENT_FOR_WG
#DNS = 8.8.8.8, 8.8.4.4

[Peer]
## Debian 11 server public key ##
PublicKey = PUBLIC_KEY_WG_SERVER

## set ACL ##
AllowedIPs = 0.0.0.0/0

## Your Debian 11 LTS server's public IPv4/IPv6 address and port ##
Endpoint =IP_ADDRESS_WG_SERVER:PORT

##  Key connection alive ##
PersistentKeepalive = 25


Debian 11 генерация QR (каур кода) для wireguard

apt install qrencode 
qrencode -t ansiutf8 < wg0.conf