www.dr-lotz.de

ipsec mit zwei dynamischen IP-Adressen

System: SuSE Linux 8.1

Ich verwende hier den Dyn-DNS-Service von www.dyndns.org.

Der eine Rechner (Internetzugangsrechner) Überträgt bei der Einwahl seine IP-Nummer zum DNS-Server von DynDNS.org, der andere (Notebook) macht im Rahmen des Starts von ipsec eine DNS-Abfrage. Falls der Zugangsrechner nicht eingewählt ist, wird ein Verfahren benötigt, um ihn von außen dazu zu bringen, sich einzuwählen.

Schritt 1: Einwahl durch Anruf vom Handy aus triggern

Mein ursprüngliches Verfahren, dies zu erreichen, war die /var/log/messages mit Hilfe des Programms logsurfer auszuwerten. Eine wesentlich elegantere Methode hat Johannes Endres in Heft 18 (2002) der c't auf Seite 204 beschrieben. Diese habe ich hier umgesetzt.

Bei einem Anruf erscheint ein entsprechender Eintrag in der /var/log/messages. Wird die Rufnummer des Anrufers übertragen, so erscheint auch diese Nummer in der Logdatei. Dieser Logeintrag erfolgt durch das Programm isdnlog. Isdnlog ist zusätzlich in der Lage, bei bestimmten Ereignissen Programme zu starten. Dies läßt sich nutzen, um bei einem Anruf, z.B. von einem Handy aus, eine Interneteinwahl auszulösen.

 

Eintrag in /etc/isdn/isdnlog.options.contr0, damit isdnlog Programme startet:

# ...
# -S                      start={yes|no}
# isdnlog soll bei diversen Events die in der 5. Spalte der isdn.conf
# angegebenen externen Programme starten
start=yes

# ...

