Pages by Andreas Hofmeier
An-H
eMail Impressum/Note
http[s]://www.abmh.de/tunnel.html

Like to be free? ... then: Fight for Freedom

[ Blacky's Socket-TTY v0.20 (c) Copyright 1999-2002 Andreas Hofmeier ]

    Blacky's IPIP-Tunnel

    Copyright (c) Andreas Hofmeier

    Dieses Programm ermöglicht es (wenn nötig, eine Verschlüsselte)
    Verbindung zu einem Server zu erzeugen. Über die Verbindung kann
    man eine andere IP einnehmen (auch wenn man hinter einem Firewall
    oder Masquerading-Server sitzt).

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of
    the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


Das Funktioniert so: Ich verbinde über ein Socket-Stream zwei
Devices. Ich mißbrauche hierzu die Pseudo-TTY-Devs, die auch von dem
xTerms benutzt werden. Auf beiden Seiten starte ich nun den pppd um
über diese Verbindung das Internet-Protokoll fahren zu können. Der
pppd ist ausgelegt um über eine Serielle Leitung zum Beispiel ein
Modem das Internet-Protokoll zu fahren, er muß ja nicht wissen, das
ich im ein Socket-Stream vorsetzte.

HINWEISE zur NEUEN ÜBERARBEITETEN Version finden Sie am ENDE dieser
Datei.

Die Verschlüsselung wird nun von dem Programmteil durchgeführt, der
die Daten vom Socket in das P-TTY oder umgekehrt kopiert.

Damit nicht jeder diesen Server ``Mißbrauchen'' kann, habe ich
weiterhin eine Passwortabfrage eingebaut:

Das Protokoll:
+---+                                 +---+
| S | <<<<<<<<<<<<<< ID <<<<<<<<<<<<< | K |
| e | <<<< Name (User/Klientname) <<< | l |
| r | <<<<<<<<<<<< PassWort <<<<<<<<< | i |
| v | <<<<<<< Verschlüsselung <<<<<<< | e |
| e |                                 | n |
| r | <><><><><><><> PPP <><><><><><> | t |
+---+                                 +---+

Die ID ist ein String, der Übertragen werden muß, um den Server
überhaupt erst mal zu Aktivieren. Wird ein falscher String empfangen,
beendet sich der Server, welcher von dem inetd gestartet wurde, sofort 
wieder.

der Part Verschlüsselung besteht nur aus einer Zeichen. Nämlich ``1''
oder ``0''. 1: Es wird Verschlüsselt, 0: Es wird _NICHT_
Verschlüsselt.

############### (Beispiel) Konfiguration:

um einen Tunnel mit meinem Programm aufzubauen müssen gewisse
Voraussetzungen erfüllt sein:

1.) Auf beiden Rechnern muß der PPPD (Point to Point Protocol Daemon)
zur Verfügung stehen! (PPP muß im Kernel oder als Modul (insmod
slhc.o; insmod ppp.o) geladen sein.)

2.) Einer der Beiden Rechner muß die IP-Adresse des anderen
kennen. z.B. Rechner A, weiß oder kann die IP des Rechners B in
Erfahrung bringen. So muß auf Rechner B der tnl-Server
laufen. Zwischen Rechner A und B muß eine "echte" Internetverbindung
bestehen. (nur Proxy-Zugang zählt nicht dazu.) Rechner A kann hinter einem
Firewall oder Masquerading stehen. Rechner B nicht. Also Rechner A muß
eine Socket-Stream-Verbindung zu Rechner B aufbauen können.

3.) Der Tunnel-Server und Klient müssen unter ROOT laufen, da sie
sonnst keine Möglichkeit hätten die TTYs zu belegen.

4.) Der SuperServer (inetd) muß auf dem Server laufen. Weiterhin muß
er so eingestellt sein, das er tnl.svr startet... siehe weiter unten...

(ich habe noch kein Tunnel-System gesehen, welches geringere
Anforderungen stellt.)

Schritte der Konfiguration

1.) Lesen dieses README
2.) Verstehen
3.) Wenn Sie nicht die nötigen Kenntnisse über Netzwerke haben,
    besorgen Sie jemanden der diese hat.
