14 kwietnia 2021 blog vpn openwrt wireguard
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
.
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=
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:
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:
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.
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
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
).