Benutzer:Zim/UML - IPsec

Aus Opennet
Wechseln zu: Navigation, Suche

Umgebung:

Als Testumgebung kommt ein Verbund von UML-Instanzen zum Einsatz.

2x Hosts (A, B) Dienen als Endgeraete die miteinander kommunizieren

2x Router (Alpha, Bravo) Verbinden die beiden Endnetze

3x UML-Switch (sw0, sw1, sw2) Ein Switch fuer die Verbindung Host <-> Router, einer zwischen Router <-> Router und ein Switch der die Router mit dem Hostsystem verbindet.


Grafik folgt (irgendwann), dann wird das sicher etwas klarer.

Host A: - 192.168.20.2/24

Host B: - 192.168.30.2/24

Router Alpha: - 192.168.20.1/24

- Hostnetz

- 192.168.0.11/24

- Netz zum Hostsystem, Gateway

- 192.168.10.1/24

- Netz zum Router Bravo

Router Bravo: - 192.168.30.1/24

- Hostnetz

- 192.168.0.12/24

- Netz zum Hostsystem, Gateway

- 192.168.10.2/24

- Netz zum Router Bravo

UML-Switch 0: - Hostsystem - Gateway ins "richtige Netz"

UML-Switch 1: - Switch zwischen den Routern - gehubt ( -hub) - wireshark auf dem tap-dev des Hostsystems, um die Pakete zu beobachten

UML-Switch 2: - Hostnetze

Traffic beobachten: Ich hab dazu wireshark auf dem Hostsystem gestartet und es auf dem tap-device horchen lassen, dass dem Switch 1 gehoert. Deswegen ist der Switch auch ge"hub"t.

Zum Traffic erzeugen nehm ich einfach "ping" oder spaeter zwischen den Hostnetzen netcat:

Host A - client:

# netcat 192.168.30.2 1234

netcat macht eine tcp-verbindung zu 192.168.30.2 (host B) port 1234 auf


Host B - server:

# netcat -l -p 1234

netcat oeffnet port 1234 und horcht darauf. Die Serverseite sollte man natuerlich vorher starten. Wenn die Verbindung steht, kann man in beiden netcats schreiben und es wird auf dem jeweils anderen host angezeigt. Wird die Verbindung beendet (ctrl-c), beendet sich die Gegenseite auch.


Routing (optional):

Auf den Routern (Alpha, Bravo) laeuft "quagga" mit ospf als routing-protocol. Kann man natuerlich auch mit statischen Routen machen, aber das waere ja langweilig.

"quagga" koennen wir ja mal zu einem anderen Thema machen. Zusammen mit Routing.


IPsec:

AH oder ESP?

AH steht fuer "Authentication Header", was nur eine Authentifizierung der Pakete bewirkt. Dagegen steht ESP "Encapsulating Security Payload", was neben der Authentifizierung auch die Pakete verschluesselt.

Transport oder Tunnel?

Transport ist fuer den Traffic zwischen zwei Host, die beide IPsec verstehen. Tunnel baut einen Tunnel, durch welchen Pakete zb von dahinter liegenden Hosts, geleitet werden.

IKE oder Pre-Key

Waerend bei Pre-Key die Schluessel haendisch eingegen werden, kuemmert sich bei IKE ein daemon um die Verwaltung der Schluessel ua auch die regelmaessige Aenderung dieser.

Praxis:

Transport zwischen den Routern:

Auf beiden Routern werden "ipsec-tools" installiert. Diese Paket stellt die Anwendung "setkey" zur verfuegung.

#!/usr/sbin/setkey -f
add 192.168.10.1 192.168.10.2 ah 24500 -A hmac-md5 "1234567890123456";          
add 192.168.10.1 192.168.10.2 esp 24501 -E 3des-cbc "123456789012123456789012";
spdadd 192.168.10.1 192.168.10.2 any -P out ipsec
   esp/transport//require
   ah/transport//require;

add <local_ip> <remote_ip> <ah/esp> <SPI> <-A fuer AH (authentification), -E fuer ESP (encryption)> <key> Die erste Zeile legt also einen key (128bit, 16*8bit) fuer AH fest, die zweite eine key (192bit, 168 + 24 parity) fuer ESP. Die dritte Zeile enthaelt eine policy, wie mit entsprechenden Traffic umgegangen werden soll.

