8. imond/imonc - imon-Server imond
:::[ Was ist imond? ][ Kommandos ][ Least-Cost-Routing ]:::

8.1.1 Was ist imond?

imond ist ein netzwerkfähiges Server-Programm, welches bestimmte Anfragen beantwortet oder auch Kommandos zur Steuerung des Routers entgegennehmen kann.

Ausserdem steuert imond das Least-Cost-Routing. Dazu verwendet er eine Konfigurationsdatei /etc/imond.conf, welche beim Booten automatisch aus den ISDN_CIRC_x_XXX-Variablen der Datei config/isdn.txt über ein Shell-Script erzeugt wird.

imond läuft permanent als Daemon und horcht gleichzeitig auf TCP/IP-Port 5000 und Device /dev/isdninfo.

nach oben

8.1.2 Kommandos

Folgende Kommandos sind über den TCP/IP-Port 5000 möglich:

Admin-Befehle:
addlink ci-index               Channel zum Circuit hinzufügen (Channel-Bundling)
adjust-time seconds            Ändert die Uhrzeit des Routers um die angegebenen Sekunden
delete filename pw             Löscht die Datei auf dem Router
hup-timeout #ci-index [value]  Anzeigen bzw. Setzen des HUP-Timeout für ISDN-Circuits
removelink ci-index            Zusätzlichen Channel wieder entfernen
reset-telmond-log-file         Löschen der telmond-Protokolldatei
reset-imond-log-file           Löschen der imond-Protokolldatei
receive filename #bytes pw     Eine Datei auf den Router übertragen. Dazu
                               quittiert imond den Befehl mit eienm ACK
                               (0x06). Danach wird die Datei in 1024er-
                               Blöcken übertragen, die imond auch jeweils
                               mit einem ACK bestätigt. Als letztes
                               übermittelt imond noch ein OK.
send filename pw               Wenn das Passwort stimmt und die Datei
                               existiert, liefert imond ein OK #bytes.
                               Anschliessend überträgt imond die Datei in
                               1024er Blöcken, die jeweils mit einem ACK
                               (0x06) bestätigt werden müssen. Als letztes
                               liefert imond noch ein OK.
support pw                     Liefert den Status/Konfiguration vom Router
sync                           Synchronisiert den Cache von gemounteten
                               Laufwerken
Admin- oder User-Befehle:
dial                          Wählt den Provider an (Default-Route-Circuit)
dialmode [auto|manual|off]    Liefert bzw. setzt den Dialmode
disable                       Hängt ein und setzt dialmode auf "off"
enable                        Setzt dialmode auf "auto"
halt                          Fährt den Router sauber herunter
hangup                        Hängt ein
reboot                        Reboot vom i4l-Router!
route [ci-index]              Setzen Default-Route auf Circuit X
                              (0=automatisch)
User-Befehle:
channels                      Ausgabe Anzahl der verfügbaren ISDN-Kanäle
charge #channel-id            Ausgabe der Online-Kosten für einen Channel
chargetime #channel-id        Online-Zeit unter Berücksichtigung des Taktes
circuit [ci-index]            Ausgabe eines Circuit-Namens
circuits                      Ausgabe Anzahl der Default-Route-Circuits
cpu                           Liefert die Auslastung der CPU in Prozent
date                          Ausgabe Datum/Uhrzeit
device ci-index               Liefert das Device des Circuits
driverid #channel-id          Ausgabe Driver-Id für Channel X
help                          Ausgabe Hilfe
inout #channel-id             Ausgabe der Richtung (incoming/outgoing)
imond-log-file                Ausgabe imond-Protokolldatei
ip #channel-id                Ausgabe der IP
is-allowed command            Ausgabe, ob Befehl konfiguriert/gültig ist
                              Mögliche Befehle: dial|dialmode|route|reboot|
                              imond-log|telmond-log|mgetty-log
is-enabled                    Ausgabe, ob dialmode auf off (0) oder auto (1)
links ci-index                Ausgabe Anzahl momentaner Channel 0, 1 oder 2
                              0 heisst: Kein Channel-Bundling möglich
log-dir imond|telmond|mgetty  Liefert das Logverzeichnis
mgetty-log-file               Ausgabe mgetty-Protokolldatei
online-time #channel-id       Ausgabe Online-Zeit der akt. Verbindung in hh:mm:ss
pass [password]               Abfrage, ob Password nötig bzw. Passwordeingabe
                              1 Userpassword gesetzt
                              2 Adminpassword gesetzt
                              4 imond befindet sich im Admin-Modus
phone #channel-id             Ausgabe Telefonnummer/Name des "Gegners"
pppoe                         Liefert die Anzahl der pppoe-Devices (also 0 oder 1)
quantity #channel-id          Liefert die übertragenen Datenmengen (in Byte)
quit                          Beenden der Verbindung zu imond
rate #channel-id              Ausgabe Übertragungsraten (incoming/outgoing in B/sec)
status #channel-id            Ausgabe Status für Channel X
telmond-log-file              Ausgabe telmond-Protokolldatei
time #channel-id              Ausgabe Summe Online-Zeiten, Format hh:mm:ss
timetable [ci-index]          Ausgabe der Zeittabelle für LC-Routing
uptime                        Ausgabe der Uptime des Routers in Sekunden
usage #channel-id             Ausgabe Art der Verbindung, mögliche
                              Antworten: Fax, Voice, Net, Modem, Raw
version                       Ausgabe der Protokoll- und Programm-Version

Der TCP/IP-Port 5000 ist nur vom maskierten LAN aus erreichbar. Standardmäßig wird ein Zugriff von aussen über die Firewall-Konfiguration abgeblockt.

Imond unterstützt zwei Benutzerebenen: den User- und den Admin-Modus. Für beide Ebenen kann ein Passwort gesetzt werden mittels IMOND_PASS bzw. IMOND_ADMIN_PASS. Dadurch werden die imon-Clients von imond gezwungen, eine Password-Abfrage durchzuführen und anschließend das Password an imond zu übertragen. Solange dieses Password nicht übermittelt wurde, nimmt imond nur die beiden Kommandos "pass" und "quit" entgegen. Alle anderen werden mit einem Fehler zurückgewiesen.

Möchte man das weiter einschränken, z.B. den Zugriff nur von nur einem PC erlauben, muss die Firewall-Konfiguration geändert werden. Das geht im Moment leider noch nicht über die Standard-Konfigurationsdatei config/base.txt. In diesem Fall ist eine Änderung im rootfs-Image nötig, nämlich in rootfs/etc/rc.d/masq. Wie das geht: siehe src/README.

Die Befehle

enable/disable/dialmode   dial/hangup   route   reboot/halt

können durch die Konfigurationsvariablen IMOND_XXX global ein- oder abgeschaltet werden (Kapitel "imond-Konfiguration").

Mit einem Unix/Linux-Rechner kann man das Ganze leicht ausprobieren:

Nach Eingabe von

telnet fli4l 5000      # oder entsprechender Name des fli4l-Routers

kann man direkt die oben aufgeführten Kommandos eingeben und sich die Ausgabe anschauen.

Zum Beispiel bekommt man mit "help" die Hilfe angezeigt, mit "quit" wird die Verbindung zum imond abgebaut.

nach oben

8.1.3 Least-Cost-Routing (Funktionsweise)

imond konstruiert aus der Konfigurationsdatei /etc/imond.conf (welche wiederum beim Booten aus den Konfigurationsvariablen ISDN_CIRC_x_TIMES (siehe Package ISDN) usw. erstellt wird), eine zeitabhängige Tabelle (Time-Table). Diese umfasst eine komplette Kalenderwoche im 1-Stunden-Raster (168 Stunden = 168 Bytes). Die Tabelle setzt sich jedoch lediglich aus Circuits zusammen, für die eine Default-Route definert ist.

Mit dem imond-Kommando "timetable" kann man sich diese Tabelle anschauen.

Hier ein Beispiel:

Nehmen wir an, dass 3 Circuits definiert wurden, nämlich:

CIRCUIT_1_NAME='Addcom'
CIRCUIT_2_NAME='Compuserve'
CIRCUIT_3_NAME='Firma'

wobei lediglich die ersten beiden Circuits mit Default-Routen belegt sind (ISDN_CIRC_x_ROUTE='0.0.0.0').

Wenn die dazugehörigen Variablen ISDN_CIRC_x_TIMES (siehe Package ISDN) folgendermaßen aussehen:

