[LINUX] Construction VPN simple de la passerelle IPsec avec Ubuntu 20.04 et Raspberry Pi ―― 1. StrongSwan introduit

Hypothèses et préparatifs

Article sur la construction du serveur Linux

La dernière fois, j'ai construit une passerelle IPsec avec la compilation source StrongSwan avec CentOS 8 + Raspeye openSUSE. J'ai essayé de le faire avec Ubuntu 20.04 et Raspberry Pi OS (˶ ・ ᴗ ・) ੭⚐⚑

environnement

--Programme IPST: StrongSwan 5.9.0 (compilation des sources) --Récepteur de négociation IPST: Raspberry Pi 3B + / Raspberry Pi OS (version 2020/08) (armhf (v7), 32 bits)

supposition

Conditions du serveur

Adresse IP et schéma de construction du réseau

--Passerelle d'origine de la négociation IPTI (à droite de la figure ci-dessous, Ubuntu 20.04):

Fonctions et versions pour télécharger et installer individuellement les packages (à partir de septembre 2020)

Les autres packages requis sont installés à l'aide des commandes de package standard de la distribution (dnf, apt, etc.) et n'ont pas besoin d'être téléchargés individuellement.

Pour le téléchargement, vous pouvez accéder au site officiel, le télécharger à partir de là et le transférer par FTP, ou vous pouvez l'obtenir avec wget si vous connaissez l'URL du fichier à télécharger, mais la méthode d'acquisition est omise.

Procédure de travail

Préparation

Installer les fonctions de décompression make, cmake et package

Installez chaque distribution avec la machine virtuelle Hyper-V et Raspeye (la compilation source est la même pour les deux)

Ubuntu20.04(Hyper-V/x64)


# apt-get -y install make cmake tar bzip2

RaspberryPiOS(2020.08)


# apt-get -y install make cmake tar bzip2

Installation du compilateur GCC et C ++

Ubuntu20.04(Hyper-V/x64)


# apt-get -y install gcc build-essential

RaspberryPiOS(2020.08)


# apt-get -y install gcc build-essential

installation de la source zlib

J'ai installé le zlib avec l'emplacement par défaut. La compilation source est la même pour les machines virtuelles Hyper-V et Raspeye

# cd [Répertoire où se trouvent les fichiers d'archive zlib]
# tar zxvf zlib-1.2.11.tar.gz
# cd zlib-1.2.11/
# ./configure
# make
# make install

Activer le transfert IP

Le transfert IP doit être activé pour fonctionner comme une passerelle IPsec, alors activez-le. Il semble qu'il soit nécessaire de l'ajouter au fichier de configuration sysctl.d et de le charger s'il s'agit d'une commande (openSUSE est gentiment facile à configurer avec YaST même à partir de SSH)

# cat /proc/sys/net/ipv4/ip_forward
0
# vi /etc/sysctl.d/01-ipv4fwd.conf

conf:/etc/sysctl.d/01-ipv4fwd.conf


# Controls IP packet forwarding
net.ipv4.ip_forward = 1

Extension des adaptateurs réseau dans la zone VPN

Pour la machine virtuelle Hyper-V et le Raspberry Pi, ** Éteignez l'alimentation une fois ** pour activer le transfert IP + ajoutez un adaptateur réseau. Dans mon cas, Raspai a ajouté un adaptateur LAN filaire pour VPN via USB, et Hyper-V a ajouté un adaptateur réseau dans les paramètres.

Après l'expansion, vérifiez si "eth1" est ajouté, mais bien sûr, l'adresse IP n'a pas encore été attribuée.

# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether [Adresse MAC de l'adaptateur réseau depuis le début] brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.18/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 [Adresse IPv6 de la carte réseau depuis le début] scope global temporary dynamic
       valid_lft 14043sec preferred_lft 12243sec
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether [Adresse MAC de l'adaptateur réseau d'extension] brd ff:ff:ff:ff:ff:ff
    inet6 [Adresse IPv6 de l'adaptateur réseau d'extension] scope link noprefixroute
       valid_lft forever preferred_lft forever

# ip route

default via 192.168.1.1 dev eth0 proto static metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.18 metric 100