Damit die Paket von der Gegenseite entschluesselt/verifiziert werden koennen reichen auf Router Bravo folgende Zeilen:

#!/usr/sbin/setkey -f
add 192.168.10.1 192.168.10.2 ah 24500 -A hmac-md5 "1234567890123456";          
add 192.168.10.1 192.168.10.2 esp 24501 -E 3des-cbc "123456789012123456789012";

Da wir fuer den zweiten Router keine policy angelegt haben, werden die Pakete von Alpha zwar entschluesselt, aber Antworten gehen unverschluesselt uebers Netz. Viel schliemmer ist aber, dass Bravo beliebige Pakete von Alpha annimmt. Damit die Pakete auch verschluesselt werden, fuegen wir noch eine policy hinzu:

spdadd 192.168.10.1 192.168.10.2 any -P in ipsec
   esp/transport//require
   ah/transport//require;

sieht aus wie vom Router Alpha, allerdings wuerde das vorletzte Wort in der ersten Zeile geaendert out -> in. Bravo nimmt jetzt keine unverschluesselten Pakete mehr von Alpha an, sendet aber weiterhin unverschluesselt. Also kommt noch jeweils eine policy fuer die andere Richtung pro Router hinzu:

Alpha:

#!/usr/sbin/setkey -f
# config Router Alpha
flush;
spdflush;
# AH
add 192.168.10.1 192.168.10.2 ah 24500 -A hmac-md5 "1234567890123456";
add 192.168.10.2 192.168.10.1 ah 24500 -A hmac-md5 "1234567890123456";
# ESP
add 192.168.10.1 192.168.10.2 esp 24501 -E 3des-cbc "123456789012123456789012";
add 192.168.10.2 192.168.10.1 esp 24501 -E 3des-cbc "123456789012123456789012";
spdadd 192.168.10.1 192.168.10.2 any -P out ipsec
   esp/transport//require
   ah/transport//require;
spdadd 192.168.10.2 192.168.10.1 any -P in ipsec
   esp/transport//require
   ah/transport//require;


Bravo:

#!/usr/sbin/setkey -f
# config Router Bravo
flush;
spdflush;
# AH
add 192.168.10.1 192.168.10.2 ah 24500 -A hmac-md5 "1234567890123456";
add 192.168.10.2 192.168.10.1 ah 24500 -A hmac-md5 "1234567890123456";
# ESP
add 192.168.10.1 192.168.10.2 esp 24501 -E 3des-cbc "123456789012123456789012";
add 192.168.10.2 192.168.10.1 esp 24501 -E 3des-cbc "123456789012123456789012";
spdadd 192.168.10.1 192.168.10.2 any -P in ipsec
   esp/transport//require
   ah/transport//require;
spdadd 192.168.10.2 192.168.10.1 any -P out ipsec
   esp/transport//require
   ah/transport//require;

Die configs sind gleich, bis auf die geaenderte Richtung in der jeweiligen policy. Das "flush" und "spdflush" wirft nur alte keys und policys raus. Tadaa, deine erste IPsec-Verbindung ist fertig!

An dieser Stelle wuerde ich gern auf den Aufbau der config eingehen, damit sich jeder schnell selbst eine Loesung zusammenbauen kann. Die config unterscheided SAD "Security Association Database" und SPD "Security Policy Database". SAD sind die Zeilen mit dem "add" und SPD mit "spdadd".

SAD:

add [-46n] src dst protocol spi [extensions] algorithm ... ;

add - fuegt ein SAD eintrag hinzu (es gibt noch get, delete und deleteall)

[-46] - ipv4 oder ipv6 - optional

src - quelle

dst - ziel

protocol - ah, ah-old, esp, esp-old, ipcomp, tcp - tcp-md5

spi - Security Parameter Index, dient der Zuordnung, der Pakete, ist im paket zu sehen

[extensions] - -mode - tunnel, transport, any - optional - es gibt noch mehr extensions, siehe setkey-manual