4.) Runterladen der http://www.an-h.de/tunnel.zip
5.) Entpacken Sie die Programme
6.) Prüfen ob das Programm läuft (tnl sollte Hilfe-Text ausgeben, wenn 
    es ohne Parameter aufgerufen wird). Sind alle Libs da?
7.) Der Folgenden Anleitung folgen:


############## Der Server. Das ist im Beispiel Rechner B, seine
IP-Adresse muß dem Klienten bekannt sein.

/blacky/vt/tnl.svr              ==> Server-Programm
/usr/sbin/pppd                  ==> Der PPP-Deamon (PPP muß voll
                                    eingerichtet sein - achten Sie
                                    darauf, das PPP im Kernel Aktiv
                                    sind!)
/blacky/vt/tnl.conf             ==> Server-Konfigurationsdatei
/etc/inetd.conf                 ==> Konfigurationsdatei für den
                                    SuperServer (inetd) Service <=>
                                    Programm (Server)
/etc/services                   ==> Konfigurationsdatei für den
                                    SuperServer (inetd) Service <=>
                                    Port

Die tnl.conf:
***
ID
<Name>|<PassWD>|<Schlüssel>|<PRByte>|<Ver-Byte>|<Command>
<Name>|<PassWD>|<Schlüssel>|<PRByte>|<Ver-Byte>|<Command>
...
***

Beispiel:
***
Andreas Hofmeier Private Network
Andreas|i3cFACSU|Ich hasse Bill Gates|56|248|/usr/sbin/pppd %s 192.168.1.2:192.168.1.1 2> /den/null
***

ACHTUNG: Der neue PPPD gibt einige Informationen auf StdERR aus. Diese
         Ausgabe werden von inetd natürlich in den Socket gesendet und
         zerstören die Integrität der Verschlüsselung. (Es
         funktioniert nicht mehr)
LÖSUNG:  Einfach "2> /dev/null" an das PPPD-Kommando anfügen.

Wobei bei dem <Command> das ``%s'' für das Pseudo-TTY-Devices steht,
welches benutzt wird. Nach dem %s werden die IPs (IPs der
Tunnel-Enden) zugewiesen: <Local IP>:<Remote IP>. Hierzu: RTFM: man
pppd ...

Auf dieser Seite (Server-Seite) des Tunnels hätten wir die IP
192.168.1.2. Auf der anderen (Klient-Seite) 192.168.1.1. Wenn bedarf
besteht müssen Sie noch das Routing ändern, um ein Netzwerk auf der
anderen Seite zu erreichen. z.B. ``route add 192.168.2.0 netmask
255.255.255.0 gw 192.168.1.1'' würde das gesammte Netzwerk 192.168.2.* 
auf die andere Seite des Tunnels routen.

Verschlüsselung:

<PRByte> und <Ver-Byte> sind Bytes. Also eine Zahl zwischen 0 und 255. PS:
Ich bin nicht sicher ob daß mit jeder Zahl Klappt!

<Schlüssel> ist ein String (eine Zeichenkette).

Je länger der <Schlüssel>, desto schwierieger wird es den Code zu
Knacken. Aber nicht zu Lange (bis 254 Zeichen sollte es keine Probleme
Geben)

Die Werte <Schlüssel>, <PRByte> und <Ver-Byte> werden _NICHT_
übertragen, wenn Sie nicht auf beiden Seiten Identisch sind, wird zwar
der pppd gestartet, es können aber keine Daten übertragen werden!

Ich empfehle Hierzu: Erst das Beispiel zum Laufen bringen, mit dieser
Konfiguration _MUß_ es Funktionieren...

Aus Einfachheit wird mein Tunnel-Server vom SuperServer (inetd)
gestartet:

In der /etc/services muß ein Service eingetragen werden:
***
#
# Blacky
#
# Tunnel
tnl     2005/tcp
***

In der /etc/inetd.conf muß jetzt noch eine Verbindung zwischen
Service und Server-Programm hergestellt werden:
***
#
# Blacky
#
# Tunnel
tnl             stream  tcp     nowait  root    /blacky/vt/tnl.svr
***

HINWEIß: Der inetd muß nach Änderung seiner Config-Files neu gestartet
         werden. (RTFM) oder ``ReBoot macht alles gut...''


############## Auf dem Klient (Rechner A) oder Die Anmeldung:

/blacky/vt/tnl			==> Klient-Programm
/usr/sbin/pppd			==> Der PPP-Deamon (PPP muß voll
				    eingerichtet sein - achten Sie
				    darauf, das PPP im Kernel Aktiv
				    sind!)

Auf dem Klient werden alle Informationen als Parameter und nicht in
Form einer Konfiguration Übergeben:

Muß unter ROOT laufen:

/blacky/vt/tnl <Server> <port> <ID> <Name> <PWD> <\"command\"> [-e <Schlüssel> <PRByte> <VerByte>]

<Server>:	Name oder IP des Servers
<Port>:		Port, hinter welchem der tnl.svr sitzt, im Beispiel 2005
<ID>:		Code um des Server zu Aktivieren: ``Andreas Hofmeier Private Network''
<Name>:		Login-Name ``Andreas''
<PWD>:		Passwort für das Account: ``i3cFACSU''
<"command">:	Kommandozeile: Mit ``"/usr/sbin/pppd %s"'' müßte
		gehen. Das ``%s'' steht auch hier wieder für das
		Pseudo-TTY-Devices und kann nur einmal benutzt werden.
-e:		Hiermit wird die Verschlüsselung Aktiviert.
 <Schlüssel>:	Schlüssel: ``Ich hasse Bill Gates''
 <PRByte>:	Ein Weiterer Schlüssel: 56
 <VerByte>:	Ein Weiterer Schlüssel: 248

Also

/blacky/vt/tnl weiss.ich.doch.nicht.de 2005 "Andreas Hofmeier Private Network" Andreas i3cFACSU "/usr/sbin/pppd %s" -e "Ich hasse Bill Gates" 56 248

Noch etwas zur Verschlüsselung: Wenn die Verschlüsselung übergangen wird,
ist es für Angreifer einfacher Möglich sich eine Verbindung zu
``Erschleichen''! 

Noch was zu pppd. Der pppd muß richtig configurirt werden, wenn diese
Sache hier laufen soll. Deswegen sollten Sie die beigelegte
Konfigurationsdatei verwenden, wenn es nicht funktioniert. Wenn Sie
diesen Tunnel und Modem-PPP parallel benutzten ist es empfehlenswert
verschiedene Konfigurations-Dateien für pppd zu benutzen. Die
``normale'' Konfigurations-Datei heißt ``/etc/ppp/options''. Mit dem
Parameter ``file <Alternative Options-File>'' können Sie den pppd
davon überzeugen eine andere Konfigurationsdatei zu verwenden.

Wenn Sie ein anderes Netzwerk über den tunnel Erreichen wollen, müssen
Sie das routing ändern. 

ACHTUNG, ACHTUNG: Sie sollten dringendst Vermeiden, das routing,
welches zum Erreichen des anderen Tunnel-Partners nötig ist in den
Tunnel zu routen! Das würde die Verbindung trennen, das der tunnel
nicht über sich selbst geroutet werden kann.

Routing-Beispiele:
+----------------------------------------------------------------+
|                   Internet (Unsicher)                          |
+----------------------------------------------------------------+
     | 134.102.66.55                            134.55.66.20 |
     |                                                       |     
     |                                                       |     
ppp0 | 134.102.66.54                            134.55.66.21 | ppp0
 +---0----+  192.168.1.2                   192.168.2.2  +----0---+
 | SERVER 0---------------------------------------------0 Klient |
 +---0----+  ppp1             Tunnel              ppp1  +----0---+
eth0 |           (geht verschlüssel übers Internet)          | eth0
     |                                                       |     
192.168.1.0                                             192.168.2.0
(sicheres Netzwerk)                              (sicheres Netzwerk)

Der Server ist mit dem Internet verbunden und über die IP
134.102.66.54 zu erreichen, weiterhin ist er an das Netzwer 192.168.1.0 
angeschlossen.

Also wird auf dem Server PPPD mit ``192.168.1.2:192.168.2.2''
aufgerufen.

# Internet:
route add 134.102.66.55 ppp0
route add default gw 134.102.66.55
# Lokales Netzwerk:
route add 192.168.1.0 eth0
# Tunnel zu Remote Network (192.168.2.0)
route add 192.168.2.0 gw 192.168.2.2
# oder
(route add 192.168.2.0 ppp1)

# Klient
# Internet:
route add 134.55.66.20 ppp0
route add default gw 134.55.66.20
# Locales Netzwerk:
route add 192.168.2.0 eth0
# Tunnel zu Remote Network (192.168.1.0)
route add 192.168.1.0 gw 192.168.1.2
# oder
(route add 192.168.1.0 ppp1)

Wenn Sie den gesammten Internetverkehr über den tunnel Routen wollen
(weil z.B. der Provider nicht Vertrauenswürdig ist, Werbung, ...),
müssen Sie den Server übers Internet routen, und das defaultrouting
dann über den tunnel laufen lassen:

# Routing zum Server, übers internet:
route add 134.102.66.54 gw 134.55.66.20
# oder, besser
route add 134.102.66.54 ppp0
# Altes default-Routing löschen:
route del default
# Zur Sicherheit Default-Routing über Provider mit nidriger Priorität
route add default gw 134.102.66.54 metic 4
# Neues default-Routing über tunnel
route add default gw 192.168.1.2

Sie müssen dann nur aufpassen, das die IP-Adressen des Tunnels gültig
sind, und vom Internet geroutet werden. 192.168.* ist ein Privates
Netzwerk und wird vom Internet NICHT geroutet also auch nicht
erkannt. Haben Sie ein solches Privates Netzwerk, müssen Sie, wenn die 
Rechner mit Privaten IPs Verbindung ins Internet haben sollen, ein
Masquerading auf dem Server laufen lassen...

Wenn der Klient langsamer/oder schneller ist als der Server kommt es
zu Problemen!  Dir Start vom pppd muß dann verzögert werden. Zum
Beispiel mit einem sleep 10; pppd ....

ACHTUNG: Mein Programm greift auf das UNIX-System zu! Es müssen
mindestens zur Verfügung stehen: SH (Bash), kill, ps, grep, stty, awk,
pppd (Vom Kernel Unterstützt)

Anwendungsbeispiele:
* Sie sitzen mit ihrem Klient in einer unsicheren Umgebung und wollen
  eine geschützte Leitung zu einem Server.
* Sie wollen sich die Werbeunterbrechungen bei GermanyNet oder anderen
  Providern nicht mehr antuen...

Anregungen:
* Sie können auch andere Programme als den pppd benutzen.
* Sie können ganze Scripte anstelle pppd einsetzten, etc ...

Hier meine Tunnel Auf- und Abbau Skripte:

~/.tnlconf_democonf
***
# Server zu welchem der TNL aufgebaut werden soll.
# HINWEIS: Sie können auch einen Rechner angeben, welcher den
#          Socket-Stream weiterleitet. Z.B. mit rinetd oder
#          inetd mit netcat.
# Server muß erreichbar sein!
export TNL_SERVER="134.102.66.54";

# Port auf welchem TNL lauscht
export TNL_PORT="2005";

# Hat keine Relevanz, muß aber vorhanden sein
export TNL_IS="NULL";

# IP des Servers aus der anderen Seite des Tunnels. Ist wichtig, damit
# das Skript testen kann, ob der Tunnel schon aufgebaut ist. Die IP
# sollte NUR über den Tunnel erreichbar sein,
export TNL_SERVER_V_IP="192.168.1.2";

# Wenn sie den kompletten Internet-Verkehr über den Tunnel leiten
# wollen, hier yes angeben. Sonst no. Das funktioniert allerdings nur,
# wenn EIN default-Routing eingestellt ist, durch welches der Server
# erreichbar ist. Dieses direkte default-Routing wird dann mit einer
# höheren Metrix versehen und ein neues Default-Routing über den
# Tunnel wird angelegt. Der Server wird vorher noch direkt geroutet.
export TNL_DEFAULTROUTE="yes"

# Loginname für Server
export TNL_LNAME="Andreas";
# Passwort
export TNL_LPASS="i3cFACSU";

# Command zum Starten des PPPDs
export TNL_LCOM="sleep 2; /usr/sbin/pppd %s";
# Schüssel für Verschlüsselung
export TNL_KEY1="Ich hasse Bill Gates";
# PRByte
export TNL_KEY2="56";
# Ver-Byte
export TNL_KEY3="248";
***

Mit "tunnel-up democonf" starten Sie den Tunnel mit der Konfiguration
von oben.

tunnel-up
***
#!/bin/sh


# Lade Konfiguration aus ~/.tnlconf_XXX, wobei XXX der erste Parameter ist
if [ "$1" != "" ]; then
  if [ -e $HOME/.tnlconf_$1 ]; then
    . $HOME/.tnlconf_$1
  else
    if [ -e $1 ]; then
      . $1
    fi
  fi
fi

TUNNEL_PID=0
ROUTE_DOWN=""

# Verbindung zum Server?
if ! ping -c 3 $TNL_SERVER > /dev/null 2> /dev/null; then
  echo FEHLER: Keine Verbindung zum Server: $TNL_SERVER
  exit 1
fi
# Tunnel Aufbauen
echo Erzeuge Tunnel...

if [ "$TNL_DEFAULTROUTE" == "yes" ]; then
  # Routing
  ROUTE=$(route -n | tail -n 1)
  # Ziel: GateWay
  GW=$(echo $ROUTE | awk '{print $2}')
  # Hm, kein Gateway definiert
  if [ "$GW" == "*" ]; then GW=""; fi
  if [ "$GW" == "0.0.0.0" ]; then GW=""; fi
  # Interface
  IF=$(echo $ROUTE | awk '{print $8}')
  # Route zum Server...
  if sudo route add $TNL_SERVER $(if [ "$GW" != "" ]; then echo -n " gw $GW "; fi) $IF; then
    ROUTE_DOWN="sudo route del $TNL_SERVER $(if [ "$GW" != "" ]; then echo -n " gw $GW "; fi) $IF";
  else
    if [ "$(route -n) | grep $TNL_SERVER)" == "" ]; then
      if sudo route add $TNL_SERVER $IF; then
	ROUTE_DOWN="sudo route del $TNL_SERVER $IF";
      fi
    fi
  fi
  # Default-Routeing  löschen
  sudo route del default
  # Normales Default-Routing mit einem höherem Metric
  if ! sudo route add default metric 4 $(if [ "$GW" != "" ]; then echo -n " gw $GW "; fi) $IF; then
    sudo route add default metric 4 $IF
  fi
fi

if [ "$TNL_VERSION" == "1" ]; then
  sudo tnl "$TNL_SERVER" "$TNL_PORT" "$TNL_IS" "$TNL_LNAME" "$TNL_LPASS" "$TNL_LCOM" -e "$TNL_KEY1" "$TNL_KEY2" "$TNL_KEY3" &
  TUNNEL_PID=$!
else
  sudo tnl2 "$TNL_SERVER" "$TNL_PORT" "$TNL_IS" "$TNL_LNAME" "$TNL_LPASS" "$TNL_LCOM" -e "$TNL_KEY1" "$TNL_KEY2" "$TNL_KEY3" &
  TUNNEL_PID=$!
fi

# Warte auf Tunnel
echo Warte auf Tunnel...
while ! ping -c 1 $TNL_SERVER_V_IP > /dev/null 2> /dev/null; do
  echo PING ... PONG ...
done