Après le redémarrage, la commande est utilisée pour activer le transfert IP, vérifiez donc s'il est activé (ip_forward vaut 1).

# cat /proc/sys/net/ipv4/ip_forward
1

# sysctl --system
…(Omission)
* Applying /etc/sysctl.d/01-ipv4fwd.conf ...
net.ipv4.ip_forward = 1
…(Omission)

Installez les packages requis pour compiler StrongSwan avec la commande de package standard de distribution

Remarque: Si vous ne l'exécutez pas même si c'est gênant, vous obtiendrez une erreur indiquant qu'il n'y a pas de paquet et la compilation sera arrêtée (´ • ω • ̥`)

Ubuntu20.04(Hyper-V/x64)


# apt-get -y install libgmp-dev libssl-dev

RaspberryPiOS(2020.08)


# apt-get -y install libgmp-dev libssl-dev

Installation de la compilation source StrongSwan 5.9.0

Commun aux machines virtuelles Hyper-V et à Raspeye. Ce processus a pris un certain temps (surtout avec le Raspberry Pi, cela a pris 20-30 minutes)

configurer et faire

# cd [strongswan-5.9.0.tar.Répertoire où se trouve gz]
# tar xvzf strongswan-5.9.0.tar.gz
# cd strongswan-5.9.0/
# ./configure --prefix=/usr --sysconfdir=/etc --enable-openssl
# make
# make install

Si vous pouvez compiler sans erreur, l'installation est terminée ♪ (\ * ˘︶˘ \ *) ...: \ * ♡

Préférences Strong Swan

Lorsque StrongSwan est installé par compilation source, le fichier de configuration est stocké dans /etc/ipsec.conf et les paramètres de connexion IPsec y sont définis.

[Paramètres de base d'Apache]
# vi /etc/ipsec.conf

Du côté qui établit IPsec (celui qui envoie l'établissement), oui, d'abord, installez Ubuntu 20.04 d'Hyper-V. Comme décrit dans la section "Conditions du serveur", du côté machine Hyper-V, votre adresse IP sera 192.168.1.18 et le partenaire d'établissement Raspberry Pi sera 192.168.1.22, alors écrivez la paire dans le fichier de configuration.

"Left" écrit les informations de la personne qui négocie l'établissement, et "right" écrit les informations de la personne à établir (à partir du manuel officiel StrongSwan / ConnSection)))

Ubuntu20.04(Hyper-V/x64)


…
#Ajoutez ce qui suit
conn [Nom distinctif Exemple: linux-2-linux]
      authby=secret
      auto=start				#Envoyer des négociations IPsec
      closeaction=restart
      dpdaction=restart
      left=192.168.1.18			#à gauche se trouve votre propre passerelle IPsec
      leftid=192.168.1.18		#ID qui vous identifie pour négocier IPsec
      leftsubnet=192.168.5.0/24
      right=192.168.1.22		#à droite est la passerelle IPsec de l'autre partie
      rightid=192.168.1.22		#ID qui identifie le partenaire de négociation IPsec
      rightsubnet=192.168.2.0/24
…

Au fait, pour l'ID, j'ai utilisé l'adresse IP pour plus de simplicité dans mon cas, mais une chaîne de caractères est également OK. Et comme leftsubnet et rightsubnet sont les zones VPN dont vous et l'autre partie êtes responsables, leftsubnet est votre propre zone VPN, donc 192.168.5.0/24, et rightsubnet est la zone VPN Raspeye de l'autre partie, donc 192.168.2.0/ J'ai mis 24.

Ensuite, définissez la tarte aux râpes. Comme décrit dans la section "Conditions du serveur", votre adresse IP à établir sera 192.168.1.22, et Hyper-V Ubuntu 20.04 de l'autre partie à établir sera 192.168.1.18, donc Hyper-V (Ubuntu 20.04) ) Est écrit dans le fichier de paramètres.

RaspberryPiOS(2020.08)


#Ajoutez ce qui suit
conn [Nom distinctif Exemple: linux-2-linux]
      authby=secret
      auto=add				#Recevoir les négociations IPsec
      closeaction=clear
      dpdaction=clear
      left=192.168.1.22
      leftid=192.168.1.22
      leftsubnet=192.168.2.0/24
      right=192.168.1.18
      rightid=192.168.1.18
      rightsubnet=192.168.5.0/24

Le fait est qu'en définissant auto = add, il est défini du côté réception de la négociation d'établissement IPsec et le contenu de gauche et de droite est inversé. De cette façon, si les noms distinctifs (la chaîne après conn) correspondent, vous pouvez établir une connexion IPsec.

Par défaut, StrongSwan utilise la méthode PSK et utilise la méthode de chiffrement AES / SHA en standard. S'il est nécessaire de définir d'autres méthodes de chiffrement, définissez-les séparément, mais omettez-les ici.

En passant, StrongSwan à ce stade est compatible NAT-T, et IPsec peut être appliqué au NAT (dans le passé, IPsec ne pouvait pas être appliqué au NAT), donc NAT est utilisé sur Internet. Il semble que même l'espace utilisé peut communiquer sur Internet avec un VPN construit avec StrongSwan (même si je ne l'ai jamais expérimenté ...).

[Paramètres de clé Strong Swan]
# vi /etc/ipsec.secrets

/etc/ipsec.secrets


…
: PSK "[Chaîne appropriée: Exemple ... kazumi75kitty]"
…

Puisque nous utilisons la méthode PSK par défaut, nous la rendrons identique pour les machines virtuelles Hyper-V et Raspeye.

Lancez Strong Swan

Créer et activer le script de démarrage du service

Maintenant que nous avons les paramètres d'environnement nécessaires pour StrongSwan, nous aimerions pouvoir le démarrer. Puisque le script de démarrage est Systemd, créez-le dans / etc / systemd / system

# cd /etc/systemd/system
# vi strongswan.service

strongswan.service


[Unit]
Description=strongSwan

[Service]
Type=forking
ExecStart=/usr/sbin/ipsec start
ExecStop=/usr/sbin/ipsec stop

[Install]
WantedBy=multi-user.target

Je n'entrerai pas dans les détails des scripts Systemd ici, mais dans strongSwan, le type de service est forking car le démarrage et l'arrêt se font en arrière-plan à partir du processus parent.

paramètres ufw

ufw accepte également IPsec, tout comme firewalld. Les ports utilisés par ipsec sont les numéros de port TCP / UDP 500/4500 et le protocole AH / ESP. Cependant, avec les paramètres ici, il ne spécifie pas la limitation interne de 192.168.1.0/24 pour le tunneling, et si les paquets IPsec peuvent passer d'autres segments de réseau, ils peuvent être reçus. Cependant, si vous prenez des mesures jusque-là, ce sera compliqué, donc pour des raisons de simplicité, nous n'autoriserons qu'IPsec.

# ufw allow 500
# ufw allow 4500
# ufw allow to any proto ah
# ufw allow to any proto esp
# ufw status numbered

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 30303/tcp                  ALLOW IN    192.168.1.0/24
[ 2] 5900:5999/tcp              ALLOW IN    192.168.1.0/24
[ 3] 500                        ALLOW IN    Anywhere
[ 4] 4500                       ALLOW IN    Anywhere
[ 5] Anywhere/esp               ALLOW IN    Anywhere/esp
[ 6] Anywhere/ah                ALLOW IN    Anywhere/ah
[ 7] 500 (v6)                   ALLOW IN    Anywhere (v6)
[ 8] 4500 (v6)                  ALLOW IN    Anywhere (v6)
[ 9] Anywhere/esp (v6)          ALLOW IN    Anywhere/esp (v6)
[10] Anywhere/ah (v6)           ALLOW IN    Anywhere/ah (v6)

Cette commande est commune aux machines virtuelles Hyper-V et à Raspeye.

Démarrer et vérifier le fonctionnement

Commençons. Commencez toujours par activer Activer et confirmez que l'état est «Actif» et «En cours d'exécution».

** Tout d'abord, StrongSwan est démarré du côté qui reçoit la négociation d'établissement IPsec, puis il est démarré dans l'ordre du côté qui envoie l'établissement IPsec **. Ici, après le démarrage de StrongSwan de Raspeye, StrongSwan de la machine virtuelle Hyper-V est démarré.

# systemctl start strongswan
# systemctl enable strongswan
# systemctl status strongswan

Vérifiez que la machine virtuelle Hyper-V et Raspeye sont définies sur "Actif" et "En cours d'exécution", et enfin vérifiez si le tunneling IPsec est établi.

Ubuntu20.04(Hyper-V/x64)


# /usr/sbin/ipsec status
Security Associations (1 up, 0 connecting):
linux-2-linux[1]: ESTABLISHED 2 minutes ago, 192.168.1.18[192.168.1.18]...192.168.1.22[192.168.1.22]
linux-2-linux{1}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: ********_i ********_o
linux-2-linux{1}:   192.168.5.0/24 === 192.168.2.0/24

# ip xfrm policy
src 192.168.5.0/24 dst 192.168.2.0/24
        dir out priority 375423 ptype main
        tmpl src 192.168.1.18 dst 192.168.1.22
                proto esp spi 0x******** reqid 1 mode tunnel
src 192.168.2.0/24 dst 192.168.5.0/24
        dir fwd priority 375423 ptype main
        tmpl src 192.168.1.22 dst 192.168.1.18
                proto esp reqid 1 mode tunnel
src 192.168.2.0/24 dst 192.168.5.0/24
        dir in priority 375423 ptype main
        tmpl src 192.168.1.22 dst 192.168.1.18
                proto esp reqid 1 mode tunnel

RaspberryPiOS(2020.08)


# /usr/sbin/ipsec status
Security Associations (1 up, 0 connecting):
linux-2-linux[1]: ESTABLISHED 2 minutes ago, 192.168.1.22[192.168.1.22]...192.168.1.18[192.168.1.18]
linux-2-linux{1}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: ********_i ********_o
linux-2-linux{1}:   192.168.2.0/24 === 192.168.5.0/24

# ip xfrm policy
src 192.168.2.0/24 dst 192.168.5.0/24
        dir out priority 375423 ptype main
        tmpl src 192.168.1.22 dst 192.168.1.18
                proto esp spi 0x******** reqid 1 mode tunnel
src 192.168.5.0/24 dst 192.168.2.0/24
        dir fwd priority 375423 ptype main
        tmpl src 192.168.1.18 dst 192.168.1.22
                proto esp reqid 1 mode tunnel
src 192.168.5.0/24 dst 192.168.2.0/24
        dir in priority 375423 ptype main
        tmpl src 192.168.1.18 dst 192.168.1.22
                proto esp reqid 1 mode tunnel

Le tunnel IPsec a été établi avec succès avec les machines virtuelles Hyper-V et la tarte aux râpes (˶ ・ ᴗ ・) ੭⚐⚑

Bonus (spécifiez une chaîne de caractères telle que domaine pour l'ID de ipsec.conf)

Dans le fichier de configuration StrongSwan /etc/ipsec.conf, même si vous utilisez une chaîne de caractères au lieu d'une adresse IP avec leftid ou rightid, l'écran de capture sera affiché (\ * ´꒳` \ *)

