IPIP IPsec VPN σήραγγα μεταξύ μηχανής Linux και Mikrotik πίσω από τον πάροχο NAT

Linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64)

  • Eth0 1.1.1.1/32 εξωτερική IP
  • Το ipip-ipsec0 192.168.0.1/30 θα είναι το τούνελ μας

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 εσωτερική IP από τον πάροχο. Η εξωτερική IP NAT του παρόχου είναι δυναμική.
  • Το ipip-ipsec0 192.168.0.2/30 θα είναι το τούνελ μας

Θα δημιουργήσουμε μια σήραγγα IPsec σε μια μηχανή Linux χρησιμοποιώντας το racoon. Δεν θα περιγράψω τις λεπτομέρειες, υπάρχει μια καλή άρθρο у vvpoloskin.

Εγκαταστήστε τα απαραίτητα πακέτα:

sudo install racoon ipsec-tools

Διαμορφώνουμε το racoon, θα λειτουργεί υπό όρους ως διακομιστής ipsec. Δεδομένου ότι το mikrotik στην κύρια λειτουργία δεν μπορεί να μεταδώσει ένα πρόσθετο αναγνωριστικό πελάτη και η εξωτερική διεύθυνση IP μέσω της οποίας συνδέεται στο Linux είναι δυναμική, η χρήση ενός προκοινοποιημένου κλειδιού (εξουσιοδότηση κωδικού πρόσβασης) δεν θα λειτουργήσει, καθώς ο κωδικός πρόσβασης πρέπει να αντιστοιχιστεί είτε με τη διεύθυνση IP του τον κεντρικό υπολογιστή σύνδεσης ή με το αναγνωριστικό.

Θα χρησιμοποιήσουμε εξουσιοδότηση χρησιμοποιώντας κλειδιά RSA.

Ο δαίμονας ρακούν χρησιμοποιεί κλειδιά σε μορφή RSA και το mikrotik χρησιμοποιεί τη μορφή PEM. Εάν δημιουργήσετε κλειδιά χρησιμοποιώντας το βοηθητικό πρόγραμμα plainrsa-gen που συνοδεύει το racoon, τότε δεν θα μπορείτε να μετατρέψετε το δημόσιο κλειδί για το Mikrotika σε μορφή PEM με τη βοήθειά του - μετατρέπεται μόνο προς μία κατεύθυνση: PEM σε RSA. Ούτε το openssl ούτε το ssh-keygen μπορούσαν να διαβάσουν το κλειδί που δημιουργήθηκε από το plainrsa-gen, επομένως η μετατροπή δεν μπορεί να πραγματοποιηθεί ούτε χρησιμοποιώντας αυτά.

Θα δημιουργήσουμε ένα κλειδί PEM χρησιμοποιώντας το openssl και στη συνέχεια θα το μετατρέψουμε για ρακούν χρησιμοποιώντας το plainrsa-gen:

#  Генерируем ключ
openssl genrsa -out server-name.pem 1024
# Извлекаем публичный ключ
openssl rsa -in server-name.pem -pubout > server-name.pub.pem
# Конвертируем
plainrsa-gen -i server-name.pem -f server-name.privet.key
plainrsa-gen -i server-name.pub.pem -f server-name.pub.key

Θα βάλουμε τα ληφθέντα κλειδιά στον φάκελο: /etc/racoon/certs/server. Μην ξεχάσετε να ορίσετε τον κάτοχο του χρήστη με το όνομα του οποίου εκκινείται ο δαίμονας του ρακούν (συνήθως root) σε 600 δικαιώματα.

Θα περιγράψω τη ρύθμιση του mikrotik κατά τη σύνδεση μέσω WinBox.

Ανεβάστε το κλειδί server-name.pub.pem στο mikrotik: Μενού “Files” - “Upload”.

Ανοίξτε την ενότητα "IP" - "IP sec" - καρτέλα "Κλειδιά". Τώρα δημιουργούμε κλειδιά - το κουμπί "Δημιουργία κλειδιού" και, στη συνέχεια, εξάγουμε το δημόσιο κλειδί mikrotika "Expor Pub. Key", μπορείτε να το κατεβάσετε από την ενότητα "Αρχεία", κάντε δεξί κλικ στο αρχείο - "Λήψη".

Εισάγουμε το δημόσιο κλειδί του racoon, "Εισαγωγή", στην αναπτυσσόμενη λίστα του πεδίου "Όνομα αρχείου" αναζητούμε τον server-name.pub.pem που κατεβάσαμε νωρίτερα.

