
Früher oder später beim Aufbau einer IT-Infrastruktur besteht die Aufgabe darin, sich in alle Dienste eines großen Unternehmens zu integrieren. Dies kann beispielsweise eine Bank oder ein Telekommunikationsbetreiber sein. In der Regel verfügen große Unternehmen über gut etablierte Richtlinien zur Informationssicherheit, die insbesondere die Implementierung eines Dienstes mit einer externen Infrastruktur über verschlüsselte Kanäle - IPSec - erfordern. Gleichzeitig gibt es in kleinen
Startup- Organisationen keine Erfahrung mit der Organisation solcher Programme, und von der Ausrüstung ist nur VDS mit Linux an Bord. Darüber hinaus gibt es zu meiner Überraschung in Runet praktisch keine Materialien, die Linux-Tools zur Fehlerbehebung beschreiben. Versuchen wir, diese Lücke zu schließen und den praktischen Teil der Einstellungen zu beschreiben.
Das allgemeine Schema des Dienstes ist unten dargestellt. In großen Organisationen ist in der Regel alles bereits standardisiert, in Betrieb genommen, alle möglichen Verschlüsselungs- und anderen Netzwerkelemente werden auf separaten Geräten (Tsiska-Wacholder und ähnliche) und, was noch wichtiger ist, von
Einzelpersonen (möglicherweise jede blaue Box in der folgenden Abbildung) ausgeführt von verschiedenen Personen serviert). Sie haben eine virtuelle Maschine, mit der der Dienst gestartet und IPSec organisiert wird.

Bitte beachten Sie, dass IPSec selbst zwischen einer IP-Adresse (in meinem Beispiel
10.0.255.1 <-> 10.0.1.1
) und der Dienst selbst zwischen anderen (
192.168.255.1<-> 192.168.1.1
) organisiert ist. Solche Schemata werden auch als
IPSec Network-Network bezeichnet .
Ein einfaches Beispiel ist, dass Sie in einem jungen, aber sehr ehrgeizigen Unternehmen
SuperService arbeiten und die Interaktion mit der geschlossenen API von
MegaTelecom organisieren
müssen . Ihre Infrastruktur ist ein VDS-Server, Ihre Partnerinfrastruktur besteht aus einer Reihe von Netzwerk- und Servergeräten. Die Aufgabe ist in zwei Phasen unterteilt:
- Transport organisieren (wie die Zusammenarbeit stattfinden wird).
- Konfigurieren Sie den Dienst (führen Sie Anwendungen direkt auf den Servern aus).
Daher hat der
SuperService- Manager beschlossen, eine Verbindung zu einer großen Organisation herzustellen, um ein Geschäftsproblem zu lösen. Er wandte sich an
MegaTelecom , an das sie ihm
technische Spezifikationen für die Verbindung schickten. Eine dieser Bedingungen ist
IPSec . Dieser Zustand trat in Form einer
Excel- Platte auf, von der ich im Folgenden ein Beispiel vorstellte. Auf dem Bild habe ich technisch wichtige Parameter gelb hervorgehoben. Das Format kann variieren, aber das Wesentliche bleibt gleich.

