オープンソースの strongSwan ソフトウェアを使用して、Alibaba Cloud との IPsec-VPN 接続を迅速に確立します。この接続では、IPsec-VPN 接続を トランジットルーター に関連付けることで、VPC とオンプレミスデータセンター (IDC) 間のネットワーク接続を実現します。
シナリオの概要
ある企業が中国 (杭州) リージョンに VPC を作成し、現在そのオンプレミス IDC を IPsec-VPN 経由で VPC に接続する必要があります。VPN Gateway を直接関連付ける方法とは異なり、本シナリオでは IPsec-VPN 接続を トランジットルーター に関連付けます。トランジットルーターは Cloud Enterprise Network (CEN) によって管理され、クラウドネットワークを一元的に制御します。その後、柔軟に追加の VPC を接続したり、クロスリージョン通信を有効化したりできます。
本シナリオでは、IDC にはパブリック IP アドレスが 1 つしかありません。この IP アドレスを使用して、Alibaba Cloud とのデュアルトンネル IPsec-VPN 接続を確立します:
リソース計画
クラウドリソース:中国 (杭州) リージョンにおける VPC の CIDR ブロック 10.0.0.0/16
vSwitch 1:ゾーン H、CIDR ブロック 10.0.0.0/24
vSwitch 2:ゾーン J、CIDR ブロック 10.0.2.0/24
ECS インスタンス:vSwitch 上に展開、IP アドレス 10.0.0.1(接続性確認用)
CEN インスタンス:トランジットルーターをホストするために使用
トランジットルーター:中国 (杭州) リージョンに作成、TR の CIDR ブロック 10.10.10.0/24(VPC および IDC の CIDR ブロックと重複してはいけません)
オンプレミスリソース:オンプレミス IDC の CIDR ブロック 172.16.0.0/16
strongSwan デバイス:プライベート IP アドレス 172.16.0.1
パブリック出口 IP:XX.XX.3.3
暗号化アルゴリズム:IKEv2、AES-128-CBC、SHA-1、DH グループ 2。トンネルの両端で同一の暗号化パラメーターを設定してください。
ルーティング方式:宛先ベースのルーティングを使用します。トランジットルーターのルートテーブルに静的ルートを追加し、IDC の CIDR ブロック宛てトラフィックを VPN 接続へ転送します。
前提条件
VPC の CIDR ブロックは、オンプレミス IDC の CIDR ブロックと重複してはいけません。
VPC を作成し、2 つの異なるゾーンそれぞれに 1 つずつ vSwitch を作成します。接続性確認のため、VPC 内に少なくとも 1 つの ECS インスタンスを展開します。
CEN インスタンスおよびトランジットルーター (TR) が作成済みであり、以下の条件を満たしている必要があります:
TR に アドレスセグメント が構成済みである
オンプレミス IDC 内に Linux サーバーを展開します。本トピックでは CentOS Stream 9 を例として使用します。サーバーには 1 つのパブリック出口 IP アドレスが必要です。このサーバーに strongSwan をインストールし、オンプレミスゲートウェイとして機能させます。
ステップ 1:カスタマーゲートウェイの作成
カスタマーゲートウェイは、Alibaba Cloud 上でご利用のオンプレミスゲートウェイデバイスのパブリック IP アドレスを記録します。本シナリオでは、IDC にはパブリック出口 IP アドレスが 1 つしかありません。そのため、1 つのカスタマーゲートウェイを作成します。
VPN Gateway ページ に移動します。左側のナビゲーションウィンドウで、カスタマーゲートウェイ をクリックします。
上部のメニューバーから、中国 (杭州) リージョンを選択します。
カスタマーゲートウェイの作成 をクリックします。以下の設定を構成します:
名前:カスタマーゲートウェイの名前を入力します(例:cgw-idc)。
IP アドレス:オンプレミス IDC のパブリック出口 IP アドレス(XX.XX.3.3)を入力します。
ステップ 2:IPsec-VPN 接続の作成
VPN Gateway コンソールで、左側のナビゲーションウィンドウから IPsec 接続 をクリックします。
CEN と関連付け をクリックします。IPsec-VPN 接続の基本パラメーターを構成します:
IPsec 接続名:リソースの名前を入力します(例:ipsec-demo)。
リージョン:中国 (杭州) を選択します。
ゲートウェイタイプ:パブリック を選択します。
CEN と関連付け:アカウント内 を選択します。
リソースの関連付け:トランジットルーター を選択します。
CEN インスタンス ID:前提条件で作成した CEN インスタンスを選択します。
ルーティングモード:宛先ルーティングモード を選択します。後ほど、トランジットルーターのルートテーブルに静的ルートを追加してトラフィック転送を制御します。
今すぐ有効化:はい、設定が完了すると即座にネゴシエーションする を選択します。Alibaba Cloud 側がピア側に対してネゴシエーションを開始します。
上級設定 (ルートテーブルの自動関連付けとルート転送設定などの設定を含む):すべてのオプション(ルートの自動公開、転送ルーターに自動的に関連付けるデフォルトのルートテーブル、システムルートを転送ルーターに自動的に伝播するデフォルトのルートテーブル)を選択します。
トンネルパラメーターを構成します:
Tunnel 1:
カスタマーゲートウェイ:ステップ 1 で作成したカスタマーゲートウェイを選択します。
事前共有鍵:トンネル確立時の ID 認証に使用する、両者で合意したパスワードを入力します。複雑なパスワードを使用してください。両者のパスワードは同一である必要があります。
Tunnel 2:
カスタマーゲートウェイ:トンネル 1 と同じカスタマーゲートウェイを選択します(本シナリオでは IDC にパブリック出口 IP アドレスが 1 つしかないため)。
事前共有鍵:トンネル 1 と同じ鍵を使用します。
その他の暗号化パラメーターはデフォルト値のままにしてください。手動でアルゴリズムを指定する場合は、暗号化設定 を展開して変更してください。
OK をクリックします。正常に作成された後、システムからルートの公開を促すメッセージが表示されます。キャンセル をクリックします。
IPsec-VPN 接続の初期化には約 5 分かかります(ステータスは 準備中)。この間はルートの構成ができません。クラウド側のトンネルのパブリック IP アドレスを記録してください。その後、ステップ 3 に進んでルートの構成を行います。
クラウド側の 2 つのトンネルのパブリック IP アドレスを記録します。これらのアドレスは、後ほど strongSwan の構成に必要です:
IPsec 接続 一覧ページに戻ります。先ほど作成した IPsec-VPN 接続を見つけます。ゲートウェイ IP アドレス 列で、IPsec アドレス 1 : および IPsec アドレス 2 : を記録します。本トピックでは、例として XX.XX.1.1 および XX.XX.2.2 を使用します。
ステップ 3:トランジットルーターへの静的ルートの追加
宛先ベースのルーティングを使用するため、トランジットルーターのルートテーブルに IDC の CIDR ブロック向けのルートを手動で追加します。
Cloud Enterprise Network コンソール に移動します。CEN インスタンス ID をクリックします。
トランジットルーター タブで、中国 (杭州) リージョンのトランジットルーターを見つけ、その ID をクリックして詳細ページに移動します。
ルートテーブル タブに切り替えます。デフォルトでシステムルートテーブルが表示されます。
システムルートテーブルの ルートエントリ タブで、ルートエントリの追加 をクリックします。
宛先 CIDR:IDC の CIDR ブロック 172.16.0.0/16 を入力します。
ブラックホールルート:いいえ を選択します。
ネクストホップ:IPsec-VPN 接続とトランジットルーターを関連付けた際に自動的に作成されるネットワークインスタンス接続を選択します。
OK をクリックします。
ルートを追加すると、ルートテーブルに宛先 CIDR ブロック 172.16.0.0/16、ネクストホップが VPN 接続である静的ルートが表示されます。
このルートにより、トランジットルーターから IDC の CIDR ブロック宛てのトラフィックが IPsec トンネルに転送されます。VPC 側のルートは、トランジットルーターのルート同期機能によって自動的に構成されるため、手動での構成は不要です。
ステップ 4:strongSwan デバイスの構成
以下に記載するサードパーティ製品に関する情報は参考用です。Alibaba Cloud は、サードパーティ製品のパフォーマンス、信頼性、および操作による潜在的な影響について一切の保証・表明を行いません。
本セクションでは、CentOS Stream 9(64 ビット)を例として strongSwan の構成方法を説明します。その他のオペレーティングシステムについては、strongSwan 公式ドキュメント をご参照ください。
1.ファイアウォールポリシーの許可
strongSwan デバイス上で、クラウド側の 2 つの IPsec アドレスからの ESP プロトコル(IP プロトコル番号 50)、UDP ポート 500、UDP ポート 4500 を許可します。
たとえば、iptables を使用する場合、実際のファイアウォールツールに応じてコマンドを調整してください:
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p esp -j ACCEPT
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p udp --dport 500 -j ACCEPT
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p udp --dport 4500 -j ACCEPT2.IP フォワーディングの有効化
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sudo sysctl -p3.strongSwan のインストール
sudo dnf install epel-release -y
sudo dnf install strongswan -y4.XFRM トンネルインターフェイスおよび updown スクリプトの作成
デュアルトンネルのシナリオでは、各トンネルのトラフィックを区別し、カーネルのルーティングポリシーの競合を回避するために、XFRM 仮想インターフェイスを作成します。
# XFRM トンネルインターフェイスの作成(トンネル 1 およびトンネル 2 用)
sudo ip link add xfrm1 type xfrm dev eth0 if_id 1
sudo ip link add xfrm2 type xfrm dev eth0 if_id 2
sudo ip link set xfrm1 up
sudo ip link set xfrm2 up
# 等コストマルチパス (ECMP) ルートの追加:クラウド側 CIDR ブロック宛てのトラフィックを両方のトンネルに分散
sudo ip route add 10.0.0.0/16 nexthop dev xfrm1 weight 1 nexthop dev xfrm2 weight 1トンネルがダウンした際に、対応する XFRM インターフェイスを自動的に DOWN に設定する updown スクリプトを作成します。これにより、Linux カーネルがトラフィックをアクティブなトンネルに収束させます:
sudo tee /usr/local/bin/xfrm-updown.sh > /dev/null << 'EOF'
#!/bin/bash
XFRM_IF="xfrm${PLUTO_IF_ID_IN}"
case "${PLUTO_VERB}" in
up-client)
ip link set "${XFRM_IF}" up 2>/dev/null
;;
down-client)
ip link set "${XFRM_IF}" down 2>/dev/null
;;
esac
EOF
sudo chmod +x /usr/local/bin/xfrm-updown.shXFRM インターフェイスおよびルートを再起動後も永続化するには、XFRM インターフェイスおよびルートのコマンドを起動スクリプトに追加してください。
5.strongSwan の構成
元の設定ファイルをバックアップします:
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak新しい設定ファイルを作成します:
vi /etc/strongswan/swanctl/swanctl.conf以下の設定を追加・保存します。例示されている IP アドレスおよび鍵を、実際の値に置き換えてください:
# strongSwan デュアルトンネル IPsec-VPN 構成 # Alibaba Cloud トランジットルーターと関連付けられた IPsec-VPN 接続 + オンプレミス側の単一パブリック出口 + 宛先ベースのルーティング用 # # 「変更」マークが付いているパラメーターのみ変更が必要です。その他のパラメーターはデフォルト値のままにしてください。 # XFRM インターフェイス(if_id)を使用して 2 つのトンネルのトラフィックを分離します。負荷分散には ECMP を使用します。 connections { # === トンネル 1 === tunnel1 { version = 2 dpd_delay = 10s rekey_time = 86400s proposals = aes128-sha1-modp1024 local_addrs = 172.16.0.1 # strongSwan デバイスの NIC IP(変更:NAT 環境ではプライベート IP を使用;NIC がパブリック IP にバインドされている場合はパブリック IP を使用) local { auth = psk id = XX.XX.3.3 # オンプレミス側のパブリック出口 IP(変更) } remote_addrs = XX.XX.1.1 # Alibaba Cloud トンネル 1 のパブリック IP(変更) remote { auth = psk id = XX.XX.1.1 # Alibaba Cloud トンネル 1 のパブリック IP(上記 remote_addrs と同じ)(変更) } children { tunnel1-child { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 mode = tunnel esp_proposals = aes128-sha1-modp1024 dpd_action = restart start_action = start close_action = start updown = /usr/local/bin/xfrm-updown.sh if_id_in = 1 # xfrm1 インターフェイスに対応 if_id_out = 1 } } if_id_in = 1 if_id_out = 1 } # === トンネル 2 === tunnel2 { version = 2 dpd_delay = 10s rekey_time = 86400s proposals = aes128-sha1-modp1024 local_addrs = 172.16.0.1 # strongSwan デバイスの NIC IP(トンネル 1 と同じ)(変更) local { auth = psk id = XX.XX.3.3 # オンプレミス側のパブリック出口 IP(トンネル 1 と同じ)(変更) } remote_addrs = XX.XX.2.2 # Alibaba Cloud トンネル 2 のパブリック IP(変更) remote { auth = psk id = XX.XX.2.2 # Alibaba Cloud トンネル 2 のパブリック IP(上記 remote_addrs と同じ)(変更) } children { tunnel2-child { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 mode = tunnel esp_proposals = aes128-sha1-modp1024 dpd_action = restart start_action = start close_action = start updown = /usr/local/bin/xfrm-updown.sh if_id_in = 2 # xfrm2 インターフェイスに対応 if_id_out = 2 } } if_id_in = 2 if_id_out = 2 } } secrets { ike-tunnel1 { id-1 = XX.XX.3.3 # オンプレミス側のパブリック出口 IP(変更) id-2 = XX.XX.1.1 # Alibaba Cloud トンネル 1 のパブリック IP(変更) secret = "your-psk-here" # トンネル 1 の事前共有鍵(Alibaba Cloud 側と一致させる必要があります)(変更) } ike-tunnel2 { id-1 = XX.XX.3.3 # オンプレミス側のパブリック出口 IP(変更) id-2 = XX.XX.2.2 # Alibaba Cloud トンネル 2 のパブリック IP(変更) secret = "your-psk-here" # トンネル 2 の事前共有鍵(Alibaba Cloud 側と一致させる必要があります)(変更) } }重要if_id_inおよびif_id_outパラメーターは、各トンネルを対応する XFRM インターフェイス(xfrm1 または xfrm2)にバインドします。これにより、各トンネルのトラフィックが互いに干渉しないようになります。local_tsおよびremote_tsを0.0.0.0/0に設定します。XFRM インターフェイスのルートテーブルが、どのトラフィックがトンネルに入るかを決定します。宛先ベースのルーティングモードでは、クラウド側のトラフィックセレクターも0.0.0.0/0です。
6.トンネルの起動およびステータスの確認
sudo systemctl enable strongswan
sudo systemctl restart strongswan
sudo swanctl --load-all
sudo swanctl --list-sas両方のトンネルで ESTABLISHED が表示され、CHILD_SA で INSTALLED が表示された場合、strongSwan デバイスと Alibaba Cloud 間の IPsec-VPN 接続が正常に確立されています。
# 期待される出力例(一部省略)
tunnel1: #1, ESTABLISHED, IKEv2
tunnel1-child: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96
tunnel2: #2, ESTABLISHED, IKEv2
tunnel2-child: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96検証テスト
接続性の確認
まず、ECS のセキュリティグループルールが ICMP トラフィックを許可していることを確認します。次に、strongSwan デバイスにログインし、以下のコマンドを実行してクラウド側の ECS に ping を実行します:
ping 10.0.0.1応答が返ってきた場合、VPC とオンプレミス IDC 間の接続性は正常です。
まず、strongSwan デバイスまたは内部サーバーで ICMP トラフィックが許可されていることを確認します。次に、VPC 内の ECS インスタンス(10.0.0.1)にログインし、strongSwan デバイスのプライベート IP アドレスに ping を実行します:
ping 172.16.0.1応答が返ってきた場合、逆方向の接続性も正常です。
高可用性の確認
デフォルトで、トランジットルーターと関連付けられた IPsec-VPN 接続は、両方のトンネル間で等コストマルチパス (ECMP) ルーティングを使用します。トラフィックはトンネル間で負荷分散されます。いずれかのトンネルが障害を起こした場合、手動介入なしにトラフィックがもう一方のトンネルに自動的に収束します。
ECS から IDC サーバーへの ping を継続的に実行します:
ping 172.16.0.1 -c 10000トンネルを切断します:Alibaba Cloud コンソールで、IPsec-VPN 接続のトンネル 1 の事前共有鍵を変更します。これによりトンネルが切断されます。
ping の結果を観察します:一時的な中断の後、接続性が復旧します。これは、トラフィックがトンネル 2 に収束したことを確認します。
トンネルを復元します:IPsec-VPN 接続のトンネル 1 の事前共有鍵を正しい値に再設定します。トンネルが復旧した後、トラフィックは両方のトンネル間で再び負荷分散されます。
トラブルシューティング
よくある問題と解決策:
問題 | 原因の可能性 | 解決策 |
コンソールでトンネルのネゴシエーション失敗が表示される | ネットワークが到達不能 | strongSwan デバイスから Alibaba Cloud の IPsec アドレスへの ping が通るか確認してください。また、オンプレミス IDC のファイアウォールが UDP ポート 500 および 4500 を許可しているか確認してください。 |
事前共有鍵の不一致 | 両者の事前共有鍵が、大文字小文字および特殊文字を含めて完全に一致しているか確認してください。 | |
IKE パラメーターの不一致 | IKE バージョン、暗号化アルゴリズム、認証アルゴリズム、DH グループが両者で一致しているか確認してください。 | |
トンネルは確立されているが ping が失敗する | ルートが構成されていない | VPC のルートテーブルに IDC の CIDR ブロック宛てのルート(ネクストホップはトランジットルーター)が含まれているか確認してください。また、トランジットルーターのルートテーブルに IDC の CIDR ブロック宛ての静的ルート(ネクストホップは VPN 接続)が含まれているか確認してください。宛先ベースのルーティングモードでは、トランジットルーターのルートテーブルはルートを自動生成しないため、手動で追加する必要があります。 |
セキュリティグループの制限 | ECS のセキュリティグループが IDC の CIDR ブロック(172.16.0.0/16)からの ICMP トラフィックを許可しているか確認してください。 | |
オンプレミスファイアウォールの制限 | IDC のファイアウォールが VPC の CIDR ブロック(10.0.0.0/16)からのトラフィックを許可しているか確認してください。 | |
strongSwan 側にルートがない | strongSwan デバイスで IP フォワーディングが有効になっているか確認してください。また、IDC 内の他のサーバーが VPC の CIDR ブロック(ネクストホップは strongSwan デバイス)へのルートを持っているか確認してください。 |