14 kwietnia 2021 blog vpn openwrt wireguard

Dzięki użyciu WireGuard na routerze z OpenWrt mamy możliwość bezpiecznego dostępu do sieci domowej z dowolnego miejsca. Wcześniej zawsze co najmniej jeden komputer w sieci wewnętrznej miał skonfigurowany forwarding portu na routerze. Dzięki połączeniu VPN stało się to zbędne.

openwrt-wireguard-status

Instalacja paczek

Na stronie konfiguracji routera LuCI przechodzimy do → System → Software. Najczęściej router ma adres 192.168.0.1, więc docelowy link to 192.168.0.1/cgi-bin/luci/admin/system/opkg.

Klikamy przycisk Update lists..., następnie instalujemy paczki wraz z zależnościami: luci-proto-wireguard i luci-app-wireguard.

openwrt-wireguard-package

Generowanie pary kluczy

Potrzebujemy zestaw kluczy, prywatny i publiczny. Można je wygenerować lokalnie, lub bezpośrednio na routerze.

$ wg genkey | tee wg.key | wg pubkey > wg.pub
$ cat wg.key
dlugi-losowy-klucz-prywatny-aaaaaaaaaaaaaa=
$ cat wg.pub
dlugi-losowy-klucz-publiczny-bbbbbbbbbbbbb=

Dodanie interfejsu i konfiguracja firewalla na routerze

Najłatwiej jest to zrobić przez ssh root@192.168.0.1:

uci set network.wg0="interface"
uci set network.wg0.proto="wireguard"
uci set network.wg0.private_key="dlugi-losowy-klucz-prywatny-aaaaaaaaaaaaaa="

uci set network.wg0.listen_port="51820"
uci add_list network.wg0.addresses='10.0.0.1/24'

uci commit network
/etc/init.d/network reload

ifdown wg0
ifup wg0

uci add firewall rule
uci set firewall.@rule[-1].src="*"
uci set firewall.@rule[-1].target="ACCEPT"
uci set firewall.@rule[-1].proto="udp"
uci set firewall.@rule[-1].dest_port="51820"
uci set firewall.@rule[-1].name="Allow-Wireguard-Inbound"

# Add the firewall zone
uci add firewall zone
uci set firewall.@zone[-1].name='wg'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].masq='1'

# Add the WG interface to it
uci set firewall.@zone[-1].network='wg0'

# Forward WAN and LAN traffic to/from it
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='wg'
uci set firewall.@forwarding[-1].dest='wan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='wg'
uci set firewall.@forwarding[-1].dest='lan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='wg'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='wan'
uci set firewall.@forwarding[-1].dest='wg'

uci commit firewall
/etc/init.d/firewall restart

LuCI → Network → Interfaces:

openwrt-wireguard-interfaces

Dodanie klientów VPN

Dla każdego klienta potrzebujemy pary kluczy (wygenerowanych tak jak powyżej dla routera).

Próbawałem dodawać klientów przez polecenie uci, ale wydaje mi się, że edycja pliku /etc/config/network jest szybsza i czytelniejsza - ssh root@192.168.0.1:

config interface 'wg0'
	option proto 'wireguard'
	option private_key 'dlugi-losowy-klucz-prywatny-aaaaaaaaaaaaaa='
	option listen_port '51820'
	list addresses '10.0.0.1/24'

config wireguard_wg0
	option public_key 'dlugi-losowy-klucz-PUBLICZNY-klienta-nr-1=='
	option description 'klient1'
	option route_allowed_ips '1'
	list allowed_ips '10.0.0.2/32'
	option persistent_keepalive '25'

config wireguard_wg0
	option public_key 'dlugi-losowy-klucz-PUBLICZNY-klienta-nr-2=='
	option description 'klient2'
	option route_allowed_ips '1'
	list allowed_ips '10.0.0.3/32'
	option persistent_keepalive '25'

Restart interfejsów i usług - ssh root@192.168.0.1:

/etc/init.d/network reload; ifdown wg0; ifup wg0

LuCI → Network → Interfaces → WG0 → Edit → Peers:

openwrt-wireguard-peers

Konfiguracja klienta Android

Instalujemy WireGuard, z F-Droid lub Google Play.

Lokalnie generujemy kod QR:

cat << EOF | qrencode -t ansiutf8
[Interface]
DNS = 10.0.0.1
Address = 10.0.0.2
PrivateKey = dlugi-losowy-klucz-prywatny-klienta-nr-1===
[Peer]
AllowedIPs = 0.0.0.0/0
PublicKey = dlugi-losowy-klucz-publiczny-bbbbbbbbbbbbb=
Endpoint = ZEWNĘTRZNY_IP_LUB_DNS_ROUTERA:51820
PersistentKeepalive = 25
EOF

I w aplikacji WireGuard klikamy na dole niebieski znak plus i wybieramy zeskanuj kod QR. Wystarczy skierować aparat na wygenerowany przed chwilą kod, żeby tunel automatycznie się dodał w aplikacji.

openwrt-wireguard-android

Konfiguracja klienta na PC

cat << EOF >~/.config/wg0.conf
[Interface]
# jeśli nie potrzebujemy nadpisywać serwera DNS, można zakomentować:
DNS = 10.0.0.1
Address = 10.0.0.3
PrivateKey = dlugi-losowy-klucz-prywatny-klienta-nr-2===
[Peer]
# jeśli chcemy cały ruch przekierować przez połączenie VPN, ustawiamy 0.0.0.0/0
# jeśli zależy nam tylko na dostępie do lokalnej sieci:
AllowedIPs = 10.0.0.0/24,192.168.0.0/24
PublicKey = dlugi-losowy-klucz-publiczny-bbbbbbbbbbbbb=
Endpoint = ZEWNĘTRZNY_IP_LUB_DNS_ROUTERA:51820
PersistentKeepalive = 25
EOF

Uruchomienie połączenia:

sudo wg-quick up ~/.config/wg0.conf; sudo wg show

Jeśli plik konfiguracyjny zapiszemy jako /etc/wireguard/wg0.conf, możemy skorzystać z dobrodziejstw systemd:

sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0
sudo systemctl status wg-quick@wg0

Co jeszcze

Polecam na routerze zainstalować pakiet adblock. Dzięki temu większość reklam na urządzeniach klienckich przestanie być wyświetlana. Oczywiście jeśli korzystają z DNS routera (w przykładzie jest to linijka w konfiguracji DNS = 10.0.0.1).

Linki