Το δημόσιο κλειδί mikrotik πρέπει να μετατραπεί

plainrsa-gen -i mikrotik.pub.pem -f mikrotik.pub.key

και βάλτε το στον φάκελο /etc/racoon/certs, χωρίς να ξεχνάμε τον ιδιοκτήτη και τα δικαιώματα.

racoon config με σχόλια: /etc/racoon/racoon.conf

log info; # Уровень логирования, при отладке используем Debug или Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Адрес и порт, на котором будет слушать демон.
    isakmp_natt 1.1.1.1 [4500]; # Адрес и порт, на котором будет слушать демон для клиентов за NAT.
    strict_address; # Выполнять обязательную проверку привязки к указанным выше IP.
}

path certificate "/etc/racoon/certs"; # Путь до папки с сертификатами.

remote anonymous { # Секция, задающая параметры для работы демона с ISAKMP и согласования режимов с подключающимися хостами. Так как IP, с которого подключается Mikrotik, динамический, то используем anonymous, что разрешает подключение с любого адреса. Если IP у хостов статический, то можно указать конкретный адрес и порт.

    passive on; # Задает "серверный" режим работы демона, он не будет пытаться инициировать подключения.
    nat_traversal on; # Включает использование режима NAT-T для клиентов, если они за NAT. 
    exchange_mode main; # Режим обмена параметрами подключения, в данном случае ---согласование.
    my_identifier address 1.1.1.1; # Идентифицируем наш linux хост по его ip адресу.
    certificate_type plain_rsa "server/server-name.priv.key"; # Приватный ключ сервера.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Публичный ключ Mikrotik.

    proposal_check claim; # Режим согласования параметров ISAKMP туннеля. Racoon будет использовать значения подключающегося хоста (инициатора) для срока действия сессии                   и длины ключа, если его срок действия сессии больше, или длина его ключа короче, чем у инициатора. Если срок действия сессии короче, чем у инициатора, racoon использует собственное значение срока действия сессии и будет отправлять сообщение RESPONDER-LIFETIME.
    proposal { # Параметры ISAKMP туннеля.

        encryption_algorithm aes; # Метод шифрования ISAKMP туннеля.
        hash_algorithm sha512; # Алгоритм хеширования, используемый для ISAKMP туннеля.
        authentication_method rsasig; # Режим аутентификации для ISAKMP туннеля - по RSA ключам.
        dh_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана при согласовании ISAKMP туннеля.
        lifetime time 86400 sec; Время действия сессии.
    }

    generate_policy on; # Автоматическое создание ESP туннелей из запроса, пришедшего от подключающегося хоста.
}

