Linux 電腦與 NAT 提供者後面的 Mikrotik 之間的 IPIP IPsec VPN 隧道

Linux的: Ubuntu 18.04.4 LTS(GNU/Linux 4.15.0-91-通用 x86_64)

  • Eth0 1.1.1.1/32 外部IP
  • ipip-ipsec0 192.168.0.1/30 將是我們的隧道

米克托伊克: CCR 1009、路由器作業系統 6.46.5

  • Eth0 10.0.0.2/30 來自提供者的內部 IP。 提供者的外部 NAT IP 是動態的。
  • ipip-ipsec0 192.168.0.2/30 將是我們的隧道

我們將使用 racoon 在 Linux 電腦上建立 IPsec 隧道。 細節我就不描述了,有一個很好的 文章 у 維波洛斯金.

安裝所需的軟件包:

sudo install racoon ipsec-tools

我們配置racoon,它將有條件地充當ipsec伺服器。 由於主模式下的mikrotik 無法傳輸額外的客戶端標識符,並且它連接到Linux 的外部IP 位址是動態的,因此使用預先共用金鑰(密碼授權)將不起作用,因為密碼必須與下列IP 位址匹配:連接主機,或帶有識別符。

我們將使用 RSA 金鑰進行授權。

racoon 守護程式使用 RSA 格式的金鑰,mikrotik 使用 PEM 格式。 如果您使用 racoon 隨附的 plainrsa-gen 實用程式產生金鑰,那麼您將無法在其幫助下將 Mikrotika 的公鑰轉換為 PEM 格式 - 它僅向一個方向轉換:PEM 到 RSA。 openssl 和 ssh-keygen 都無法讀取 plainrsa-gen 產生的金鑰,因此也無法使用它們進行轉換。

我們將使用 openssl 產生一個 PEM 金鑰,然後使用 plainrsa-gen 將其轉換為 racoon:

#  Генерируем ключ
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。 不要忘記將啟動 racoon 守護程式的使用者(通常是 root)的擁有者設定為 600 權限。

我將描述透過 WinBox 連接時的 mikrotik 設定。

將 server-name.pub.pem 金鑰上傳到 mikrotik:選單「檔案」-「上傳」。

開啟“IP”部分 - “IP sec” - “金鑰”標籤。 現在我們產生金鑰 - “Generate Key”按鈕,然後匯出 mikrotika 公鑰「Expor Pub. Key”,您可以從“檔案”部分下載它,右鍵單擊該檔案 - “下載”。

我們導入 racoon 公鑰,“導入”,在“文件名”字段的下拉列表中查找我們之前下載的 server-name.pub.pem。

mikrotik公鑰需要轉換

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

並將其放入 /etc/racoon/certs 資料夾中,不要忘記所有者和權限。

附註解的 racoon 設定:/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; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

微控制器配置

返回“IP”部分 - “IPsec”

“個人資料”選項卡
參數

姓名
由您自行決定(預設預設)

哈希算法
sha512

加密演算法
AES-128

DH集團
模組p2048

提案檢查
聲稱

永久
1 天 00:00:00

NAT穿越
正確(選中該框)

DPD
120

DPD 最大故障
5

同行選項卡
參數

姓名
由您自行決定(以下簡稱 MyPeer)

地址
1.1.1.1(IP Linux 機器)

本地地址
10.0.0.2(IP WAN 介面 mikrotik)

個人資訊
默認

交換方式

被動

寄 INITIAL_CONTACT

提案選項卡
參數

姓名
由您自行決定(以下稱為 MyPeerProposal)

授權。 演算法
sha512

恩克里。 演算法
aes-128-CBC

永久
08:00:00

PFS集團
模組p2048

「身分」標籤
參數

Peer 手機側揹袋
我的同行

阿圖。 方法
RSA金鑰

關鍵
mikrotik.privet.key

遙控鑰匙
伺服器名稱.pub.pem

策略範本組
默認

諾軌道鏈
空的

我的身分證類型
汽車

遠程 ID 類型
汽車

匹配依據
遠程ID

模式配置
空的

生成策略
沒有

選項卡“策略 - 常規”
參數

Peer 手機側揹袋
我的同行

隧道

來源。 地址
192.168.0.0/30

目的地。 地址
192.168.0.0/30

協議
255(全部)

模板

選項卡“策略 - 操作”
參數

行動
加密

水平
要求

IPsec 協定
ESP

建議
我的同儕提案

最有可能的是,像我一樣,您在 WAN 介面上配置了 snat/masquerade;需要調整此規則,以便傳出 ipsec 封包進入我們的隧道:
轉到“IP”-“防火牆”部分。
「NAT」選項卡,開啟我們的 snat/masquerade 規則。

進階選項卡
參數

IPsec 策略
輸出:無

重啟浣熊惡魔

sudo systemctl restart racoon

如果 racoon 在重新啟動時未啟動,則設定中存在錯誤;在 syslog 中,racoon 顯示偵測到錯誤的行號的資訊。

當作業系統啟動時,racoon 守護程序在網路介面啟動之前啟動,並且我們在監聽部分指定了 strict_address 選項;您需要將 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

如果隧道未啟動,請查看系統日誌或journalctl -u racoon。

現在您需要設定 L3 介面以便可以路由流量。 有不同的選擇,我們將使用 IPIP,因為 mikrotik 支援它,我會使用 vti,但不幸的是,它尚未在 mikrotik 中實現。 它與IPIP的不同之處在於它可以額外封裝組播並在資料包上放置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 中描述介面並在後期添加路由,或將所有內容寫入一個文件中,例如 /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

關於米克羅蒂克:

在「Interfaces」部分,新增一個新介面「IPtunnel」:

選項卡“IP 隧道”-“常規”
參數

姓名
由您自行決定(以下簡稱 IPIP-IPsec0)

MTU
1480(如果未指定,mikrotik 開始將 mtu 削減到 68)

本地地址
192.168.0.2

遠程地址
192.168.0.1

IPsec 秘密
停用該欄位(否則將建立一個新的對等點)

活著
停用該欄位(否則介面將不斷關閉,因為 mikrotika 對於這些軟體包有自己的格式,並且不適用於 Linux)

數據中心
繼承

不要碎片化
沒有

箝位 TCP MSS

允許快速路徑

“IP”-“位址”部分,新增位址:

參數

地址
192.168.0.2/30

介面
IPIP-IPsec0

現在您可以新增至 Linux 機器後面的網路的路由;新增路由時,網關將是我們的 IPIP-IPsec0 介面。

PS

由於我們的 Linux 伺服器是可傳遞的,因此為其上的 ipip 介面設定 Clamp TCP MSS 參數是有意義的:

建立包含以下內容的檔案 /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 中
後製 iptables-restore < /etc/iptables.conf

我在 mikrotik (ip 10.10.10.1) 後面的網路上運行 nginx,使其可以從互聯網訪問,將其添加到 /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

添加評論