Peut-être que celui-ci est plus facile à comprendre. L'écran est CentOS + openSUSE, mais je pense que le fonctionnement est le même pour Ubuntu etc. Dans l'exemple, "raspberry pi" et "test uniquement @ kazumi-jam" sont distingués. ipsec.confのIDに文字列やドメインを指定する

Supplément (lorsque le tunnel IPsec passe par NAT)

Je n'ai pas encore d'image facile à comprendre, mais pour les adresses IP gauche et droite dans ipsec.conf, entrez votre propre adresse IP et l'adresse IP de l'autre partie après la conversion NAT telle que vue de vous. À ce moment-là, il est nécessaire que l'identifiant gauche et l'identifiant droit correspondent par paires.

Exemple: 192.168.1.0/24 → Lorsque 192.168.120.0/28 est partitionné par NAT

IPsecGW-1 (dans 192.168.1.0/24)  left=192.168.1.22  leftid="gw1"  right=192.168.1.18  rightid="gw2" IPsecGW-2 (dans 192.168.120.0/28)  left=192.168.120.1  leftid="gw2"  right=192.168.120.3  rightid="gw1"

De cette façon, IPsec peut être établi en entrant une adresse IP qui prend en compte NAT, mais je posterai plus de détails plus tard.

la prochaine fois