Zunächst wird es von Ihrer Seite nicht ausgefüllt, es muss ausgefüllt und zur Genehmigung an den Partner gesendet werden. Nachdem Sie zugestimmt haben, können Sie sich hinsetzen und versuchen, Ihren Linux-Computer zu optimieren.
IPSec-Konzept
Als nächstes werde ich eine kleine Theorie für Leute geben, die mit Technologie überhaupt nicht vertraut sind. Alles, was ich weiter beschreiben werde, bezieht sich auf reines Ethernet und IPv4. Ich werde nicht auf Verschlüsselung und Schlüsselaustauschalgorithmen eingehen, sondern mich auf den Netzwerkteil konzentrieren.
IPSec - eine Reihe von Techniken und Protokollen zum Organisieren einer sicheren Verbindung.
Im Gegensatz zu anderen Tunneling-Technologien (GRE, PPP, L2TP, sogar MPLS-TE) werden für IPSec explizite Tunnelschnittstellen erstellt, über die der Datenverkehr geleitet werden kann. Stattdessen bietet IPSec das Konzept der sogenannten
Security Assotiations (SA) an .
SA ist der Tunnel von einem Netzwerkgerät zum anderen. Vergessen Sie jedoch nicht, dass
SA keine Netzwerkschnittstelle im normalen Sinne des Wortes ist. Klassisches Routing funktioniert hier nicht. Anstelle der Routing-Tabelle funktioniert hier das
SP- Konzept
(Security Policy) . Wir schreiben explizit eine Zugriffsliste (Access List, ACL) vor, um Datenverkehr durch eine bestimmte SA zu leiten. All diese Dinge sind im sogenannten
ISAKMP- Framework definiert.
ISAKMP - eine Beschreibung der IPSec-Verfahren, in der Literatur wird es als Framework bezeichnet. Es beschreibt die Begriffe SA, SP, SAD (Security Assotiations Database), SPD (Security Policy Database), die Notwendigkeit, Hilfstunnel zu installieren ... ISAKMP ist so konzipiert, dass es nicht von Tunneltechnologien, Authentifizierungsalgorithmen und Verschlüsselung abhängt. Er führt einfach die notwendigen Definitionen ein.
IKE (v1 / 2) - direktes Authentifizierungsprotokoll. Er implementiert bereits Schlüsselaustauschalgorithmen und deren Anwendung.
Dank des Cisco-Konzepts gelten ISAKMP und IKE jetzt auch als synonym.
Vor dem Verschlüsseln des Datenverkehrs müssen sich die Parteien auf die Parameter (und Schlüssel) dieser Verschlüsselung einigen. Zu diesem Zweck erhebt sich zwischen beiden Seiten ein Hilfstunnel (auch ISAKMP-Tunnel genannt), der ständig in Betrieb ist. Dieser bidirektionale Tunnel ist eine UDP-Verbindung (standardmäßig an Port 500). Um diesen Hilfstunnel zu organisieren, müssen sich die Parteien gegenseitig authentifizieren (das Passwort muss übereinstimmen). Dies erfolgt über das
IKEv1 / 2- Protokoll
(Internet Key Exchange) . Und bereits im von
ISAKMP organisierten Tunnel vereinbaren die Parteien, den Benutzerverkehr direkt zu verschlüsseln.
Die IPSec-Organisation selbst ist in zwei Phasen unterteilt:
- Erstellen eines ISAKMP-Hilfstunnels
- Erstellen eines Benutzerdatentunnels
Wie ich schrieb, werden Tunnel im IPSec-Konzept (oder besser gesagt im
ISAKMP- Konzept) als
SA bezeichnet .
Die erste Phase (Organisation ISAKMP SA) kann in zwei Modi durchgeführt werden:
- Hauptparteien tauschen abwechselnd Verhandlungsparameter aus. Es gilt als sicherer und wird für permanente Kanäle verwendet (unser Fall).
- aggressiv - In einer Nachricht sendet der Initiator alle erforderlichen Koordinierungsparameter. Er wird verwendet, wenn ein Remote-Benutzer für eine temporäre Sitzung verbunden wird (um die Sitzung zu beschleunigen).
Sie müssen verstehen, dass die
Haupt- SA-Tunnel
unidirektional sind . Für die bidirektionale Datenübertragung über den IPSec-Kanal müssen zwei Tunnel vorhanden sein: Quelle (src) → Empfänger (dst) und umgekehrt.
Bei allen Verschlüsselungsmethoden werden dem ursprünglichen IP-Paket zusätzliche Header hinzugefügt. Die Kapselung erfolgt. Für diese Kapselung gibt es zwei Methoden:
AH (Authentication Header) und
ESP (Encapsulation Security Payload) . AH authentifiziert nur das Paket (vom Absender digital signiert), ESP und authentifiziert (Zeichen) und verschlüsselt. Heute wird AH fast nie verwendet, alles ist in ESP verpackt.
Sie können das Quell-IP-Paket verschlüsseln und authentifizieren, ohne den IP-Header (Transportmodus) oder damit (Tunnelmodus) zu berücksichtigen.
Transport wird verwendet, wenn geplant ist, seine Tunnel mithilfe anderer Technologien (nicht IPSec / ESP) zu organisieren. Zum Beispiel GRE, l2tp, ppp. Um einen Dienst mit der internen Infrastruktur einer großen Organisation zu verbinden, wird er praktisch nicht verwendet. Ich habe dieses Szenario verwendet, um mehrere Büros über IPSec zu einem VPN zu kombinieren. Wir sind mehr am
Tunnelmodus interessiert. Wie Sie auf dem Bild sehen können, wird hier ein zusätzlicher IP-Header hinzugefügt.

Übrigens gibt es ein echtes Beispiel für die Verwendung der AH-Kapselung. Angenommen, wir haben zwei Netzwerke, die mit verschiedenen Routern verbunden sind. Hosts sollten Informationen mit einer MTU von 1500 Bytes ohne Fragmentierung übertragen, aber wir haben einen Zwischenabschnitt, der nur 1380 Bytes unterstützt. Der gesamte Track ist vertrauenswürdig. Wir können die Tatsache nutzen, dass IPSec keine Tunnelschnittstellen im klassischen Sinne erstellt, durch die der Verkehr nicht geleitet wird. Wir werden eine Tunnel- SA vom Typ AH erstellen (wir müssen nicht verschlüsseln), dann wird der Datenverkehr dorthin geleitet. Nur externe IP-Pakete (gemäß externen IP-Headern) werden im Datenverkehr fragmentiert, interne werden ohne Änderungen wieder zusammengesetzt.


Beachten Sie, dass der
ESP- Header
vor dem TCP / UDP-Transport ansteigt. Denken Sie daran, dass das IP-Feld ein Protokollfeld enthält? Basierend auf diesem Feld verarbeiten Netzwerkgeräte (und Endhosts) IP-Pakete korrekt. Für ESP ist die Nummer 50. Eine vollständige Liste der Protokolle für dieses Feld kann im
Wiki angezeigt werden. Dies kann sehr nützlich sein.

Das Fehlen eines Transportschicht-Headers (TCP / UDP / ICMP ist bereits verschlüsselt!) Beschränkt Technologien wie NAT. Denken Sie daran, dass NAT mit Port-Übersetzung (Überladung, PAT, MASQARADE, es hat viele Namen) auf der Basis von Transportprotokoll-Ports funktioniert. Und im verschlüsselten IPSec-Tunnel sind sie es nicht! Um dieses Problem zu lösen, gibt es eine Technologie wie
IPSec NAT-Traversal (NAT-T) . In der ersten Phase vereinbaren die Parteien die Verwendung von NAT-T. Wenn beide Seiten NAT-T unterstützen (und sogar auf denselben UDP-Ports), wird der UDP-Header zu den resultierenden Tunneln für den Datenverkehr hinzugefügt, mit denen Pakete bereits Router mit Netzwerkadressübersetzung durchlaufen.
Der Tunnel selbst steigt nicht an, Sie müssen den Verkehr dorthin lenken. Wie ich oben geschrieben habe, funktionieren Routing-Regeln hier nicht. Sie müssen
Sicherheitsrichtlinien (SP) schreiben.
Richtlinien bestehen aus der Quelladresse, der Zieladresse, der Richtung (in, out, fwd) und den Benutzertunnelparametern (hier wird ESP beschrieben, ob es sich entweder um AH, Tunnelversion oder Transport handelt). Dies ähnelt eher dem Organisieren von Regeln für NAT. NAT hat auch nicht genügend Routing-Tabelleneinträge. Und auch dort werden die Regeln angegeben,
wo, wo und wie und nicht
wo und durch was . Und auch mit der falschen Handbewegung können Sie die gesamte Kommunikation auf dem Remote-Server blockieren.
Alle IPSec-Manipulationen fügen Overhead-Header hinzu. Zumindest essen sie weitere 40 Bytes aus dem Originalpaket. So ist beispielsweise bei einer Standard-MTU für PPPoE mit 1380 Byte Verbindungen die tatsächliche MTU <1340.
IPSec unter Linux
Lassen Sie uns am Beispiel von DEB-Verteilungen üben. Ich werde nur den Fall einer Autorisierung betrachten, die auf einem
Pre-Shared-Key (PSK) basiert. Wir werden das Schema ab dem Anfang des Artikels konfigurieren.
IPSec selbst wird vom Kernel unterstützt, diese Unterstützung ist jedoch sehr begrenzt. Tatsächlich befassen sich die kräftigen Module nur mit der Verschlüsselung und den Schlüsseln (Paketverarbeitung), die bereits empfangen (an den Kernel übertragen) wurden. Und um dort die Parameter und Regeln zu übergeben, mit denen Sie den Datenverkehr verarbeiten müssen, benötigen Sie eine separate Software. Als solche Software gibt es mehrere Lösungen:
- KAME wurde von BSD migriert
- xSWAN (strongswan, freeswan, libreswan usw.)
- Küstenmauer
Es schien mir die einfachste (vorhersehbarste) Version von KAME zu sein, und wir werden es weiter drehen.
Traditionell bestand KAME aus zwei Komponenten
- Der Racoon-Daemon zur Steuerung des ISAKMP- Tunnels.
- Setkey- Dienstprogramme zum Verwalten von SA-Tunneln mit Daten.
Beginnen wir mit dem ersten.
Racoon ist für die Tunnelautorisierungseinstellungen unter IKE verantwortlich. Dies ist ein Daemon, der mit einer Konfigurationsdatei (
/etc/racoon.conf
) konfiguriert ist und von einem regulären Init-Skript (
/etc/init.d/racoon <start|stop|restart>
) gestartet wird.
root @ localhost: ~ # cat /etc/racoon.conf root @ localhost: ~ # cat /etc/racoon/psk.txt Wie immer Details in
man 5 racoon.conf
Als nächstes werden wir
das Setkey- Dienstprogramm aufnehmen. Es startet auch als Daemon (
/etc/init.d/setkey <start|stop|restart>
), führt jedoch das Skript
/etc/ipsec-tools.conf
. Wie gesagt, es werden bereits Tunnel für den Benutzerverkehr erstellt. Setzt nämlich
SA und SP für sie. Dies ist so etwas wie eine
Kryptokarte auf der ASA. Die einfachste Möglichkeit für uns ist, nur SP hinzuzufügen. Dann wird die SA automatisch basierend auf den Parametern der zweiten Phase erstellt, die in den
Waschbäreneinstellungen angegeben sind.
Es ist jedoch möglich, die Parameter der zweiten Phase von
racoon überhaupt nicht zu verwenden, sondern SA über dieses Dienstprogramm einzustellen. Details und Syntax finden Sie in
man 8 setkey
. Aber ich werde ein Beispiel für die einfachste Konfiguration geben.
root @ localhost: ~ # cat /etc/ipsec-tools.conf flush; spdflush; spdadd 192.168.1.1/32 192.168.255.1/32 any -P out ipsec esp/tunnel/10.0.1.1-10.0.255.1/require; spdadd 192.168.255.1/32 192.168.1.1/32 any -P in ipsec esp/tunnel/10.0.255.1-10.0.1.1/require;
Derzeit wird das Dienstprogramm
setkey vom
iproute2- Modul dupliziert.
Als Teil davon gibt es zwei Records Management Teams SA und SP.
- ip xfrm state
- IP-Xfrm- Richtlinie
Zusätzlich zur Verwaltung dieses Dienstprogramms können Sie den Status der organisierten SAs und
SPs anzeigen, die auf den Datenverkehr angewendet werden. Weitere Details in
man 8 ip-xfrm
.
Schauen Sie sich das Originaltablett noch einmal an. Es gibt verschiedene IP-Adressen für IPSec und Service. Die interne IP-Adresse wird innerhalb der Megatelecom- Infrastruktur gefiltert. Wir haben aber nur eine virtuelle Maschine. Darauf sollte irgendwie eine interne IP-Adresse erscheinen, und Pakete in den Tunnel sollten von dort ausgehen. Es gibt verschiedene Möglichkeiten, um dieses Szenario zu erreichen:
- Eine statische Route ohne Erkennung eines Stopps, jedoch mit expliziter Angabe der ausgehenden Schnittstelle und der IP-Adresse.
- Definieren von Routen basierend auf richtlinienbasiertem Routing (PBR unter Linux, auch bekannt als IP-Regel ).
- Adressübersetzung ( NAT / MASQARADE ).
Aus meiner Sicht ist hier die erste Option geeignet.
Wir können unserer Schnittstelle eine zusätzliche (sekundäre) IP-Adresse hinzufügen, während es besser ist, einen Alias für diese Schnittstelle zu erstellen
root@localhost: ~# ip addr add 192.168.1.1/32 dev eth1 label eth1:1
und konfigurieren Sie die Route zum Megatelecom- Server von dieser IP-Adresse.
root@localhost: ~# ip route add 192.168.255.1/32 dev eth1:1 src 192.168.1.1
Aber wenn Sie dies tun, wird nichts beginnen. Tatsache ist, dass die Linux-Station beim Hinzufügen einer Route in diesem Formular versucht, die MAC-Adresse des Empfängers zu ermitteln. Dies geschieht über ARP ... Der Computer sendet ARP-Anforderungen mit Who has IP 192.168.255.1
. Da sich 192.168.255.1 nicht im selben Netzwerk wie 192.168.1.1 (mask / 32!) Befindet, erfolgt keine Antwort auf ARP. Wenn Sie jedoch versuchen, eine Verbindung No route to host
wird von der lokalen IP-Adresse No route to host
zurückgegeben. Um dies zu verhindern, müssen wir einen statischen ARP-Datensatz festlegen:
root@localhost: ~# arp -s 192.168.255.1 00:00:00:00:00:01 -i eth1:1
So ein Life Hack. Übrigens führen solche Manipulationen möglicherweise nicht zum korrekten Betrieb des Linux-IP-Stacks. In einem der Fälle führten ip route
nicht zum gewünschten Ergebnis. Der Netzwerkstapel musste neu gestartet werden.
Gesundheitscheck
Vergessen Sie nicht, der Tunnel wird nur steigen, wenn der Verkehr hinein geht! Es ist erforderlich, vor dem Ziel von einer bestimmten Schnittstelle (IP-Adresse) aus zu pingen.
root@localhost: ~# ping -I 192.168.1.1 192.168.255.1
Mit einer leichten Verzögerung sollten Antworten von der Rückseite kommen (es sei denn, ICMP ist natürlich irgendwo auf der Site geschlossen).
Wir können sehen, ob der ISAKMP-Tunnel gestiegen ist.
Wir können auch Tunnel mit Benutzerdaten sehen.
racoonctl show-sa esp 10.0.1.1 10.0.255.1 esp mode=tunnel spi=2148175815(0x800a8fc7) reqid=0(0x00000000) E: 3des-cbc 799e587f 6a2b4b78 5590cc2a 3d3ee331 f7e7f472 01abcdef A: hmac-sha1 01c5161f 46679a36 5d07ee9d f159fc9a 01abcdef seq=0x00000000 replay=4 flags=0x00000000 state=mature created: Oct 2 09:22:44 2018 current: Oct 2 10:39:21 2018 diff: 4597(s) hard: 28800(s) soft: 23040(s) last: Oct 2 09:22:45 2018 hard: 0(s) soft: 0(s) current: 84(bytes) hard: 0(bytes) soft: 0(bytes) allocated: 1 hard: 0 soft: 0 sadb_seq=1 pid=3764 refcnt=0 10.0.255.1 10.0.1.1 esp mode=tunnel spi=45614328(0x02b804f8) reqid=0(0x00000000) E: 3des-cbc 97cedcf1 644e8bbb c22b4e2c fa08a874 01abcdef 211ad19e A: hmac-sha1 1ab3e79d 3fd924a0 01abcdef 6c9ac89a 01abcdef seq=0x00000000 replay=4 flags=0x00000000 state=mature created: Oct 2 09:22:44 2018 current: Oct 2 10:39:21 2018 diff: 4597(s) hard: 28800(s) soft: 23040(s) last: Oct 2 09:22:45 2018 hard: 0(s) soft: 0(s) current: 84(bytes) hard: 0(bytes) soft: 0(bytes) allocated: 1 hard: 0 soft: 0 sadb_seq=0 pid=3764 refcnt=0
In
tcpdump kann es hilfreich sein
, sich die Logik zum Herstellen einer Verbindung anzusehen. Hier sehen Sie auch die Phasen des Verbindungsaufbaus und des bereits an ESP
verschlüsselten Datenverkehrs. Natürlich gibt es Techniken, um es zu entschlüsseln, aber normalerweise reicht diese Schlussfolgerung bereits aus.
root @ localhost: ~ # tcpdump -i eth1 host 10.0.255.1 18:01:06.409631 IP 10.0.1.1.500 > 10.0.255.1.500: isakmp: phase 1 I ident 18:01:06.439276 IP 10.0.255.1.500 > 10.0.1.1.500: isakmp: phase 1 R ident 18:01:06.440840 IP 10.0.1.1.500 > 10.0.255.1.500: isakmp: phase 1 I ident 18:01:06.475244 IP 10.0.255.1.1.500 > 10.0.1.1.500: isakmp: phase 1 R ident 18:01:06.477032 IP 10.0.1.1.500 > 10.0.255.1.500: isakmp: phase 1 I ident[E] 18:01:06.487785 IP 10.0.255.1.500 > 10.0.1.1.500: isakmp: phase 1 R ident[E] 18:01:06.488048 IP 10.0.1.1.500 > 10.0.255.1.500: isakmp: phase 2/others I inf[E] 18:01:07.412451 IP 10.0.1.1.500 > 10.0.255.1.500: isakmp: phase 2/others I oakley-quick[E] 18:01:07.465363 IP 10.0.255.1.500 > 10.0.1.1.500: isakmp: phase 2/others R oakley-quick[E] 18:01:07.465940 IP 10.0.1.1.500 > 10.0.255.1.500: isakmp: phase 2/others I oakley-quick[E] 18:01:08.467373 IP 10.0.1.1 > 10.0.255.1: ESP(spi=0x7aabfa82,seq=0x1), length 116 18:01:08.480141 IP 10.0.255.1 > 10.0.1.1: ESP(spi=0x0386f867,seq=0x1), length 116
Wenn Sie eine Remoteverbindung über SSH herstellen, ist es praktisch, tcpdump im Hintergrund auszuführen, um nicht viele Fenster zu erstellen:
root@localhost: ~# tcpdump -i eth1 -w ipsec.pcap esp &
Wir fangen an zu pingen, telnet, netcat ...
root@localhost: ~# killall tcpdump
root@localhost: ~# tcpdump -vr ipsec.pcap
Auch in den Protokollen können Sie den erfolgreichen Status der Verbindung sehen. Es zeigt den erfolgreichen Aufbau beider Phasen von IPSec.
root @ localhost: ~ # cat /var/log/daemon.log Oct 3 17:53:26 vm22433 racoon: INFO: IPsec-SA request for 10.0.255.1 queued due to no phase1 found. Oct 3 17:53:26 vm22433 racoon: INFO: initiate new phase 1 negotiation: 10.0.1.1[500]<=>10.0.255.1[500] Oct 3 17:53:26 vm22433 racoon: INFO: begin Identity Protection mode. Oct 3 17:53:26 vm22433 racoon: INFO: received Vendor ID: CISCO-UNITY Oct 3 17:53:26 vm22433 racoon: INFO: received Vendor ID: DPD Oct 3 17:53:26 vm22433 racoon: INFO: received Vendor ID: draft-ietf-ipsra-isakmp-xauth-06.txt Oct 3 17:53:26 vm22433 racoon: INFO: ISAKMP-SA established 10.0.1.1[500]-10.0.255.1[500] spi:ebddc300af62ae42:abcdef0123 Oct 3 17:53:27 vm22433 racoon: INFO: initiate new phase 2 negotiation: 10.0.1.1[500]<=>10.0.255.1[500] Oct 3 17:53:27 vm22433 racoon: INFO: received RESPONDER-LIFETIME: 4608000 kbytes Oct 3 17:53:27 vm22433 racoon: WARNING: attribute has been modified. Oct 3 17:53:27 vm22433 racoon: INFO: IPsec-SA established: ESP/Tunnel 10.0.1.1[500]->10.0.255.1[500] spi=238677(0xe39eabc) Oct 3 17:53:27 vm22433 racoon: INFO: IPsec-SA established: ESP/Tunnel 10.0.1.1[500]->10.0.255.1500] spi=7204011111(0x44b4aaa)
Das ist alles. Es müssen noch alle erforderlichen Manipulationen zum Start hinzugefügt werden, und Sie können mit der Integration von Anwendungen beginnen.
PS: Eine Aufforderung, alle Fehler oder Ungenauigkeiten im Artikel per persönlicher Nachricht zu melden. Wenn ich den Artikel optimiere, sehen die Kommentare albern aus.