Hoe twee routers te linken met beide een guest net door gebruik te maken van VLAN 802.1q tagging en OpenWrt

English version here: link

Door de corona crisis is er niet veel vakantie te vieren, dus heb ik besloten om mijn Wifi setup te moderniseren met twee nieuwe routers om op beide routers een guestnet te krijgen. Op verzoek heb ik deze post gemaakt.

Ik heb dus twee Netgeat r7800 routers gekocht omdat je er zowel OpenWrt als ook DD-WRT erop kan zetten. Maar besloten om OpenWrt erop te zetten omdat in mijn mening superieur is in flexibiliteit, updates, transparantie, en de interface is ook logischer. Daarom heb ik OpenWrt gedownload van https://openwrt.org/downloads.
De laatste stabiele versie (19.07.3 op dit moment), heeft geen support voor 802.11k and 802.11v (kennelijk je kan het wel aanzetten, maar dan stuurt die geen nutige informatien). In de laatste Snapshot werkt het wel. Dus raad ik de laatste snapshot aan (totdat dit ook in een nieuwe stabiele versie zit).

Voor een nieuwe install moet je eerste een stabiele flashen. Dit maakt het ook makkelijker om passwords en IP addressen te stellen (De snapshot heeft standaard geen Luci geinstalleerd, je kan het wel makkelijk toevoegen, zie de instructies aan het einde van deze pagina).

Na het instellen van de IPs van de routers (ik heb 192.168.15.1 en .2 gekozen) is het tijd om de switch in te stellen: een VLAN toevoegen en and tagging of packets aan te zetten voor de VLANs. Ik heb de routers verbonden via de 4de LAN poort. De setup op beide routers zou er zoiets als dit uit moeten zien:

Volgens mij moet je ze beide rebooten na de verandering. Zorg ervoor dat je nog met beide kan connecten.

Als dat goed werkt dan is de radio setup het volgende om in te stellen, radio0:

Selecteer mode:

Ik heb de channel maar op “auto” gelaten en 80MHz geselecteerd. Later heb ik alsnog 160Mhz gekozen en channel 52 en 100 geselecteerd. Op sommige 5GHz channels moet er wetteljk verplicht gescant worden of er een weer radar actief is. Daarom kan het soms lang duren voordat ze echt actief worden, maar meestal na een minuut of zo zijn ze wel actief. Goed opletten dat de radios correct gebridged zijn:

Op de security pagina moet je “KRACK countermeasures” selecteren, voor WPA2-enterprise heb je wpad-full of wpad-wolfssl nodig (zie beneden hoe je dat installeerd):

De guest net wifi zou er bijna identiek uit moeten zien, maar ik gebruik WPA2-CCMP as securityen daarnaast moeten ze gebridged zijn naar de “guest” bridge. Ook heb ik geen KRACK countermeasures geselecteerd omdat security niet zo belangrijk is voor guest net.

Je kan ook de clients isoleren met de checkbox under advanced settings, maar dat lijkt niet echt te werken (misschien moet er een firewall rule bij, geen idee):

Voor radio 1 moet het er hetzelfde uitzien:

Nu de interfaces in stellen:

Lan moet er zo uit zien:

De guest interface:

Als laatste de firewall:

De eerste kolom laat zien uit welke zone de packets geforward mogen worden naar andere zones. De 2de kolom “input” laat zien wat er met packets moet gebeuren die de router als bestemming hebben. De 3de kolom geeft aan of de router packets naar een bepaalde zone mag sturen. De “Forward” kolom laat zien of er packets van de verschillende interfaces binnen een zone geforward mogen worden.

Zoals je kan zien laat ik toe dat devices van de “lan” kontakt mogen zoeken met devices op de “geust” maar niet omgekeerd. De reden daarvoor is dat ik een internet radio op het guestnet heb die ik wil kunnen aansturen. De “forward” op het op het “guest” kan je ook op “reject” zetten, maar in dit geval maakt het niet veel uit omdat er maar 1 interface in de zone is. Als je access naar de router wil blokkeren (wat een goed idee is), dan moet je “input” voor guest op “reject” zetten (zoals in de screenhot). Reject blokt ook DNS and DHCP dus daar moeten we appart een regel voor maken om dat toe te laten:

Router 2 zou er hetzelfde uit moeten zien behalve dat er geen WAN interfaecs zijn en de gateway moet naar router 1 wijzen:

Nu zou alles functioneel moeten zijn aleen nog geen 802.11v, k and w. 802.11w kan je instellen in de Luci interface, maar om onduidelijke reden niet in de snapshot versie.

