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.
- 1154 megtekintés
Hozzászólások
Írj egy script-et, hogy ha nem jön vissza ping mondjuk a 8.8.8.8-ról akkor váltson kapcsolatot
Ezt futattod cron-ból x-percenként
--
God bless you, Captain Hindsight..
- A hozzászóláshoz be kell jelentkezni
Igen, ilyesmi megfordult a fejemben, de hogy tudok a két interface között váltani úgy, hogy továbbra is az OpenWRT felületén beállított kapcsolatok között működjön a váltás?
A ping-nek -I-vel meg tudom adni az interfészt, tehát ezzel lehetne tesztelni a wlan0 interfészen.
A default gateway átállítását viszont nem tudom, hogy volna célszerű elvégezni...
A két default gateway-hez tartozó Metric értékét tudom úgy módosítani, hogy minden más változatlanul maradjon, vagy csak úgy, ha eltávolítom és újra hozzáadom?
Külön jó lenne, ha lenne egy olyan parancs, ami képes pl. a wlan0-hoz tartozó default gateway Metric értékét közvetlen beállítani. :)
...vagy saját scripttel kellene feldolgozni az eredeti értéket, és az alapján létrehozni egy új bejegyzést?
"ip" parancs nincs rajt.
- A hozzászóláshoz be kell jelentkezni
Simán interface magadása nélkül pingeled a 8.8.8.8-at.
Ha nincs válasz a wifi-t down-olod, erre magától menni fog a 3g.
Valami ilyesmi:
#!/bin/bash
# Wifi up kód!
# 10 ping csendes módban
ping -q -c10 8.8.8.8
if [ $? -eq 0 ]
# Minden ok, nem csinálsz semmit!
else
# Wifi down kód!
fi
És ezt teszed cronba.
--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba!; DropBox
- A hozzászóláshoz be kell jelentkezni
Igen, köszi.
Viszont leállított WiFi interfésszel nem tudok arra tesztelni, hogy újra feléledt-e a WiFi.
Ill. tudok, de ahhoz el kell indítani újra és reménykedni, hogy helyreállt - a mögöttes hálózat viszont ekkor nem éri el a netet.
Ezért gondoltam, hogy, ha a prioritását tudnám a 3G modul mögé tenni, akkor ettől függetlenül tesztelhetem a WiFi hálózatot és visszaállíthatom 3G elé a prioritását, ha helyreállt.
- A hozzászóláshoz be kell jelentkezni
mi az openwrt verziószáma? Szinte kizárt, hogy alapból ne legyen rajta ip parancs.
- A hozzászóláshoz be kell jelentkezni
Ezt alapvetően egy 4 MB-os flash-re faragták rá...
Ezt írja: OpenWRT r44510
- A hozzászóláshoz be kell jelentkezni
ha a beepitett multiwan cuccot hasznalod, akkor ne a gw-t pingled, hanem az adott wan-on keresztul a 8.8.8.8 vagy valami kulso cimet.
ha arra van valasz akkor van internet is a wifin. (ha jol emlekszem akkor a pingnel interface bindet hasznal)
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Ez sajnos nem egy teljes értékű OpenWrt a 4MB-nyi flashméret miatt.
Multiwan nincs rajt, és valószínűleg nem is lenne egyszerű feltenni rá (többek között a 64 kB szabad hely miatt).
Nem közvetlen a gatewayt pingelném, hanem egy interneten elérhető IP-címet (pl. 8.8.8.8, 8.8.4.4).
A pingelés alapvetően nem probléma, mert meg tudom adni, melyik interfészen tegye, csak az alapértelmezett átjárót lenne jó úgy beállítani, hogy megfelelő (magasabb prioritású) interfészen menjen ki a forgalom...
- A hozzászóláshoz be kell jelentkezni
Megoldottam a problémám a fenti script segítségével.
Ez bekerült a crontab file-ba, ahonnan percenként lefut.
Ha nem sikerül elérni a szervereket a wlan hálózaton, akkor a 3G kapcsolaton mennek át az adatok, ha (újra) sikerül elérni a szervereket a vezeték nélküli kapcsolaton, akkor visszavált erre a hálózatra.
Úgy tűnik, szépen működik a dolog. :)
- A hozzászóláshoz be kell jelentkezni