Avec l'introduction de Strong Swan, la construction de la passerelle IPsec est terminée sur Ubuntu 20.04 sur Raspberry Pi et Hyper-V ainsi que sur CentOS. Ensuite, même sous Ubuntu, connectez le client et le serveur au VPN connecté à la passerelle IPsec et essayez de vous connecter l'un à l'autre (˶˙ᵕ˙˶)

Recommended Posts

Construction VPN simple de la passerelle IPsec avec Ubuntu 20.04 et Raspberry Pi ―― 1. StrongSwan introduit
Construction VPN simple de la passerelle IPsec avec CentOS 8 et openSUSE (Raspberry Pi) --1 Introduction de StrongSwan
Construction VPN simple de la passerelle IPsec avec Ubuntu 20.04 et Raspberry Pi --2 Confirmation de connexion VPN StrongSwan
Construction de VPN de passerelle IPsec avec CentOS 8 et openSUSE (Raspberry Pi) --2 Confirmation de connexion VPN StrongSwan
Construire un serveur VPN avec Raspberry Pie
Ubuntu 20.04 sur raspberry pi 4 avec OpenCV et utilisation avec python
Production de système de contrôle de température avec tarte aux framboises et ESP32 (1)
Affichage graphique de la consommation électrique des ménages avec 3GPI et Raspeye
Surveillance des animaux avec Rekognition et Raspberry pi
Créez un convertisseur Ethernet LAN sans fil et un routeur simple avec Raspberry Pi
Production d'un système de contrôle de température avec tarte aux framboises et ESP32 (2) Production d'un appareil de transmission
J'ai tweeté l'éclairement de la pièce avec Raspberry Pi, Arduino et un capteur optique
J'ai essayé de créer un environnement Ubuntu 20.04 LTS + ROS2 avec Raspberry Pi 4
MQTT Radicon Car avec Arduino et Raspberry
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Obtenez la température et l'humidité avec DHT11 et Raspberry Pi
Mesurer la température du processeur de Raspeye avec Python
Points clés pour créer LiveUSB dans les "Paramètres de connexion VPN et remmina" d'Ubuntu (version provisoire)
Création d'un environnement distribué avec la série Raspberry PI (Partie 4: Création d'un serveur NFS et importation d'un système d'exploitation client)
Enregistrez la température et l'humidité avec systemd sur Raspberry Pi
Apprentissage automatique avec Raspberry Pi 4 et Coral USB Accelerator
IoT facile pour démarrer avec Raspeye et MESH
Détecter l'état de port du masque avec OpenCV et Raspberry Pi
Prenez la valeur du thermo-hygromètre SwitchBot avec Raspberry Pi
Mesurez la température et l'humidité avec Raspberry Pi3 et visualisez avec Ambient
Changer les valeurs du thermo-hygromètre Bot avec Raspberry Pi
Installation de Docker sur Raspberry Pi et L Chika
Résoudre les problèmes liés à l'installation d'OpenCV sur Raspberry Pi et à la capture
Exploitons GPIO de Raspeye avec Python CGI
Créez facilement un TweetBot qui vous informe de la température et de l'humidité avec Raspberry Pi + DHT11.
Création d'un environnement distribué avec la série Raspberry PI (Partie 7: configuration de la route tftp et test de démarrage pour chaque tarte à la râpe)
GPGPU avec Raspberry Pi
DigitalSignage avec Raspberry Pi
Introduction facile au piratage domestique avec Raspberry Pi et discord.py
Créez une caméra de surveillance WEB avec Raspberry Pi et OpenCV
Débutant Python s'ouvre et se ferme avec Raspberry Pi
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
Créez des jeux LCD (16x2) avec Raspberry Pi et Python
J'ai essayé de connecter Raspeye et conect + avec l'API Web
Mesurez et comparez les températures avec Raspberry Pi et générez automatiquement des graphiques
Construction d'un environnement de développement Cortex-M pour TOPPERS utilisant Raspeye
Reconnaissance d'image des déchets avec Edge (Raspberry Pi) à partir de zéro connaissance en utilisant AutoML Vsion et TPU