Tento návod popisuje zprovoznění hardwarové sondy pro sledování eduroamu. Postup byl vytvořen Janem Vondráčkem na Univerzitě Pardubice. Sonda umožnuje sledování fungování eduroamu z pohledu uživatelského počítače. Neotestujete tak jen radius, ale i AP, dhcp, dns, firewall atd. Jako hardware sondy je použito Raspberry Pi 3b+, OS je Raspbian 12. My takovéto testy nazýváme test umělým uživatelem.
Sonda je spojena s dohledovým systémem pomocí LAN. Do LAN jsou naroutovány jen sítě důležité pro provoz sondy, ne výchozí brána. Test se spouští pomocí systemd timeru a výsledky ukládá do souboru, který si dohledový systém přečte. Zároveň je možné test spustit manuálně z CLI sondy a vidět výsledky okamžitě.
Nainstalujeme potřebné balíky:
apt-get install wpasupplicant curl dnsutils
Pokud ve výpisu interfaců Raspberry nevidíte eth0 a wlan0, ale jiné názvy interfaců, zřejmě používáte prediktivní názvy interfaců. Doporučuji je pomocí raspi-config
vypnout. Já jim nikdy nepřišel na chuť a následující návod s prediktivními názvy nepočítá.
Pro připojování je využit klasický ifup
pomocí /etc/network/interfaces
, nejdříve si nakonfigurujeme LAN (samozřejmě použijte vaše ip adresy, ne ty z ukázky):
allow-hotplug eth0 iface eth0 inet static address 192.0.2.3/24 up ip route add 198.51.100.0/25 via 192.0.2.1 up ip route add 198.51.100.128/25 via 192.0.2.1
Přidáme si potřebné routy na dohledový systém nebo správu či ntp, výchozí bránu nenastavujeme. Já používám instalační squid-deb-proxy, takže při aktualizaci systému pomocí unattended-upgrades nejsem závislý na připojování přes výchozí bránu.
Pokud nám LAN funguje, nakonfigurujeme si WIFI připojení k eduroamu. Vytvoříme konfigurační soubor wpasupplicantu /etc/wpa_supplicant/wpa_supplicant.conf
:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 eapol_version=1 ap_scan=1 country=CZ network={ priority=1 scan_ssid=1 mode=0 ssid="eduroam" key_mgmt=WPA-EAP auth_alg=OPEN eap=PEAP identity="testovaci_uzivatel@univerzita.cz" password="heslo_testovaciho_uzivatele" phase1="peaplabel=0" phase2="auth=MSCHAPV2" }
A přidáme na něj vazbu do /etc/network/interfaces
k interfacu wlan0:
iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf wpa-ssid eduroam # wpa-debug-level 3 # down echo "domain example.net\nsearch example.net\nnameserver 198.51.100.2\nnameserver 198.51.100.3" > /etc/resolv.conf iface wlan0 inet6 dhcp
Pozor, k interfacu wlan0
nedáváme allow-hotplug! Nechceme, aby se nám wlan0
připojovala automaticky po startu OS! Zapoznámkovaný je parametr pro debug, nechávám ho jen pro ukázku jak si debug snadno spustit. Pro konfiguraci IPv6 už wpa-conf nepotřebujeme, interface je již připojen. Pokud IPv6 nemáte, konfigurační řádek vynechtejte.
Řádek na opravu dns v resolv.conf
, nemusí použít každý. Já ho tu uvádím jen jako příklad. Pokud máte jen jeden rekurzivní resolver, který funguje jak pro LAN tak pro eduroam, řádek vynechte. Ale já mám dva typy dns resolverů, jeden pro interní síť a druhý pro eduroam. Dhcp eduroamu, při připojení wifi, LAN resolver přepíše a po odpojení nevrátí zpátky původní hodnoty, tento řádek vrátí do resolf.conf správné původní LAN hodnoty. Pokud to potřebujete řešit, vyplníte si samozřejmě ip vašeho LAN resolveru.
Teď můžeme vyzkoušet zda nám wifi připojení k eduroamu funguje. Nahodíme interface a sledujeme, zda se sonda připojí (ukázkový výpis jsem zkrátil). Zkontrolujeme přidělené ip adresy, výchozí brány a nastavené dns v souboru /etc/resolv.conf
. Na konci pokusu eduroam zase odpojíme, aby nám to neovlivňovalo pozdější konfiguraci testů:
~#ifup wlan0 ... Listening on LPF/wlan0/b8:27:eb:f3:08:b0 Sending on LPF/wlan0/b8:27:eb:f3:08:b0 Sending on Socket/fallback DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 8 DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 10 DHCPREQUEST of 203.0.113.160 on wlan0 to 255.255.255.255 port 67 DHCPOFFER of 203.0.113.160 from 203.0.113.1 DHCPACK of 203.0.113.160 from 203.0.113.1 bound to 203.0.113.160 -- renewal in 9079 seconds. ... Listening on Socket/wlan0 Sending on Socket/wlan0 PRC: Soliciting for leases (INIT). XMT: Forming Solicit, 0 ms elapsed. XMT: X-- IA_NA eb:3b:b8:7f XMT: | X-- Request renew in +3600 XMT: | X-- Request rebind in +5400 XMT: | X-- Request address 2001:db8:100b::1:b67b. ... RCV: X-- Server ID: 00:01:00:01:2c:69:df:4a:f4:ee:08:5a:20:38 PRC: Bound to lease 00:01:00:01:2c:69:df:4a:f4:ee:08:5a:20:38. ~#ip add 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:f3:08:b0 brd ff:ff:ff:ff:ff:ff inet 203.0.113.160/16 brd 203.0.113.255 scope global wlan0 valid_lft forever preferred_lft forever inet6 2001:db8:100b:148a:2f06:5335:de72/128 scope global tentative valid_lft forever preferred_lft forever inet6 2001:db8:100b:ba27:ebff:fef3:8b0/64 scope global mngtmpaddr dynamic valid_lft 300sec preferred_lft 300sec inet6 fe80::ba27:ebff:fef3:8b0/64 scope link valid_lft forever preferred_lft forever ~#ifdown wlan0 ... Killed old client process Listening on LPF/wlan0/b8:27:eb:f3:08:b0 Sending on LPF/wlan0/b8:27:eb:f3:08:b0 Sending on Socket/fallback DHCPRELEASE of 203.0.113.160 on wlan0 to 203.0.113.2 port 67 Killed old client process
Užitečný je také příkaz iwconfig wlan0
, který nám ukáže parametry, jak se wifi připojila (AP, rychlost, síly signálu atd.).
Nezapomeňte nakonfigurovat iptables či jiný firewall, aby se nám přes sondu nikdo nemohl naloupat do vnitřní sítě:
flush ruleset table inet firewall { chain input { type filter hook input priority 0; policy drop; iifname "lo" accept iifname "eth0" accept ct state invalid drop icmp type { echo-request, time-exceeded } limit rate 50/second accept icmpv6 type { echo-request, nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert } limit rate 50/second accept udp dport { 546 } accept #IPv6 DHCP tcp dport { 22,10050 } ip saddr { 198.51.100.0/25 } accept #management ct state { established, related } accept } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }
Pokud je vše funkční, můžeme přistoupit ke konfiguraci testů.
Dříve jsem test připojení vyvolával přímo z monitorovacího systému pomocí nrpe nebo zabbix agenta. Ale velmi často jsem pak přesahoval maximální dobu, po kterou může check běžet. Přešel jsem na spouštění systemd timerem a čtení výsledku ze souboru. Zároveň tak mohu otestovat každý aspekt připojení (DHCP, DNS, WEB).
Nahrajeme testovací skript a nezapomeňte do něj doplnit vaše DHCP pooly a DNS servery:
#!/bin/bash soubor="/tmp/eduroam.txt" echo -e "test pripojeni k eduroamu\npripojuji..." null=`ifup wlan0 2>&1` sleep 5 ipList=`ip -br add show dev wlan0` state=`echo $ipList | awk '{print $2}'` ipv4addr=`echo $ipList | grep -Eo "203.0.113.[0-9]*/24"` #zde použijte váš skutečný DHCP pool ipv6addr=`echo $ipList | grep -Eo "2001:db8:100b:[0-9a-f:]*/64"` #zde použijte váš skutečný DHCP pool if [[ $state != "UP" ]] ;then echo "interface DOWN" echo "interface DOWN" > $soubor exit 1 else echo "interface UP" fi if [[ $ipv4addr == "" ]] ;then echo -e "neni IPv4 adresa\nodpojuji..." echo "neni IPv4 adresa" > $soubor null=`ifdown wlan0 -f 2>&1` exit 1 else echo "IPv4 adresa: $ipv4addr" fi if [[ $ipv6addr == "" ]] ;then echo -e "neni IPv6 adresa\nodpojuji..." echo "neni IPv6 adresa" > $soubor null=`ifdown wlan0 -f 2>&1` exit 1 else echo "IPv6 adresa: $ipv6addr" fi dns4=`dig @203.0.113.1 a eduroam.cz +noall +answer` #zde použije váš skutečný rekurzivní resolver if [[ $? != 0 ]] ;then echo -e "chyba DNS IPv4\nodpojuji..." echo "chyba DNS IPv4" > $soubor null=`ifdown wlan0 -f 2>&1` exit 1 else echo "DNS IPv4: $dns4" fi dns6=`dig @2001:db8:100b::1 aaaa eduroam.cz +noall +answer` #zde použije váš skutečný rekurzivní resolver if [[ $? != 0 ]] ;then echo -e "chyba DNS IPv6\nodpojuji..." echo "chyba DNS IPv6" > $soubor null=`ifdown wlan0 -f 2>&1` exit 1 else echo "DNS IPv6: $dns6" fi web4=`curl -vIs4 https://www.eduroam.cz/ 2>&1 | grep -om 1 "200 OK"` if [[ $web4 == "" ]] ;then echo -e "chyba HTTPS IPv4\nodpojuji..." echo "chyba HTTPS IPv4" > $soubor null=`ifdown wlan0 -f 2>&1` exit 1 else echo "HTTPS IPv4: $web4" fi web6=`curl -vIs6 https://www.eduroam.cz/ 2>&1 | grep -om 1 "200 OK"` if [[ $web6 == "" ]] ;then echo -e "chyba HTTPS IPv6\nodpojuji..." echo "chyba HTTPS IPv6" > $soubor null=`ifdown wlan0 -f 2>&1` exit 1 else echo "HTTPS IPv6: $web6" fi echo -e "vse OK\nodpojuji..." echo "OK" > $soubor null=`ifdown wlan0 2>&1`
Pokud skript eduroamCheck.sk
spustíte ručně, získáte okamžitý přehled jak na tom váš eduroam s připojením je.
[Unit] Description=test eduroamu spousteny timerem [Service] Type=oneshot ExecStart=/usr/local/bin/eduroamCheck.sh [Install] WantedBy=multi-user.target
[Unit] Description=timer pro spousteni eduroamCheck.sh [Timer] OnBootSec=1min OnUnitActiveSec=1hour [Install] WantedBy=timers.target
Timer nezapomeňte pak enablovat a spustit:
systemctl enable eduroamCheck.timer systemctl start eduroamCheck.timer
Check se pak spustí hned po startu OS sondy a pak každou hodinu.
Použití nrpe samozřejmě není nutností, test lze samozřejmě rozchodit i pomocí extend v snmp nebo zabbix agenta. Podpora testování IPv6 je možná, ale ne nutná. Stejně tak je možné používat testy pouze pomocí IPv6. A pro vlastní test pomocí http to platí také, můžete použít něco úplně jiného. Zkrátka jste omezeni jen vaší fantazií. My máme na sondě ještě připojený teploměr a měříme s ní teplotu v racku.