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、ルーターOS 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 は追加のクライアント ID を送信できず、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 公開キー「Export 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グループ
modp2048

提案チェック
クレーム

寿命
1 日 00:00:00

NATトラバーサル
true (ボックスにチェックを入れます)

DPD
120

DPD 最大障害
5

「ピア」タブ
パラメーター

名前
お客様の裁量による(以下、MyPeerといいます)

住所
1.1.1.1 (IP Linux マシン)

ローカルアドレス
10.0.0.2 (IP WAN インターフェイス マイクロティック)

プロフィール
デフォルト

交換モード
メイン

パッシブ
false

INITIAL_CONTACT を送信する
true

「提案」タブ
パラメーター

名前
お客様の裁量による(以下、MyPeerProposal といいます)

認証。 アルゴリズム
sha512

エンクリアルゴリズム
aes-128-cbc

寿命
08:00:00

PFSグループ
modp2048

「アイデンティティ」タブ
パラメーター

ピア
マイピア

アトゥー。 方法
rsaキー

キー
mikrotik.privet.key

リモートキー
サーバー名.pub.pem

ポリシーテンプレートグループ
デフォルト

ノートラックチェーン
空です

私のIDタイプ
オート

リモート ID の種類
オート

一致基準
リモートID

モード構成
空です

ポリシーの生成
いいえ

タブ「ポリシー - 一般」
パラメーター

ピア
マイピア

トンネル
true

ソース住所
192.168.0.0/30

宛先住所
192.168.0.0/30

プロトコール
255(すべて)

テンプレート
false

タブ「ポリシー - アクション」
パラメーター

Action
暗号化する

レベル
必要とする

IPsecプロトコル
ESP

提案
MyPeer提案

おそらく、私と同じように、WAN インターフェイスに snat/マスカレードが設定されていると思います。発信 ipsec パケットがトンネルに入るように、このルールを調整する必要があります。
「IP」-「ファイアウォール」セクションに移動します。
「NAT」タブで、SNAT/マスカレード ルールを開きます。

詳細設定タブ
パラメーター

IPsec ポリシー
アウト:なし

アライグマの悪魔を再起動する

sudo systemctl restart racoon

再起動時に racoon が起動しない場合は、設定にエラーがあり、syslog にエラーが検出された行番号に関する情報が racoon に表示されます。

OS が起動すると、ネットワーク インターフェイスが起動する前に racoon デーモンが起動し、listen セクションで 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

トンネルが稼働していない場合は、syslog またはjournalctl -u racoon を確認してください。

次に、トラフィックをルーティングできるように L3 インターフェイスを構成する必要があります。 さまざまなオプションがあります。IPIP を使用します。mikrotik がサポートしているため、vti を使用しますが、残念ながら、mikrotik にはまだ実装されていません。 IPIP とは、さらにマルチキャストをカプセル化し、パケットに fwmark を付けることができ、それによって 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 にインターフェースを記述し、そこにポストアップでルートを追加するか、すべてを 0 つのファイル (例: /etc/) に記述する必要があります。 ipip-ipsecXNUMX.conf を作成し、ポストアップを通じてプルし、ファイルの所有者と権限を忘れずに実行可能にしてください。

以下はファイルの例です

#!/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 トンネル」を追加します。

タブ「IPトンネル」-「全般」
パラメーター

名前
お客様の裁量による(以下、IPIP-IPsec0といいます)

MTU
1480 (指定しない場合、mikrotik は mtu を 68 にカットし始めます)

ローカルアドレス
192.168.0.2

リモートアドレス
192.168.0.1

IPsec シークレット
フィールドを非アクティブ化します (そうしないと、新しいピアが作成されます)

生き続ける
フィールドを非アクティブにします (mikrotika はこれらのパッケージに独自の形式を持ち、Linux では動作しないため、そうしないとインターフェイスが常にオフになります)

DSCP
継承する

断片化しないでください
いいえ

クランプ TCP MSS
true

高速パスを許可する
true

「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 に追加することを忘れないでください。

健康になります!

出所: habr.com

コメントを追加します