if [ "$TNL_DEFAULTROUTE" == "yes" ]; then
  # Default-Routing über tunnel, frag mich keiner, warum dass nicht vom PPPD gemacht wird
  sudo route add default gw $TNL_SERVER_V_IP

  # Debug ist zur Zeit nur möglich, wenn das defaultrouting aktiviert ist
  if [ "$debug" == "yes" ]; then
    sudo rm -rf $DEBUGDIR/tunnel/* 2> /dev/null
    mkdir -p $DEBUGDIR/tunnel/
    cd $DEBUGDIR/tunnel/
    sudo tcpflow -i $(route | grep default | awk '{print $8}' | head -n 1) &
    sleep 6;
  fi
fi

# Dauerping zum Server um den durchsatz zu garantieren
ping $TNL_SERVER_V_IP > /dev/null 2> /dev/null &
PING_PID=$!

# Speichere Informationen zum späterem Trennen des Tunnels...
echo TUNNEL_PID=$TUNNEL_PID > $HOME/.tunnel
echo PING_PID=$PING_PID >> $HOME/.tunnel
echo ROUTE_DOWN=\"$ROUTE_DOWN\" >> $HOME/.tunnel
#echo GW=$GW >> $HOME/.tunnel
#echo IF=$IF >> $HOME/.tunnel
if [ "$1" != "" ]; then
  echo TUNNEL_PID=$TUNNEL_PID > $HOME/.tunnel_$1
  echo PING_PID=$PING_PID >> $HOME/.tunnel_$1
  echo ROUTE_DOWN=\"$ROUTE_DOWN\" >> $HOME/.tunnel_$1
  #echo GW=$GW >> $HOME/.tunnel_$1
  #echo IF=$IF >> $HOME/.tunnel_$1
fi

# EXIT
exit 0
***


tunnel-down
***
#!/bin/sh


if [ "$1" != "" ]; then
  if [ -e "$HOME/.tunnel_$1" ]; then
    TNL_STAT="$HOME/.tunnel_$1"
  else
    if [ -e "$HOME/.tunnel" ]; then
      TNL_STAT="$HOME/.tunnel"
    else
      echo "** ERROR: Can't load static tnl-data!"
      exit 1
    fi
  fi
else
  if [ -e "$HOME/.tunnel" ]; then
    TNL_STAT="$HOME/.tunnel"
  else
    echo "** ERROR: Can't load static tnl-data!"
    exit 1
  fi
fi

. $TNL_STAT


if [ "$ROUTE_DOWN" != "" ]; then
  eval $ROUTE_DOWN
fi

# Tunnel Trennen
echo Trenne Verschlüsselten Tunnel...
# Default-Routing löschen...
#sudo route del default
# Altes Default-Routinh wieder herstellen
#sudo route add default $(if [ "$GW" != "" ]; then echo -n " gw $GW "; fi) $IF || {
#  sudo route add default $IF
#}
# Tunnel Trennen
sudo kill $TUNNEL_PID 2> /dev/null
kill $PING_PID
# Etwas warten...
sleep 3
rm $TNL_STAT
# EXIT
exit 0
***


Hier meine /etc/ppp/options Ersatzdatei, auf dem Server:
***
noipdefault
ipcp-accept-local
ipcp-accept-remote
noauth
crtscts
lock
modem
asyncmap 0
nodetach
noproxyarp
noipx
novj
novjccomp
***

Falls Sie Probleme mit Zombies (nicht richtig beendete pppds, welche
ein neu Aufbauen des Tunnels verhindern) haben, welche entstehen, wenn
der Tunnel nicht korrekt beendet wird, könnte es helfen den Timeout
des pppd zu setzten.

idle n

, wobei n die Zeit in Sekunden ist nach der PPPD sich beenden soll,
wenn nichts übertragen wird. Da das tunnel-up-Skript ein Dauerping
sendet (um den Tunnel zu stabilisieren) wird sich der pppd nur beenden
wenn die Verbindung unsachgemäß getrennt wurde. Ich empfehle 150, also
2,5 Minuten.


########################################################################
###################### Neue Version - Änderungen #######################
########################################################################

- Die neue Version tnl2 und tnl2.svr verwenden die SockMD5Auth() -
Funktion um eine sichere Überprüfung des Gegenübers durchzuführen. So
wird vermieden das Login-Passwort zu übermitteln. (Die Protokoll-
Beschreibung am Anfang trifft also NUR auf die alte Version zu!)

- Die neue Version lässt keine unverschlüsselte Verbindungen mehr zu.

- Leider ist es nicht möglich, den Tunnel Versionsübergreifend zu
verwenden.

- Die Konfiguration ist fast gleich geblieben. An der
Netzwerkkonfiguration (pppd/route/ifconfig) hat sich nichts
geändert. Sie müssen nur die Namen (tnl => tnl2 und tnl.svr =>
tnl2.svr) ändern, um die neue Version zu verwenden. In der
/etc/inetd.conf und in Ihren Skripten.

- Das Format der Konfigurationsdatei hat sich auch nicht geändert. Die 
erste Zeile, welche von der neuen Version nicht mehr verwendet wird,
wird ignoriert.

- Die Parameter des Klienten haben sich ebenfalls nicht
geändert. Allerdings hat die ID bei der neuen Version keine Relevans,
es muß aber etwas übergeben werden!

Download now (tunnel.zip)

Siehe auch:

ACHTUNG: Dieses Programm, bzw. dieser Test unterliegt der GPL!


Pages by Andreas Hofmeier
An-H
eMail Impressum/Note
http[s]://www.abmh.de/tunnel.html
Creative Commons License
(c) Andreas B. M. Hofmeier
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License