ISDN_CIRC_1_TIMES='Mo-Fr:08-18:0.0388:N Mo-Fr:18-08:0.0248:Y Sa-Su:00-24:0.0248:Y'
ISDN_CIRC_2_TIMES='Mo-Fr:08-18:0.018:Y Mo-Fr:18-08:0.048:N Sa-Su:08-18:0.018:N Sa-Su:18-08:0.048:N'
ISDN_CIRC_3_TIMES='Mo-Fr:08-18:0.08:N Mo-Fr:18-08:0.03:N Sa-Su:00-24:0.03:N'

dann wird daraus folgende Datei /etc/imond.conf:

#day  hour  device  defroute  phone         name        charge  ChInt
Mo-Fr 08-18 ippp0    no       010280182306  Addcom      0.0388     60
Mo-Fr 18-08 ippp0   yes       010280182306  Addcom      0.0248     60
Sa-Su 00-24 ippp0   yes       010280182306  Addcom      0.0248     60
Mo-Fr 08-18 ippp1   yes       018160        Compuserve  0.018     180
Mo-Fr 18-08 ippp1    no       018160        Compuserve  0.048     180
Sa-Su 08-18 ippp1    no       018160        Compuserve  0.018     180
Sa-Su 18-08 ippp1    no       018160        Compuserve  0.048     180
Mo-Fr 08-18 isdn2    no       0221xxxxxxx   Firma       0.08       80
Mo-Fr 18-08 isdn2    no       0221xxxxxxx   Firma       0.03       80
Sa-Su 00-24 isdn2    no       0221xxxxxxx   Firma       0.03       80

imond erstellt dann im Speicher folgende Time-Table - hier die Ausgabe über das imond-Kommando "timetable":

    0  1  2  3  4  5  6  7  8  8 10 11 12 13 14 15 16 17 18 18 20 21 22 23
--------------------------------------------------------------------------
Su  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3
Mo  2  2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  4  2  2  2  2  2  2
Tu  2  2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  4  2  2  2  2  2  2
We  2  2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  4  2  2  2  2  2  2
Th  2  2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  4  2  2  2  2  2  2
Fr  2  2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  4  2  2  2  2  2  2
Sa  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3
No.  Name        DefRoute  Device  Ch/Min  ChInt
 1   Addcom       no       ippp0   0.0388     60
 2   Addcom      yes       ippp0   0.0248     60
 3   Addcom      yes       ippp0   0.0248     60
 4   Compuserve  yes       ippp1   0.0180    180
 5   Compuserve   no       ippp1   0.0480    180
 6   Compuserve   no       ippp1   0.0180    180
 7   Compuserve   no       ippp1   0.0480    180
 8   Firma        no       isdn2   0.0800     80
 8   Firma        no       isdn2   0.0300     80
10   Firma        no       isdn2   0.0300     80

Für den Circuit 1 (Addcom) sind also drei Zeitbereiche (1-3) eingetragen, für Circuit 2 (Compuserve) vier Zeitbereiche (4-7) und für den letzen drei Zeitbereiche (8-10).

In der Time-Table werden jeweils die Indices ausgegeben, welche für die jeweilige Stunde gültig sind. Hier tauchen lediglich die Indices 2-4 auf, da alle anderen keine LC-Default-Routen sind.

Sieht man in der Tabelle irgendwo Nullen, gibt es Lücken in den ISDN_CIRC_X_TIMES-Werten. Dann existiert zu diesen Zeiten keine Default-Route, Internet-Zugang abgeknipst!

Beim Programmstart ermittelt imond zunächst den Wochentag und die aktuelle Stunde. Anschließend wird dann über die Time-Table der Index ermittelt und damit dann auch der entsprechende Circuit. Auf diesen wird dann die Default-Route gesetzt.

Bei Zustandsänderungen der ISDN-Channel, z.B. Wechsel von online nach offline - jedoch spätestens nach 1 Minute - geht das Spiel von neuem los: Zeit ermitteln, Lookup in Tabelle, Default-Route-Circuit ermitteln.

Ändert sich der aktuell verwendete Circuit, z.B. montags um 18:00 Uhr, wird die alte Default-Route gelöscht, eine vielleicht bestehende Verbindung beendet (sorry...) und anschließend die Default-Route auf den neuen Circuit gesetzt. Dies kann von imond bis zu 60 Sekunden später bemerkt werden, also wird spätestens um 18:00:58 umgeschaltet.