Hoe dan ook, dit is het moment om de snapshot te installeren. Dan met “putty” naar de router gaan en de volgende commandos uitvoeren:

opkg update
opkg install luci
opkg install luci-ssl
opkg install nano-full
opkg remove wpad-basic-mbedtls
opkg remove wpad-basic-wolfssl
opkg remove wpad-basic
opkg install wpad-mbedtls
opkg install wireguard
opkg install luci-app-wireguard
opkg install luci-app-statistics
opkg install collectd-mod-thermal
opkg install luci-app-uhttpd
opkg install openssl-util
opkg install openssh-sftp-server
opkg install qrencode
opkg install freeradius3
opkg install acme
opkg install luci-app-acme
opkg install umdns
opkg install avahi-dbus-daemon
opkg install ca-certificates
opkg install stubby
opkg install – -download-only dnsmasq-full && opkg remove dnsmasq && opkg install –cache . dnsmasq-full && rm *.ipk
opkg install collectd-mod-irq
opkg remove logd
opkg install syslog-ng
opkg install usteer
opkg install sqm-scripts
opkg install luci-app-sqm
opkg install collectd-mod-sqm

Nano is een text editor, wpad-openssl voor WPA2 enterprise (802.1X), wireguard voor remote access naar het network (alternatief voor openvpn), statistics voor monitoring. Dawn is voor bandsteering. Werkte niet echt goed, en ook geen goede handleiding om het in te stellen, dus ik heb hem er op dit moment weer af gegooid. umdns is nodig voor dawn.
Nu de setup van de items die niet via Luci kunnen:

nano /etc/config/wireless

om te checken dat de interfaces “wifinet2” and “wifinet3” hetzelfde zijn.

Als de namen overeen komen (zo niet de namen veranderen):

uci set wireless.wifinet2.ieee80211k=’1′
uci set wireless.wifinet2.ieee80211v=’1′
uci set wireless.wifinet2.wnm_sleep_mode=’1′
uci set wireless.wifinet2.wnm_sleep_mode_no_keys=’0′
uci set wireless.wifinet2.bss_transition=’1′
uci set wireless.wifinet2.time_advertisement=’2′
uci set wireless.wifinet2.time_zone=’CET-1CEST,M3.5.0,M10.5.0/3′

uci set wireless.wifinet3.ieee80211k=’1′
uci set wireless.wifinet3.ieee80211v=’1′
uci set wireless.wifinet3.wnm_sleep_mode=’1′
uci set wireless.wifinet3.wnm_sleep_mode_no_keys=’0′
uci set wireless.wifinet3.bss_transition=’1′
uci set wireless.wifinet3.time_advertisement=’2′
uci set wireless.wifinet3.time_zone=’CET-1CEST,M3.5.0,M10.5.0/3′

uci set wireless.default_radio0.ieee80211k=’1′
uci set wireless.default_radio0.ieee80211v=’1′
uci set wireless.default_radio0.wnm_sleep_mode=’1′
uci set wireless.default_radio0.wnm_sleep_mode_no_keys=’0′
uci set wireless.default_radio0.bss_transition=’1′
uci set wireless.default_radio0.time_advertisement=’2′
uci set wireless.default_radio0.time_zone=’CET-1CEST,M3.5.0,M10.5.0/3′
uci set wireless.default_radio0.ieee80211w=’2′
uci set wireless.default_radio0.eap_reauth_period=’0′

uci set wireless.default_radio1.ieee80211k=’1′
uci set wireless.default_radio1.ieee80211v=’1′
uci set wireless.default_radio1.wnm_sleep_mode=’1′
uci set wireless.default_radio1.wnm_sleep_mode_no_keys=’1′
uci set wireless.default_radio1.bss_transition=’1′
uci set wireless.default_radio1.time_advertisement=’2′
uci set wireless.default_radio1.time_zone=’CET-1CEST,M3.5.0,M10.5.0/3′
uci set wireless.default_radio1.ieee80211w=’2′
uci set wireless.default_radio1.eap_reauth_period=’0′
uci commit wireless
wifi up

Niet zeker of wnm_sleep_mode, wnm_sleep_mode_no_keys, time_advertisement, en time_zone nodig zijn. Timezone kan je vinden met:

cat /etc/TZ

Ik heb 802.11w op required gezet voor het hoofd network en uit voor het guestnet. Ik heb ook wnm_sleep_mode_no_keys aanggezet voor het hoofd netwerk en uit voor het guest netwerk (vergelijkbaar met KRACK counter measures).

Zie ook https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf for info.