Die Datei /etc/isdn/callerid.conf enthält die beteiligten Nummern: Die MSN die angerufen wird, und die Nummer, von der der Anruf erfolgt, der die Einwahl auslösen soll. Soll jeder Anruf auf die MSN die Einwahl bewirken, macht man vor die Zeilen [NUMBER] bis ZONE = 4 je ein Kommentarzeichen (#). Das hat den Vorteil, dass es egal ist, von wo aus man die MSN anruft und den Nachteil, dass jeder andere auch die Einwahl auslösen kann.

# ...
[MSN]
NUMBER = 9876789
ALIAS  = Internet-Trigger
ZONE   = 1


[NUMBER]
NUMBER = 01792032149
ALIAS  = Bjoerns Handy
ZONE   = 4
SI     = 1
START  = {
 [FLAG]
 FLAGS = I|R|U
 INTERVAL = 60
 PROGRAM  = /root/bin/dialout \${20}
 USER     = NOBODY
 GROUP    = NOGROUP
}

/root/bin/dialout:

#!/bin/bash
# Auslösen der Einwahl durch Anruf vom Handy

# mit Hilfe von isdnlog und /etc/isdn/callerid.conf
# ISDN-Verbindung
if [ "$1" = "Internet-Trigger" ]
then
   isdnctrl dial ippp0 >> /var/log/messages 2>&1
fi

# Alternative, auch fr DSL-Verbindung geeignet
#if [ "$1" = "Internet-Trigger" ]
#then
#   /bin/ping -c 1 www.dr-lotz.de >> /var/log/messages 2>&1
#fi

Schritt 2: Auswerten der eigenen IP-Nummer und Aktualisieren des DNS-Eintrags

Zunächst ist es erforderlich, sich bei www.dyndns.org anzumelden. Dabei muss man sich für eine der diversen Domains entscheiden und einen Rechnernamen festlegen.

Auf dem Interneteinwahlrechner ist ein geeigneter Client erforderlich, der die Aktualisierung der IP-Nummer übernimmt. Es gibt verschiedene DynDNS Clients, ich verwende addns.pl von David Hasson. Dieses tar-Archiv wird mit tar -xzf Addns-1.01c.tar.gz entpackt, das eigentliche Perl-Script addns.pl an eine geeignete Stelle kopiert und die im tar-Archiv enthaltene Beispielkonfigurationsdatei nach /etc/addns.conf kopiert und angepasst. In der Datei README sind die notwendigen Informationen zu finden.

# Konfiguration für addns.pl
# /etc/addns.conf
[main]
{
        proxy_host = "localhost"
        proxy_port = 3128
        use_proxy = no
}

[rechnername]
{
        detect_method = "iface"
        update_host = rechnername.dyndns.org
        iface = "ppp0"
        username = "username"
        password = "password"
        server_port = 80
        server_host = members.dyndns.org
}

Der Aufruf des Scripts erfolgt in der Datei /etc/ppp/ip-up.local.

#!/bin/bash
# /etc/ppp/ip-up.local
# Aufruf des Scripts für die Aktualisierung des DNS-Eintrags:
/usr/local/sbin/addns.pl

Schritt 3: Die ipsec-Konfiguration

Schritt 3A: Die ipsec-Konfiguration auf dem Einwahlrechner

# /etc/ipsec.conf - FreeS/WAN IPsec configuration file

# More elaborate and more varied sample configurations can be found
# in FreeS/WAN's doc/examples file, and in the HTML documentation.


# basic configuration
config setup
	# THIS SETTING MUST BE CORRECT or almost nothing will work;
	# %defaultroute is okay for most simple cases.
	interfaces=%defaultroute
	#interfaces="ipsec0=eth0"
	# Debug-logging controls:  "none" for (almost) none, "all" for lots.
	klipsdebug=none
	plutodebug=none
	# Use auto= parameters in conn descriptions to control startup actions.
	plutoload=%search
	plutostart=%search
	# Close down old connection when new one using same ID shows up.
	uniqueids=yes
	forwardcontrol=yes


# defaults for subsequent connection descriptions
conn %default
	# How persistent to be in (re)keying negotiations (0 means very).
	keyingtries=0
	# RSA authentication with keys from DNS.
	# leftrsasigkey=%dns
	# rightrsasigkey=%dns
	authby=rsasig
	leftrsasigkey=0sAQvP0uJNoc ...
	rightrsasigkey=0sAQzOEXzBr ...


# sample VPN connection: Rechner zu Rechner; left ist der Roadwarrior
conn sat-mond
	# Left security gateway, subnet behind it, next hop toward right.
	leftsubnet=
	left=%any
	leftid=@satellit.zuhause.netz
	leftnexthop=
	# Right security gateway, subnet behind it, next hop toward left.
	rightnexthop=
	right=%defaultroute
	rightid=@mond.zuhause.netz
	rightsubnet=
	# To authorize this connection, but not actually start it, at startup,
	# uncomment this.
	auto=add


# sample VPN connection: Rechner zu Subnetz; left ist der Roadwarrior
conn sat-sonne
	# Left security gateway, subnet behind it, next hop toward right.
	leftsubnet=
	left=%any
	leftid=@satellit.zuhause.netz
	leftnexthop=
	# Right security gateway, subnet behind it, next hop toward left.
	rightnexthop=
	right=%defaultroute
	rightid=@mond.zuhause.netz
	rightsubnet=192.168.1.0/24
	# To authorize this connection, but not actually start it, at startup,
	# uncomment this.
	auto=add

Schritt 3B: Die ipsec-Konfiguration auf dem Roadwarrior

Bei "right" steht jetzt der DNS-Name des heimischen Rechners, der Name wird beim Start von ipsec aufgelöst.

# /etc/ipsec.conf - FreeS/WAN IPsec configuration file

# More elaborate and more varied sample configurations can be found
# in FreeS/WAN's doc/examples file, and in the HTML documentation.

# basic configuration
config setup
	# THIS SETTING MUST BE CORRECT or almost nothing will work;
	# %defaultroute is okay for most simple cases.
	interfaces=%defaultroute
	#interfaces="ipsec0=ppp0"
	# Debug-logging controls:  "none" for (almost) none, "all" for lots.
	klipsdebug=none
	plutodebug=none
	# Use auto= parameters in conn descriptions to control startup actions.
	plutoload=%search
	plutostart=%search
	# Close down old connection when new one using same ID shows up.
	uniqueids=yes

# defaults for subsequent connection descriptions
conn %default
	# How persistent to be in (re)keying negotiations (0 means very).
	keyingtries=0
	# RSA authentication with keys from DNS.
	# leftrsasigkey=%dns
	# rightrsasigkey=%dns
	authby=rsasig
	leftrsasigkey=0sAQP0uJNo...
	rightrsasigkey=0sAQOEXzB...

# VPN connection
conn sat-mond
	# Left security gateway, subnet behind it, next hop toward right.
	#leftsubnet=
	left=%defaultroute
	leftid=@satellit.zuhause.netz
	#leftnexthop=
	# Right security gateway, subnet behind it, next hop toward left.
	rightnexthop=
	right=rechnername.dyndns.org
	rightid=@mond.zuhause.netz
	rightsubnet=
	# To authorize this connection, but not actually start it, at startup,
	# uncomment this.
	auto=add


conn sat-sonne
	# Left security gateway, subnet behind it, next hop toward right.
	#leftsubnet=
	left=%defaultroute
	leftid=@satellit.zuhause.netz
	#leftnexthop=
	# Right security gateway, subnet behind it, next hop toward left.
	rightnexthop=
	right=rechnername.dyndns.org
	rightid=@mond.zuhause.netz
	rightsubnet=192.168.1.0/24
	# To authorize this connection, but not actually start it, at startup,
	# uncomment this.
	auto=add

Jetzt fehlt noch eine Ergänzung in /etc/init.d/ipsec auf dem Roadwarrior und dann kann's losgehen (mit rcipsec start und ipsec auto --up sat-mond):

##### Addition by BL 12.11.2001
# This is a roadwarrior and his home has a dyn-IP too.
# So first we have to find out where our home is.
# This is done via a dyndns service, but in case this fails
# it can also be done by a script that gets the IP from a
# specific website and writes the ipsec.conf accordingly.
# (See http://www.dr-lotz.de/freeSWAN-web.html - in this case remove 
# the "#" in front of . /usr/local/sbin/create_ipsec.conf below.)
case "$1" in
    start|--start)
        #. /usr/local/sbin/create_ipsec.conf

        # eth0 wird nicht gebraucht und gibt Fehlermeldungen
        # beim Start von ipsec

        /sbin/ifconfig eth0 down
    ;;
    stop|--stop)
        /sbin/ifconfig eth0 up
    ;;
esac
##### End of addition

Noch eine Feinheit zum Schluss. Der Secret Key für die Verbindung liegt in /etc/ipsec.secrets. Wenn das Notebook verloren geht oder gestohlen wird, könnte jemand den Schlüssel verwenden, um eine Verbindung aufzubauen. Daher ist auf dem Notebook /etc/ipsec.secrets ein Link, der auf eine Datei verweist, die auf einer verschlüsselten Partition liegt. Das VPN funktioniert nur, wenn diese Partition beim Systemstart durch Eingabe des Passworts freigeschaltet wurde, ansonsten weist der Link ins Leere.