VŠB-TUO Logo
WireGuard Logo

Ondřej Niesner

NIE0088

Proč WireGuard?

Jednoduchost

Pouze cca 4,000 řádků kódu oproti 100,000+ u OpenVPN. Snazší a jednoduchá konfigurace.

Výkon

Běží přímo v Linux Kernelu. Vysoká propustnost, nízká latence a okamžité navázání spojení.

Bezpečnost

Využívá moderní kryptografii: Noise protocol framework, Curve25519, ChaCha20, Poly1305.

Propustnost

Schéma sítě

Jak to funguje

Spojení peer-to-peer pomocí veřejných klíčů (podobně jako SSH).

Peer A 10.0.0.1 Peer B 10.0.0.2 Pub Key: x8d...9sA Pub Key: 5lK...j2P

Generace klíčů

root@wireguard:~
root@wireguard:~# wg genkey > privatekey
root@wireguard:~# cat privatekey | wg pubkey > pubkey
root@wireguard:~# cat privatekey
oBos+RVd8z5dvdZoSNZHJGDJy9Ck0SGjXlnrEqueRFA=
root@wireguard:~# cat pubkey
d+OTu1Lkl64AaCoz0VkhH+k49LQgsah5piskNSLvfyI=
# Dobrovolné
root@wireguard:~# wg genpsk
GtNV0qHMCKBolZIsld5a/v5ZtF4c6DQuFXlh0dQbgQY=
root@wireguard:~#

Konfigurace serveru (/etc/wireguard/wg0.conf)

root@server:~
# Server Interface
[Interface]
ListenPort = 51818
PrivateKey = AJtgpUswui2PE8s0NzoJ5yFvwmNjPvLpUQqSoLmFnXA=
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT;
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; 
MTU = 1412

# Peer #1
[Peer]
PublicKey = d+OTu1Lkl64AaCoz0VkhH+k49LQgsah5piskNSLvfyI=
PresharedKey = SXDQhiWQFiuFTGcva8aiCndTRKrhsGA/v6rMcZ+IMFw= # dobrovolné
AllowedIPs = 10.0.10.2/32, 2001:1ae9:250:c660::cafe/128

Konfigurace klienta (Laptop/Phone)

ondra@ondra-pc:~
# Client Interface
[Interface]
Address = 10.0.0.2/32
PrivateKey = oBos+RVd8z5dvdZoSNZHJGDJy9Ck0SGjXlnrEqueRFA=
DNS = 2001:1ae9:250:c610::1, 192.168.10.1

# Server (Peer)
[Peer]
PublicKey = DCppfiAJ7HEvGVd+BT4vhXuBuuutHt+XF13IK+sm7nc=
PresharedKey = SXDQhiWQFiuFTGcva8aiCndTRKrhsGA/v6rMcZ+IMFw= # dobrovolné
Endpoint = 109.183.184.95:51818
#Endpoint = [2001:1ae9:250:c660::1]:51818
AllowedIPs = 0.0.0.0/0, ::/0 # Směruj vše skrz VPN
PersistentKeepalive = 25

Vysvětlení parametrů

Address

IP adresa a maska rozhraní uvnitř VPN tunelu (např. 10.0.0.1/24).

ListenPort

UDP port, na kterém WireGuard naslouchá (výchozí 51820).

PrivateKey

Tvůj tajný privátní klíč. Nikdy ho nesděluj ostatním.

PublicKey

Veřejný klíč protistrany (peera).

AllowedIPs

Které IP adresy mohou komunikovat tunelem. 0.0.0.0/0 = vše.

Endpoint

Reálná veřejná IP adresa a port serveru, ke kterému se připojuji.

PersistentKeepalive

Interval (v sekundách), kdy se posílá prázdný paket pro udržení spojení přes NAT.

Výpočet MTU

Schéma sítě

Spuštění pomocí wg-quick