Bei Circuits, die keine Default-Route belegen, ändert sich überhaupt nichts. Hier wird der Inhalt von ISDN_CIRC_x_TIMES lediglich zur Berechnung der Telefonkosten verwendet. Diese können dann relevant sein, wenn man über den Client imonc das LC-Routing temporär ausschaltet und einen Circuit manuell wählt.

Man kann sich jedoch auch die Tabellen für andere Zeitbereich-Indices (im Beispiel von 1 bis 10) anschauen, auch die der "Non-LC-Default-Route-Circuits".

Kommando:

timetable index

Beispiel:

telnet fli4l 5000
timetable 5
quit

Die Ausgabe sieht dann so aus:

    0  1  2  3  4  5  6  7  8  8 10 11 12 13 14 15 16 17 18 18 20 21 22 23
--------------------------------------------------------------------------
Su  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
Mo  5  5  5  5  5  5  5  5  5  0  0  0  0  0  0  0  0  0  5  5  5  5  5  5
Tu  5  5  5  5  5  5  5  5  5  0  0  0  0  0  0  0  0  0  5  5  5  5  5  5
We  5  5  5  5  5  5  5  5  5  0  0  0  0  0  0  0  0  0  5  5  5  5  5  5
Th  5  5  5  5  5  5  5  5  5  0  0  0  0  0  0  0  0  0  5  5  5  5  5  5
Fr  5  5  5  5  5  5  5  5  5  0  0  0  0  0  0  0  0  0  5  5  5  5  5  5
Sa  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

No. Name        DefRoute  Device  Ch/Min  ChInt
 5  Compuserve  no        ippp1   0.0480  180

Alles klar?

Mit dem imond-Kommando "route" kann das LC-Routing ein- und ausgeschaltet werden. Bei Angabe eines positiven Circuit-Indices (1...N) wird die Default-Route auf den angegebenen Circuit gelegt. Ist der Index 0, wird das LC-Routing wieder aktiviert und der Circuit automatisch ausgewählt.

Zur Berechnung der Onlinekosten:

Das ganze Modell zur Berechnung der Onlinekosten funktioniert nur korrekt, wenn der Zeittakt für einen Circuit (Variable ISDN_CIRC_x_CHARGEINT (siehe Package ISDN)) über die ganze Woche konstant ist. Dies ist im Normalfall bei Internet-Providern die Regel. Wählt man sich jedoch über die Telekom (ich meine nicht T-Online!) z.B. in sein Firmennetz ein, gilt das als ganz normales Telefongespräch. Und da wechselt ab 18:00 der Takt von 80 Sekunden auf 4 Minuten (Stand Juni 00). Deshalb ist die Definition von

ISDN_CIRC_3_CHARGEINT='80'
ISDN_CIRC_3_TIMES='Mo-Fr:08-18:0.08:N Mo-Fr:18-08:0.03:N Sa-Su:00-24:0.03:N'

eigentlich nicht ganz korrekt. Es sind zwar abends umgerechnet auf die Minute 3 Pfennig (4 Minuten kosten 12 Telekom-Pfennige), jedoch ist der Takt falsch. Deshalb können bei der Kostenanzeige Differenzen zu den tatsächlichen Zahlen auftreten.

Vielleicht wird das später mal gefixed. Ich halte den Fehler im Moment für nicht ganz so tragisch, obwohl es jedoch bei häufiger Nutzung zu einem Problem werden kann: Bei längerer Idle-Zeit wird dann wahrscheinlich abends nicht der ganze Zeittakt von 4 Minuten ausgenutzt und deshalb das Ganze etwas teurer werden ...

Mittlerweile hat mir jemand einen Tip gegeben, wie verschieden lange Taktzeiten doch richtig berücksichtigt werden (auch wichtig für ISDN_CIRC_x_CHARGEINT): Man definiere einfach 2 Circuits, einen für tagsüber mit ISDN_CIRC_1_CHARGEINT='80' und den anderen mit ISDN_CIRC_2_CHARGEINT='240'. Natürlich muss man dann auch noch ISDN_CIRC_x_TIMES entsprechend wählen, damit tagsüber Circuit 1 und abends Circuit 2 verwendet wird. Ein schöner Trick ...

Wie gesagt: Bei Nutzung von Verbindungen zu Internet-Providern gibt es das Problem nicht, weil dort der Zeittakt immer konstant ist und lediglich die Kosten pro Minute wechseln (oder gibt es sowas doch??? Ich traue T-* alles zu :-).

nach oben