Obsah

eduroam monitorovací sonda

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ě.

příprava sondy

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ě:

/etc/nftables.conf
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ů.

rozchození 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:

/usr/local/bin/eduroamCheck.sh
#!/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.

/etc/systemd/system/eduroamCheck.service
[Unit]
Description=test eduroamu spousteny timerem
 
[Service]
Type=oneshot
ExecStart=/usr/local/bin/eduroamCheck.sh
 
[Install]
WantedBy=multi-user.target
/etc/systemd/system/eduroamCheck.timer
[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.

závěr

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.