ondra@ondra-pc:~
ondra@ondra-pc:~# sudo wg-quick up ./wg-p.conf
[#] ip link add dev wg-p type wireguard
[#] wg setconf wg-p /dev/fd/63
[#] ip -6 address add 2001:1ae9:250:c660::cafe/128 dev wg-p
[#] ip -4 address add 10.0.10.2/32 dev wg-p
[#] ip link set mtu 1420 up dev wg-p
[#] resolvconf -a wg-p -m 0 -x
[#] wg set wg-p fwmark 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip -6 route add ::/0 dev wg-p table 51820
[#] nft -f /dev/fd/63
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] ip -4 route add 0.0.0.0/0 dev wg-p table 51820
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] nft -f /dev/fd/63

Utilita wg

ondra@ondra-pc:~
ondra@ondra-pc:~# sudo wg
interface: wg
listening port: 49960

interface: wg-p
public key: d+OTu1Lkl64AaCoz0VkhH+k49LQgsah5piskNSLvfyI=
private key: (hidden)
listening port: 52176
fwmark: 0xca6c

peer: DCppfiAJ7HEvGVd+BT4vhXuBuuutHt+XF13IK+sm7nc=
preshared key: (hidden)
endpoint: 109.183.184.95:51818
allowed ips: ::/0, 0.0.0.0/0
latest handshake: 1 minute, 19 seconds ago
transfer: 3.17 MiB received, 2.38 MiB sent

Konfigurace (Server vs Client)

Server (/etc/wireguard/wg0.conf)

root@server:~
# Server Interface
[Interface]
ListenPort = 51818
PrivateKey = AJtgpUswui2PE8s0NzoJ5yFvwmNjPvLpUQqSoLmFnXA=
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; ...
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; ... 
MTU = 1412

# Peer #1
[Peer]
PublicKey = d+OTu1Lkl64AaCoz0VkhH+k49LQgsah5piskNSLvfyI=
PresharedKey = SXDQhiWQFiuFTGcva8aiCndTRKrhsGA/v6rMcZ+IMFw= # dobrovolné
AllowedIPs = 2001:1ae9:250:c660::cafe/128, 2001:1ae9:250:c661::/64

Client (Laptop)

ondra@ondra-pc:~
# Client Interface
[Interface]
Address = 2001:1ae9:250:c660::cafe/128, 2001:1ae9:250:c661::/64
PrivateKey = oBos+RVd8z5dvdZoSNZHJGDJy9Ck0SGjXlnrEqueRFA= DNS = 2001:1ae9:250:c610::1, 192.168.10.1 # Server (Peer) [Peer] PublicKey = DCppfiAJ7HEvGVd+BT4vhXuBuuutHt+XF13IK+sm7nc= PresharedKey = SXDQhiWQFiuFTGcva8aiCndTRKrhsGA/v6rMcZ+IMFw= # dobrovolné Endpoint = 109.183.184.95:51818 AllowedIPs = 0.0.0.0/0, ::/0 PersistentKeepalive = 25

Poznámka: AllowedIPs určuje, jaký provoz půjde tunelem.
0.0.0.0/0 znamená "veškerý internetový provoz".

Konfigurace více peerů (klientů)

root@server:~
[Interface]
ListenPort = 51818
PrivateKey = AJtgpUswui2PE8s0NzoJ5yFvwmNjPvLpUQqSoLmFnXA=
...

# Peer #1
[Peer]
PublicKey = d+OTu1Lkl64AaCoz0VkhH+k49LQgsah5piskNSLvfyI=
PresharedKey = SXDQhiWQFiuFTGcva8aiCndTRKrhsGA/v6rMcZ+IMFw=
AllowedIPs = 2001:1ae9:250:c660::cafe/128, 2001:1ae9:250:c661::/64

# Peer #2
[Peer]
PublicKey = 4CDO2oM85Lwx3dSO6hfz9J7aoPmQ3A+nJc9L5qVPxno=
AllowedIPs = 2001:1ae9:250:c660::dead/128

# Peer #3
[Peer]
PublicKey = d+OTu1Lkl64AaCoz0VkhH+k49LQgsah5piskNSLvfyI=
AllowedIPs = 2001:1ae9:250:c660::b00b/128

Test propustnosti pomocí iperf

Schéma sítě

Mesh

Schéma sítě

Centralní server

Schéma sítě

QR

Shrnutí

  • Extrémně rychlý a lehký
  • Moderní kryptografie
  • Jednoduchá konfigurace
  • Multi-platformní (Win, Linux, Mac, Mobile)

Děkuji za pozornost