Sziasztok!
Van egy apró eszköz, ami WiFi-t kezel és csatlakozik hozzá USB-n egy 3G modem is.
Az eszköz routerként működik a LAN interfésze irányában, egy "kiherélt" OpenWrt-n beállítva, 4 MB flash társaságában.
Jelenleg úgy viselkedik, hogy, ha a WiFi elérhető, akkor azon megy a kapcsolat, WiFi hiányában pedig átvált a 3G kapcsolatra.
Ha a WiFi újra elérhető lesz, akkor visszavált WiFi-re.
Ez nagyon szépen működik így.
Ha viszont elérhető a WiFi kapcsolat, de nem lát ki az Internetre rajt, akkor áll az egész - hiába van működő kapcsolat a 3G modemen keresztül.
Nehezítésként az eszközön összesen 64 kbyte szabad hely van, tehát további OpenWrt modulokat nem fog elbírni ebben a formában.
A 3g-wan1 és wlan0 interfészhez is tartozik egy default gateway alapfelállásban.
Kérdésem, hogy viszonylag egyszerű módszerekkel miként tudnám megoldani, hogy akkor sem a wlan-ról üzemeljen a hálózat, amikor van ugyan kapcsolat rajt, de nincs kilátás az internetre, viszont, ha van a wlan-on internet-kapcsolat, akkor arról üzemeljen?
Van esetleg valakinek bevált megoldása erre?
Miként tudnék hatékonyan váltani a két default gateway között?
Az alaprendszert elérem rajt.
Minden javaslatot előre is köszönök.
------------------------------------------------------------------------------------------------------------------------
A következő scriptet készítettem a probléma megoldására - mivel bash nincs rajt, ezért az alapértelmezett ash shell használatával:
#/bin/ash
IFACE=wlan0
IP1=8.8.8.8
IP2=8.8.4.4
RETRY1=3
RETRY2=3
OKMETRIC=0
FAILMETRIC=30
#-------------------------------------------
defroute=$(route | grep default.*$IFACE | tr -s ' ')
currmetric=$(echo $defroute | cut -d " " -f5)
if [[ -z ${currmetric} ]]
then
exit
fi
let success=0
check_ip(){
if [[ $success -eq 0 ]]
then
ping -q -I $IFACE -W1 -c$2 $1 >/dev/null
if [[ $? -eq 0 ]]
then
let success++
fi
fi
}
check_ip $IP1 $RETRY1
check_ip $IP2 $RETRY2
if [[ $success -gt 0 ]]
then
metric=$OKMETRIC
else
metric=$FAILMETRIC
fi
if [[ $currmetric -ne $metric ]]
then
gateway=$(echo $defroute | cut -d " " -f2)
route del default gw $gateway $IFACE
route add default gw $gateway metric $metric $IFACE
fi
Nem állítom, hogy nem lehetne szebben / jobban megoldani, de úgy néz ki, működik.
A fenti megoldás alapvetően a wlan0 interfész beállításait módosítja anélkül, hogy magát az interfészt le kellene kapcsolni.
Az alapelgondolás az, hogy az egyes alapértelmezett átjárókhoz tartozó metric értékek változtatásával meg lehet oldani, hogy adott interfészen menjen a kapcsolat, de a másik interfész lekapcsolására ne legyen szükség.
A script elején megadható két IP, és mindegyikhez a próbálkozások száma.
Emellett két metric érték, ami működő, ill. hibás kapcsolatok esetén kerül alkalmazásra a wlan0 interfészen.
A 3g-wan1 interfésznél a metric 20-ra van állítva jelenleg, így a kívánt hatás eléréséhez ez alá, vagy ez fölé kell vinni a wlan0 esetén megadott értéket.
A két tesztelt IP a Google 8.8.8.8 és 8.8.4.4-es DNS szervere, mindkettőt háromszor próbálja pingelni.
Lehet, harmadikként beteszem még a saját szervert is, amit el szeretnék érni majd a rendszer mögül, de talán a Google DNS is elég lesz...
Sorjában a következők történnek:
- Először megkeresi a wlan0 interfészhez tartozó alapértelmezett átjáró sorát a route parancs kimenetén
- Megnézi a metric aktuális értékét az interfészen
- Ha nem kapott értéket (nincs felhúzva az interfész), kilép
- Ellenőrzi a két IP-t a wlan0 interfészen keresztül, és sikeres válasz esetén növel egy változót (sikeres próba esetén a többi IP-t nem teszteli)
- Ha legalább az egyik szervert sikerült elérni, akkor élőnek veszi a wlan0 kapcsolatot
- Megállapítja, hogy a fentiek alapján milyen metric értéket kellene beállítania wlan0 számára
- Ha a beállítandó és beállított metric érték egyezik, akkor nem kell csinálnia semmit (az interfész továbbra sem lát ki az internetre, vagy továbbra is kilát)
- Ha a két érték eltér, akkor megállapítja a hozzá tartozó gateway-t is, törli az ehhez tartozó alapértelmezett átjárót az interfészen és újra létrehozza azt a módosított metric értékkel
Előnye, hogy miután átváltott a 3G modemre, a wlan interfészt úgy tudja tesztelni, hogy a mögöttes hálózat folyamatosan kommunikálhat a 3G kapcsolaton keresztül, és a kapcsolat helyreállása során a visszaváltás wlan-ra egy "pillanat" alatt megtörténik.
Szerk.: Kicsit szépítettem rajt, és bekerült egy másodperces limit, ha nem válaszol a másik oldal - így kicsit gyorsabban lefut, ha nincs internet-kapcsolat a wlan interfészen.