Als laatste nog even de CPUs getweaked (voor meer stability). Dit toevoegen aan /etc/rc.local:

echo ondemand > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
echo ondemand > /sys/devices/system/cpu/cpufreq/policy1/scaling_governor
echo 800000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq
echo 800000 > /sys/devices/system/cpu/cpufreq/policy1/scaling_min_freq
echo 75 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold
echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

Het zou nu allemaal moeten werken. In geval van vragen laat maar even weten.

P.S. Wireguard setup:

Listen port: 43648
IP addresses: 192.168.25.1/24

Daarnaast een een firewall zone selecteren. Dan per peer een naam invullen, de public key, een IP uit de range boven (b.v. 192.168.25.100/32, en eventueel een pre-shared key. Deze laatste kan je genereren met:

wg keygen

Aan de peer kant: Adressess=192.168.25.100/32, DNS=192.168.15.1, public key van de router, endpoint= public IP router

P.P.S 802.11r setup:
Voor WPA2 en WPA3 personal is het enige wat je moet doen is de optie “802.11r” aanvinken. Voor WPA2 enterprise was het wat lastiger:

uci set wireless.default_radio0.nasid=’MACIDWITHOUTCOLONS’
uci set wireless.default_radio0.ft_over_ds=’1′
uci set wireless.default_radio0.ft_bridge=’br-lan’
uci set wireless.default_radio0.mobility_domain=’ABCD’
uci set wireless.default_radio0.r1_key_holder=’MACIDWITHOUTCOLONS’
uci set wireless.default_radio0.ft_psk_generate_local=’0′
uci set wireless.default_radio0.pmk_r1_push=’1′
uci set wireless.default_radio0.r0kh=’FF:FF:FF:FF:FF:FF,*,32digithexkey’
uci set wireless.default_radio0.r1kh=’00:00:00:00:00:00,00:00:00:00:00:00,32digithexkey’

Voor radio1 dezelfde opties, mobility domain moet hetzelfde zijn, maar de nasid en r1_key_holder moet de MAC van die radio zijn.
P.P.P.S. bekijk ook https://openwrt.org/docs/guide-user/luci/getting_rid_of_luci_https_certificate_warnings en
https://jamielinux.com/docs/openssl-certificate-authority/sign-server-and-client-certificates.html
P.P.P.P.S. Als je vanaf een ipad wil printen vanaf de guest of wireguard VPN interface:

opkg install avahi-dbus-daemon

Ik denk dat umdns er dan af moet
Dan onder [server] in /etc/avahi/avahi-daemon.conf:

allow-interfaces=br-lan,VPN,br-guest

add under [reflector]

enable-reflector=yes

Start de service:

/etc/init .d /dbus start
/etc/init .d /dbus enable
/etc/init .d /avahi-daemon start
/etc/init .d /avahi-daemon enable

Voor guest moet er nog twee firewall rules bij:
1) Incommming IPv4 IPv6, protocol UDP, from guest port 5353, to this device , IP:225.0.0.251 ff02::fb port 5353, accept input
2) Incommming IPv4 IPv6, from guest, to any zone device , IP:xxx.xxx.xxx.xxx port 631 accept forwardm, hier is xxx.xxx.xxx.xxx het IP address van de print server of de printer.
P.P.P.P.P.P.S. DNSSEC aanzetten (https://forum.openwrt.org/t/what-to-do-to-get-dnssec-working-on-19-07-0-rc2/50776/18)

opkg update
opkg install dnsmasq-full –download-only && opkg remove dnsmasq odhcpd-ipv6only && opkg install dnsmasq-full –cache . && rm *.ipk

Edit /etc/config/dhcp en onder config dnsmasq sectie, voeg het volgende toe:
option dnssec ‘1’
option dnsseccheckunsigned ‘1’
Daarna:
/etc/init.d/dnsmasq restart
Als je ook encrypted DNS wil gebruiken:

opkg update
opkg install stubby

daarna /etc/stubby/stubby.yml editen om de juiste DNS te selecteren. Daarnaast ook 127.0.0.1#5453 in de DNS lijst zetten van DNSmasq
P.P.P.P.P.P.P.S. Filteren van het log zie https://forum.openwrt.org/t/suppress-logging-of-beacons/107095
Voeg dit toe in /etc/syslog-ng.conf

filter f_beacon {
not( program(“hostapd”) and message(“BEACON-*”) );
};

log {
source(src);
source(net);
source(kernel);
filter(f_beacon); ### <— add this
destination(messages);

# uncomment this line to open port 514 to receive messages
#source(s_network);
};