algorithm - -E ealgo key, -A aalgo key - ealgo, aalgo sind verwendbar algorithmen zb: hmac_md5, hmac-sha512, 3des-cbc, twofish-cbc, aes-ctr - man unterscheided digest (authentification) und cipher (encryption), die ersten beiden sind digest und die letzten drei cipher

SPD:

spdadd [-46n] src_range dst_range upperspec label policy ;

spdadd - fuegt ein SPD eintrag hinzu

src_range, dst_range - address, address/prefixlen, address[port], address/prefixlen[port]

upperspec - siehe /etc/protocols oder zb icmp6, ip4 oder any fuer alle

label - bezeichner, der zb von SELinux ausgewertet werden kann

policy -

      -P direction [priority specification] discard
      -P direction [priority specification] none
      -P direction [priority specification] ipsec
                  protocol/mode/src-dst/level [...]

directory - in, out, fwd

priority - position in der SPD

discard, none, ipsec - was die Regel macht, aehnlich dem target in iptables


Tunnel

Machen wir mal mit einem Tunnel weiter, der die beiden Hostnetze an den Routern miteinander verbindet.

Wir nehmen mal die obere config und aendern die wichtigen Stellen:

1 #!/usr/sbin/setkey -f
2 # config Router Bravo
3
4 flush;
5 spdflush;
6
7 # AH
8 add 192.168.10.1 192.168.10.2 ah 24500 -A hmac-md5 "1234567890123456";
9 add 192.168.10.2 192.168.10.1 ah 24500 -A hmac-md5 "1234567890123456";
10
11 # ESP
12 add 192.168.10.1 192.168.10.2 esp 24501 -E 3des-cbc "123456789012123456789012";
13 add 192.168.10.2 192.168.10.1 esp 24501 -E 3des-cbc "123456789012123456789012";
14
15 spdadd 192.168.10.1 192.168.10.2 any -P in ipsec
16    esp/transport//require
17    ah/transport//require;
18 spdadd 192.168.10.2 192.168.10.1 any -P out ipsec
19    esp/transport//require
20    ah/transport//require;

Da wir nur verschluesseln wollen, werfen wir mal die zeilen fuer AH raus, fuegen dafuer die AH-parameter in die esp-zeilen ein!

1 #!/usr/sbin/setkey -f
2 # config Router Bravo
3
4 flush;
5 spdflush;
6
11 # ESP
12 add 192.168.10.1 192.168.10.2 esp 24501 -m tunnel -E 3des-cbc "123456789012123456789012" -A hmac-md5 "1234567890123456";
13 add 192.168.10.2 192.168.10.1 esp 24501 -m tunnel -E 3des-cbc "123456789012123456789012" -A hmac-md5 "1234567890123456";
14
15 spdadd 192.168.20.0/24 192.168.30.0/24 any -P in ipsec
16    esp/tunnel/192.168.10.1-192.168.10.2/require;
18 spdadd 192.168.30.0/24 192.168.20.0/24 any -P out ipsec
19    esp/tunnel/192.168.10.2-192.168.10.1/require;

Zeile 12 und 13: + -m tunnel -A hmac-md5 "1234567890123456"

Zeile 15 und 18 - achtung, reichenfolge beachten! - 192.168.10.1 192.168.10.2 - IP adressen der Router + 192.168.20.0/24 192.168.30.0/24 - IP bereich der hostnetze Zeile 16 und 18 - transport + tunnel + 192.168.10.1-192.168.10.2 - IP adressen der Router

Und schonwieder fertig! Aber Achtung, jetzt wird wiederum nur der Traffic zwischen den hostnetzen verschluesselt. Von Router zu Router oder Router zu Host ist wieder unverschluesselt.

Sollte das Beispiel nicht funktionieren, schaut nach, ob ihr irgendwo eine IP falsch habt bzw ob sie an der richtigen Stelle local-ip vs remote-ip steht.

Langsam zeichnet sich ab, dass eine komplexe Installation sehr umfassend werden wird. Deshalb kommt als naechster Punkt IKM zum automatisiertem Schluesseltausch.

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Start
Opennet
Kommunikation
Karten
Werkzeuge