sainfo anonymous { # Параметры ESP туннелей, anonymous - указанные параметры будут использованы как параметры по умолчанию. Для разных клиентов, портов, протоколов можно              задавать разные параметры, сопоставление происходит по ip адресам, портам, протоколам.

    pfs_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана для ESP туннелей.
    lifetime time 28800 sec; # Срок действия ESP туннелей.
    encryption_algorithm aes; # Метод шифрования ESP туннелей.
    authentication_algorithm hmac_sha512; # Алгоритм хеширования, используемый для аутентификации ESP туннелей.
    compression_algorithm deflate; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

mikrotik config

Επιστρέψτε στην ενότητα "IP" - "IPsec"

Καρτέλα "Προφίλ".
Παράμετρος
Αξία

Όνομα
Κατά την κρίση σας (από προεπιλογή)

Hash αλγόριθμος
sha512

Αλγόριθμος κρυπτογράφησης
aes-128

DH-Group
modp2048

Proposhal_check
ισχυρισμός

Διάρκεια ζωής
1η 00:00:00

NAT Traversal
αληθινό (επιλέξτε το πλαίσιο)

DPD
120

DPD Μέγιστη αποτυχία
5

Καρτέλα Peers
Παράμετρος
Αξία

Όνομα
Κατά την κρίση σας (εφεξής MyPeer)

Διεύθυνση
1.1.1.1 (μηχανήματα IP Linux)

Τοπική Διεύθυνση
10.0.0.2 (διεπαφή IP WAN mikrotik)

Προφίλ ⬇️
αθέτηση

Λειτουργία ανταλλαγής
κύριος

Παθητικός
ψευδής

Αποστολή INITIAL_CONTACT
αληθής

Καρτέλα πρότασης
Παράμετρος
Αξία

Όνομα
Κατά την κρίση σας (εφεξής καλούμενη MyPeerProposal)

Auth. Αλγόριθμοι
sha512

Encr. Αλγόριθμοι
aes-128-cbc

Διάρκεια ζωής
08:00:00

Ομάδα PFS
modp2048

Καρτέλα "Ταυτότητες".
Παράμετρος
Αξία

Ομότιμων
MyPeer

Atuh. Μέθοδος
κλειδί rsa

Κλειδί
mikrotik.privet.key

Απομακρυσμένο κλειδί
server-name.pub.pem

Ομάδα προτύπων πολιτικής
αθέτηση

Αλυσίδα Notrack
αδειάζω

Ο τύπος της ταυτότητάς μου
αυτόματη

Τύπος απομακρυσμένου αναγνωριστικού
αυτόματη

Ταίριασμα από
απομακρυσμένο αναγνωριστικό

Διαμόρφωση τρόπου λειτουργίας
αδειάζω

Δημιουργία Πολιτικής
Όχι.

Καρτέλα "Πολιτικές - Γενικά"
Παράμετρος
Αξία

Ομότιμων
MyPeer

Σήραγγα
αληθής

Src. Διεύθυνση
192.168.0.0/30

Dest. Διεύθυνση
192.168.0.0/30

Πρωτόκολλο
255 (όλα)

Περίγραμμα
ψευδής

Καρτέλα "Πολιτικές - Ενέργεια"
Παράμετρος
Αξία

Ενέργειες
κρυπτογράφηση

Επίπεδο
απαιτώ

Πρωτόκολλα IPsec
esp

Πρόταση
MyPeerProposal

Πιθανότατα, όπως εγώ, έχετε διαμορφώσει το snat/masquerade στη διεπαφή WAN σας· αυτός ο κανόνας πρέπει να προσαρμοστεί έτσι ώστε τα εξερχόμενα πακέτα ipsec να εισέρχονται στο τούνελ μας:
Μεταβείτε στην ενότητα "IP" - "Τείχος προστασίας".
Καρτέλα "NAT", ανοίξτε τον κανόνα μας snat/masquerade.

Καρτέλα για προχωρημένους
Παράμετρος
Αξία

Πολιτική IPsec
έξω: κανένας

Επανεκκίνηση του δαίμονα του ρακούν

sudo systemctl restart racoon

Εάν το racoon δεν ξεκινά κατά την επανεκκίνηση, τότε υπάρχει ένα σφάλμα στη διαμόρφωση· στο syslog, το racoon εμφανίζει πληροφορίες σχετικά με τον αριθμό γραμμής στον οποίο εντοπίστηκε το σφάλμα.

Όταν εκκινείται το λειτουργικό σύστημα, ο δαίμονας του ρακούν ξεκινά πριν εμφανιστούν οι διεπαφές δικτύου και καθορίσαμε την επιλογή αυστηρής_διεύθυνσης στην ενότητα ακρόασης· πρέπει να προσθέσετε τη μονάδα ρακούν στο αρχείο systemd
/lib/systemd/system/racoon.service, στην ενότητα [Unit], γραμμή After=network.target.

Τώρα τα ipsec τούνελ μας θα πρέπει να είναι επάνω, κοιτάξτε την έξοδο:

sudo ip xfrm policy

src 192.168.255.0/30 dst 192.168.255.0/30 
    dir out priority 2147483648 
    tmpl src 1.1.1.1 dst "IP NAT через который подключается mikrotik"
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir fwd priority 2147483648 
    tmpl src "IP NAT через который подключается mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir in priority 2147483648 
    tmpl src "IP NAT через который подключается mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Εάν τα τούνελ δεν είναι επάνω, κοιτάξτε το syslog ή το journalctl -u racoon.

Τώρα πρέπει να διαμορφώσετε τις διεπαφές L3 έτσι ώστε η κυκλοφορία να μπορεί να δρομολογηθεί. Υπάρχουν διάφορες επιλογές, θα χρησιμοποιήσουμε IPIP, αφού το mikrotik το υποστηρίζει, θα χρησιμοποιούσα το vti, αλλά, δυστυχώς, δεν έχει εφαρμοστεί ακόμα στο mikrotik. Διαφέρει από το IPIP στο ότι μπορεί επιπρόσθετα να ενθυλακώσει multicast και να τοποθετήσει fwmarks σε πακέτα με τα οποία μπορούν να φιλτραριστούν σε iptables και iproute2 (δρομολόγηση βάσει πολιτικής). Εάν χρειάζεστε μέγιστη λειτουργικότητα, τότε, για παράδειγμα, GRE. Αλλά μην ξεχνάτε ότι πληρώνουμε για πρόσθετη λειτουργικότητα με μεγάλο γενικό κόστος.

Μπορείτε να δείτε τη μετάφραση μιας καλής ανασκόπησης των διεπαφών σήραγγας εδώ.

Σε Linux:

# Создаем интерфейс
sudo ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
# Активируем
sudo ip link set ipip-ipsec0 up
# Назначаем адрес
sudo ip addr add 192.168.255.1/30 dev ipip-ipsec0

Τώρα μπορείτε να προσθέσετε διαδρομές για δίκτυα πίσω από το mikrotik

sudo ip route add A.B.C.D/Prefix via 192.168.255.2

Προκειμένου η διεπαφή και οι διαδρομές μας να αυξηθούν μετά από μια επανεκκίνηση, πρέπει να περιγράψουμε τη διεπαφή στο /etc/network/interfaces και να προσθέσουμε διαδρομές εκεί στο post-up ή να γράψουμε τα πάντα σε ένα αρχείο, για παράδειγμα, /etc/ ipip-ipsec0.conf και τραβήξτε το μέχρι το post-up, μην ξεχάσετε τον κάτοχο του αρχείου, τα δικαιώματα και κάντε το εκτελέσιμο.

Παρακάτω είναι ένα παράδειγμα αρχείου

#!/bin/bash
ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
ip link set ipip-ipsec0 up
ip addr add 192.168.255.1/30 dev ipip-ipsec0

ip route add A.B.C.D/Prefix via 192.168.255.2

Στο Mikrotik:

Ενότητα "Διεπαφές", προσθέστε μια νέα διεπαφή "IP tunnel":

Καρτέλα "IP tunnel" - "General"
Παράμετρος
Αξία

Όνομα
Κατά την κρίση σας (εφεξής IPIP-IPsec0)

MTU
1480 (αν δεν διευκρινίζεται, το mikrotik αρχίζει να κόβει το mtu στο 68)

Τοπική Διεύθυνση
192.168.0.2

Απομακρυσμένη διεύθυνση
192.168.0.1

Μυστικό IPsec
Απενεργοποιήστε το πεδίο (διαφορετικά θα δημιουργηθεί ένα νέο Peer)

Κρατήσει ζωντανή
Απενεργοποιήστε το πεδίο (διαφορετικά η διεπαφή θα απενεργοποιείται συνεχώς, αφού το mikrotika έχει τη δική του μορφή για αυτά τα πακέτα και δεν λειτουργεί με Linux)

DSCP
κληρονομώ

Μην κατακερματίζετε
Όχι.

Σφιγκτήρας TCP MSS
αληθής

Να επιτρέπεται η γρήγορη διαδρομή
αληθής

Ενότητα "IP" - "Διευθύνσεις", προσθέστε τη διεύθυνση:

Παράμετρος
Αξία

Διεύθυνση
192.168.0.2/30

περιβάλλον λειτουργίας
IPIP-IPsec0

Τώρα μπορείτε να προσθέσετε διαδρομές στο δίκτυο πίσω από μια μηχανή Linux· όταν προσθέτετε μια διαδρομή, η πύλη θα είναι η διεπαφή IPIP-IPsec0.

PS

Δεδομένου ότι ο διακομιστής μας Linux είναι μεταβατικό, είναι λογικό να ορίσουμε την παράμετρο Clamp TCP MSS για τις διεπαφές ipip σε αυτόν:

δημιουργήστε ένα αρχείο /etc/iptables.conf με το ακόλουθο περιεχόμενο:

*mangle
-A POSTROUTING -o ipip+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
COMMIT

και στο /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

Έχω το nginx που τρέχει στο δίκτυο πίσω από το mikrotik (ip 10.10.10.1), το κάνω προσβάσιμο από το Internet, το προσθέτω στο /etc/iptables.conf:

*nat
-A PREROUTING -d 1.1.1.1/32 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.10.10.1
#На mikrotik, в таблице mangle, надо добавить правило route с назначением 192.168.0.1 для пакетов с адресом источника 10.10.10.1 и портов 80, 443.

# Так же на linux работает OpenVPN сервер 172.16.0.1/24, для клиентов которые используют подключение к нему в качестве шлюза даем доступ в интернет
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

Μην ξεχάσετε να προσθέσετε τα κατάλληλα δικαιώματα στα iptables εάν έχετε ενεργοποιημένα τα φίλτρα πακέτων.

Γίνετε υγιείς!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο