no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | linux:strongswan_vpn [2022/03/03 21:18] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Strongswan VPN ====== | ||
+ | Strongswan ist eine Opensource VPN-Server Lösung. | ||
+ | Die Software ist in den Ubuntu-Quellen standardmäßig enthalten. | ||
+ | Das es verschiedene Konfigurationsmöglichkeiten gibt, werden hier nur einige aufgeführt. | ||
+ | Weitere Konfigurationen sind in der [[http:// | ||
+ | ===== Installation ===== | ||
+ | Installieren kann man Strongswan ganz einfach über | ||
+ | <code bash>apt install strongswan</ | ||
+ | |||
+ | ===== IKEv1 IPSEC Authentifizierung mit X.509 Zertifikaten und User-Login ===== | ||
+ | Hier erfolgt die Authentifizierung über Zertifikate und einer Benutzer/ | ||
+ | Dafür werden mehrere Zertifikate benötigt. | ||
+ | * CA Zertifikat | ||
+ | * VPN-Gateway Zertifikat | ||
+ | * Host/User Zertifikate | ||
+ | |||
+ | ==== CA mit RSA kodierten Zertifikaten ==== | ||
+ | Ein RSA kodiertes Zertifikat im PEM Format erstellen. | ||
+ | Wer will kann die Zertifikate mit '' | ||
+ | In folgendem Beispiel wird, das im Strongswan, eingebaute tool '' | ||
+ | |||
+ | Wenn noch keine CA (**C**ertificate **A**uthority) vorhanden ist, kann man sich hiermit eine erstellen. | ||
+ | Alle Zertifikate sind dann, durch die eigene CA auf dem VPN-Server, selbst signiert. | ||
+ | |||
+ | Zuerst wird ein 2048 bit langer, RSA basierter, privater Schlüssel für die CA erstellt. | ||
+ | <code bash> | ||
+ | |||
+ | Mit dem Schlüssel erstellt man sich das CA Zertifikat. | ||
+ | Hier mit folgenden möglichen Angaben: | ||
+ | |||
+ | ^ Parameter ^ Beschreibung ^ Definition ^ | ||
+ | | --dn | Distinguished Name | C= [Countryname: | ||
+ | | --lifetime | Laufzeit | Gültigkeitszeitraum des Zertifikates | | ||
+ | | --san | subjectAltName | Hier wählt man am besten den FQDN des IPSec-Gateways \\ Beim Peer kann hier auch dessen E-Mailadresse angegeben werden | | ||
+ | | --outform | output format | Hier wählt man als Format " | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | Nun können Zertifikate für das VPN-Gateway und für VPN-Clients erstellt werden. | ||
+ | |||
+ | ==== VPN-Gateway Zertifikat ==== | ||
+ | Zuerst wieder den privaten Schlüssel für das VPN-Gateway erstellen. | ||
+ | <code bash> | ||
+ | |||
+ | Danach die Zertifikatsanfrage an die CA stellen (**Den gleichen " | ||
+ | <code bash> | ||
+ | |||
+ | Jetzt das Zertifikat ausstellen (**Den gleichen " | ||
+ | <code bash> | ||
+ | |||
+ | ==== Host/User Zertifikate ==== | ||
+ | Nun wie oben beschrieben die Zertifikate und Schlüssel für VPN-Clients ausstellen (**Den gleichen " | ||
+ | <code bash> | ||
+ | <code bash> | ||
+ | <code bash> | ||
+ | |||
+ | ==== Zertifikate Sperren ==== | ||
+ | Wenn ein Zertifikat wiederrufen werden muß (z. B. weil der Host/User nicht mehr gültig ist) dann erstellt man sich " | ||
+ | <code bash> | ||
+ | |||
+ | CRLs werden in regelmäßigen Abständen geprüft. | ||
+ | |||
+ | Anzeigen welche Zertifikate sich aktuell in der CRL befinden: | ||
+ | <code bash> | ||
+ | |||
+ | Wenn ein Zertifikat entsperren werden soll, löscht man dieses aus ''/ | ||
+ | Danach abwarten bis strongswan die CRLS überprüft hat. | ||
+ | Für ungeduldige Admins, strongswan neustarten. | ||
+ | <code bash> | ||
+ | |||
+ | ==== Strongswan Konfiguration ==== | ||
+ | '' | ||
+ | < | ||
+ | |||
+ | # basic configuration | ||
+ | |||
+ | |||
+ | config setup | ||
+ | |||
+ | conn %default | ||
+ | left=%defaultroute | ||
+ | leftauth=pubkey | ||
+ | leftid="< | ||
+ | leftcert=< | ||
+ | leftrsasigkey=%cert | ||
+ | leftfirewall=yes | ||
+ | rightauth=pubkey | ||
+ | rightauth2=xauth | ||
+ | ikelifetime=4m | ||
+ | keylife=2m | ||
+ | rekeymargin=1m | ||
+ | keyingtries=1 | ||
+ | rekeyfuzz=75% | ||
+ | keyexchange=ikev1 | ||
+ | type=tunnel | ||
+ | compress=yes | ||
+ | ike=3des-sha1-modp1024 | ||
+ | esp=3des-sha1-modp1024 | ||
+ | dpdaction=clear | ||
+ | dpddelay=30s | ||
+ | dpdtimeout=120s | ||
+ | auto=add | ||
+ | |||
+ | conn < | ||
+ | leftsubnet=0.0.0.0/ | ||
+ | lefthostaccess=yes | ||
+ | rightcert=< | ||
+ | rightrsasigkey=%cert | ||
+ | rightid="< | ||
+ | rightsourceip=< | ||
+ | rightsubnet=0.0.0.0/ | ||
+ | right=%any | ||
+ | rekey=no | ||
+ | auto=add</ | ||
+ | |||
+ | ==== Authentifizierung Konfiguration ==== | ||
+ | '' | ||
+ | < | ||
+ | # authentication. | ||
+ | |||
+ | # RSA private key for this host, authenticating it to any other host | ||
+ | # which knows the public part. Suitable public keys, for ipsec.conf, DNS, | ||
+ | # or configuration of other implementations, | ||
+ | # with "ipsec showhostkey" | ||
+ | |||
+ | # this file is managed with debconf and will contain the automatically created private key | ||
+ | #include / | ||
+ | |||
+ | : RSA < | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Shrew-Client Konfiguration ==== | ||
+ | Als VPN-Client kann Shrew Soft VPN von [[https:// | ||
+ | |||
+ | Shrew ist in den Ubuntu Softwarequellen enthalten. | ||
+ | <code bash>apt install ike-qtgui</ | ||
+ | |||
+ | Angaben zu Zertifikaten (die langen Schlüssel) sind hier nur Beispiele. | ||
+ | Zertifikate sollten in der GUI selbst des VPN-Clients eingerichtet werden. | ||
+ | < | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | n: | ||
+ | s: | ||
+ | b: | ||
+ | s: | ||
+ | b: | ||
+ | s: | ||
+ | b: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | s: | ||
+ | |||
+ | ==== Shrew in Dash-Leiste ==== | ||
+ | Wer Shrew über die Dash-Startleiste öffnen möchte, der kopiert zunächst das Icon des Programms. | ||
+ | <code bash>cp source/ | ||
+ | Danach erstellt man sich eine " | ||
+ | <code bash>vi / | ||
+ | <code bash> | ||
+ | Encoding=UTF-8 | ||
+ | Name=Shrew IPSEC VPN-Client | ||
+ | Name[de]=Shrew IPSEC QT4 VPN-Client | ||
+ | Comment=Connects IPSEC VPNs | ||
+ | Comment[de]=IPSEC VPN Verbindungen verbinden | ||
+ | GenericName=IPSEC VPN Client | ||
+ | GenericName[de]=IPSEC-VPN-Anwendung | ||
+ | Keywords=vpn; | ||
+ | Keywords[de]=vpn; | ||
+ | Exec=qikea | ||
+ | Terminal=false | ||
+ | X-MultipleArgs=false | ||
+ | Type=Application | ||
+ | Icon=/ | ||
+ | Categories=Application; | ||
+ | StartupNotify=true</ | ||
+ | |||
+ | ===== L2TP / IPSEC ===== | ||
+ | L2TP/IPSEC VPN eingerichten (Quelle: [[https:// | ||
+ | |||
+ | ==== Server ==== | ||
+ | <code bash> | ||
+ | |||
+ | * IPSEC konfigurieren ''/ | ||
+ | authby=secret | ||
+ | type=transport | ||
+ | keyexchange=ikev1 | ||
+ | left=< | ||
+ | |||
+ | leftprotoport=17/ | ||
+ | right=%any | ||
+ | rightprotoport=17/ | ||
+ | auto=add | ||
+ | ike=aes128-sha1-modp2048, | ||
+ | dpddelay=15 | ||
+ | dpdtimeout=45 | ||
+ | dpdaction=clear | ||
+ | esp=aes128-sha1-modp2048, | ||
+ | rekey=no | ||
+ | ikelifetime=3600 | ||
+ | keylife=3600</ | ||
+ | | ||
+ | * IPSEC-PSK konfigurieren ''/ | ||
+ | |||
+ | * xl2tpd konfigurieren ''/ | ||
+ | [global] | ||
+ | ipsec saref = yes | ||
+ | saref refinfo = 30 | ||
+ | ;debug avp = yes | ||
+ | ;debug network = yes | ||
+ | ;debug state = yes | ||
+ | ;debug tunnel = yes | ||
+ | [lns default] | ||
+ | ip range = < | ||
+ | local ip = < | ||
+ | refuse pap = yes | ||
+ | require authentication = yes | ||
+ | ;ppp debug = yes | ||
+ | pppoptfile = / | ||
+ | length bit = yes</ | ||
+ | |||
+ | * PPP konfigurieren ''/ | ||
+ | logfd 2 | ||
+ | logfile / | ||
+ | refuse-mschap-v2 | ||
+ | refuse-mschap | ||
+ | ms-dns 8.8.8.8 | ||
+ | ms-dns 8.8.4.4 | ||
+ | asyncmap 0 | ||
+ | auth | ||
+ | crtscts | ||
+ | idle 1800 | ||
+ | mtu 1200 | ||
+ | mru 1200 | ||
+ | lock | ||
+ | hide-password | ||
+ | local | ||
+ | #debug | ||
+ | name l2tpd | ||
+ | proxyarp | ||
+ | lcp-echo-interval 30 | ||
+ | lcp-echo-failure 4</ | ||
+ | |||
+ | * Benutzer konfigurieren ''/ | ||
+ | < | ||
+ | |||
+ | * Daemons neustarten: <code bash> | ||
+ | systemctl restart strongswan</ | ||
+ | |||
+ | ==== Clients ==== | ||
+ | * Ubuntu | ||
+ | * <code bash>apt install network-manager-l2tp-gnome</ | ||
+ | * konfigurieren wie folgt | ||
+ | * Name: < | ||
+ | * Gateway: < | ||
+ | * Benutzername: | ||
+ | * IPsec Settings: | ||
+ | * Pre-shared key: < | ||
+ | * Phase1 Algorithms: '' | ||
+ | * Phase2 Algorithms: '' | ||
+ | * PPP Settings | ||
+ | * nur folgende Methoden: '' | ||
+ | * Haken setzen bei " | ||
+ | * Sicherheit: " | ||
+ | * sonstige Häckchen so lassen | ||
+ | |||
+ | ===== Port-/ | ||
+ | Damit das Subnetz hinter dem VPN-Gateway erreicht werden kann, müssen folgende Einstellungen vorgenommen werden. | ||
+ | * IP-Forwarding konfigurieren: | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | |||
+ | Danach sysctl reloaden | ||
+ | <code bash> | ||
+ | |||
+ | * NAT auf dem VPN-Gateway einrichten: < | ||
+ | * IPtables Regeln sichern: <code bash> | ||
+ | |||
+ | * folgende Ports als Weiterleitung auf dem Internet-Gateway hinzufügen: | ||
+ | |||
+ | ===== Troubleshooting ===== | ||
+ | * folgende Befehle können beim Troubleshooting helfen \\ < | ||
+ | ipsec listall | ||
+ | ipsec listcerts | ||
+ | ...</ | ||
+ | |||
+ | * rekeying im Strongswan ausschalten (Shrew mag das rekeying von einem VPN-Gateway nicht und übernimmt selbst dieses) | ||
+ | |||
+ | ==== Default Gateway Routen ==== | ||
+ | Wenn man sich mit dem VPN verbunden hat, lässt der Network-Manager eine neue Default Route erstellen. | ||
+ | Dadurch wird alles vom Client über das VPN geroutet. | ||
+ | Möchte man das nicht, möchte man also anstatt eines full tunneling ein split tunneling verwenden, so muss in den IPv4 Einstellungen der jew. | ||
+ | VPN-Verbindung der Haken bei "Diese Verbindung nur für Ressourcen in deren Netzwerk verwenden" | ||
+ | ggf auch diesen Befehl ausführen <code bash> | ||
+ | |||
+ | ==== DNS ==== | ||
+ | Generell wird der, in der VPN-Verbindung, | ||
+ | Dann wird auch das Default-GW neben dem Ursprünglichen GW auch auf die VPN-Verbindung gesetzt. | ||
+ | Hakt man die o.g. Funktion an, wird kein zusätzliches Default-GW erstellt. Dann wird auch der angegeben DNS server nicht verwendet. Das kann mit dem Befehl '' | ||
+ | Man sieht dann, dass die VPN-Verbindung (z.B. " | ||
+ | Setzt man nun die DNS-Search-Domain für die Verbindung, wird der DNS-Server jedes mal für die Verbindung gesetzt und Split-DNS verwendet. | ||
+ | Die Search-Domain kann man leider nicht in der Gui (zum Einrichten von VPNs) einstellen und muss dies per CLI-Befehl tun. | ||
+ | <code bash> | ||
+ | Nachdem man den VPN-Tunnel aufgebaut hat, ruft man nun '' |