このトピックでは、strongSwanデバイスをAlibaba Cloud上のElastic Compute Service (ECS) インスタンスに接続する方法について説明します。
strongSwanはオープンソースでIPsecベースのVPNソリューションで、構成が簡単で、主流のLinuxディストリビューションに展開できます。 strongSwanを使用して、Alibaba CloudとのIPsec-VPN接続を確立できます。
この例では、デュアルトンネルモードのVPNゲートウェイを使用してIPsec-VPN接続を確立します。 VPN gatewayがシングルトンネルモードのみをサポートしている場合は、このトピックの「単一トンネルを使用するようにstrongSwanデバイスを構成する」をご参照ください。
シナリオ
次のシナリオは一例です。 オンプレミスゲートウェイにstrongSwanを設定して、Alibaba CloudへのデュアルトンネルIPsec-VPN接続を確立できます。
サブネット
データセンター
プライベートCIDRブロック: 10.0.0.0/16
strongSwanデバイス
ネットワークインターフェイスコントローラー (NIC) eth0: 10.0.0.1およびNATマップされたインターネット出口1: 1.1.XX.XX
必要に応じて、 NIC eth1: 10.0.0.2およびNATマップされたインターネット出口2: 2.2.XX.XX
説明NAT以外のシナリオの詳細については、NICにパブリックIPアドレスが割り当てられているstrongSwanデバイスを構成するにはどうすればよいですか?
このトピックでは、シングル出力strongSwanデバイスとデュアル出力strongSwanデバイスの設定例を示します。 どちらのデバイスを使用しても、Alibaba CloudへのIPsec-VPN接続を確立できます。
Alibaba Cloud
VPC CIDRブロック: 172.16.0.0/16
vSwitch1 CIDRブロック: 172.16.1.0/24
vSwitch2 CIDRブロック: 172.16.2.0/24
VPN ゲートウェイ
IPsecアドレス1: 3.3.XX.XX
IPsecアドレス2: 4.4.XX.XX
説明VPNゲートウェイを作成すると、システムは自動的に2つのIPsecアドレスをVPNゲートウェイに割り当てます。
VPN設定
2つのトンネルは同じ構成を使用する。 Alibaba CloudとstrongSwanデバイスのVPN設定は、各トンネルで同じである必要があります。
事前共有キー: ChangeMe ***
IKE設定
IKEバージョン: ikev2
交渉モード: main
暗号化アルゴリズム: aes
認証アルゴリズム: sha1
DHグループ: group2
SAの寿命 (秒): 86400
IPsec設定:
暗号化アルゴリズム: aes
認証アルゴリズム: sha1
DHグループ: group2
SAの寿命 (秒): 86400
Alibaba Cloudでの準備
strongSwanデバイスを設定する前に、Alibaba Cloud側でVPNゲートウェイの作成、カスタマーゲートウェイの作成、IPsec-VPN接続の作成、VPNゲートウェイのルートの設定を実行します。 詳細については、「デュアルトンネルモードでVPCをデータセンターに接続する」をご参照ください。
Alibaba Cloud側の設定は、strongSwanデバイスのインターネットアクセス数によって異なります。
シングル出力
1つのインターネット出口のみが存在するため、1つのカスタマーゲートウェイを作成します。
IPsec-VPN接続:
各トンネルのルーティングモードには、[保護データフロー] を選択します。
ローカルCIDRブロックには、VPCのCIDRブロック (172.16.0.0/16) を入力します。
ピアCIDRブロックには、データセンターのCIDRブロック (10.0.0.0/16) を入力します。
同じカスタマーゲートウェイを選択します。
デュアル出力
2つのインターネットアクセスが存在するため、2つのカスタマーゲートウェイを作成します。
IPsec-VPN接続:
両方のトンネルに対して宛先ルーティングモードを選択します。
出口1にトンネル1、出口2にトンネル2を選択します。
strongSwanデバイスの設定
次の例では、CentOS Stream 9 64ビットを実行するstrongSwanデバイスが使用されています。 その他のオペレーティングシステムの詳細については、「strongSwanドキュメント」をご参照ください。
1. 許可ファイアウォールポリシーの構成
UDPポート500とUDPポート4500でESP (IPプロトコル50) の許可ポリシーを設定します。
iptables -I INPUT -p 50 -j ACCEPT
iptables -I INPUT -p udp --dport 500 -j ACCEPT
iptables -I INPUT -p udp --dport 4500 -j ACCEPT
2. トラフィック転送の有効化
echo 1 > /proc/sys/net/ipv4/ip_forward
上記のコマンドは一時的なコマンドです。 strongSwanデバイスを再起動した後、コマンドを再度実行する必要があります。 強力なSwanデバイスのトラフィック転送を有効にする場合は、次の手順を実行します。
3. strongSwanのインストール
dnf install epel-release -y
dnf install strongswan-5.9.10 -y
4. トンネルの設定
シングル出力
アクティブトンネルとスタンバイトンネルを切り替えるために、strongSwan保護データフローに基づいてシングルトンネルを設定します。
元のstrongSwan設定ファイルをバックアップします。
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak
strongSwan設定ファイルを作成します。
vi /etc/strongswan/swanctl/swanctl.conf
[例] セクションに基づいて、次の設定を追加して保存します。
connections { vco1 { # The VPN configurations of IPsec-VPN Tunnel 1. version = 2 # The IKE version, which must be the same as that configured for Tunnel 1 on Alibaba Cloud. A value of 2 indicates IKEv2. local_addrs=10.0.0.1 # The IP address of the local NIC. remote_addrs = 3.3.XX.XX # Set the remote address of Tunnel 1 to the VPN gateway address of Tunnel 1 on Alibaba Cloud, which is IPsec Address 1. dpd_delay = 10 rekey_time = 84600 # The SA lifetime of Tunnel 1, which must be the same as that specified in the IKE configurations of Tunnel 1 on Alibaba Cloud. over_time = 1800 proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 1, which must be the same as those specified in the IKE configurations of Tunnel 1 on Alibaba Cloud. A value of group2 indicates modp1024. encap = yes local { auth = psk # Set the authentication algorithm of the data center to PSK. id = 1.1.XX.XX # The IP address of the local Internet egress. This value must be the same as RemoteId of Tunnel 1. } remote { auth = psk # Set the authentication algorithm of the VPC to PSK. id = 3.3.XX.XX # IPsec Address 1 on the Alibaba Cloud side. This value must be the same as LocalId of Tunnel 1. } children { vco_child1 { local_ts = 10.0.0.0/16 # The local protected data flows. Enter the private CIDR block of the data center, which is 10.0.0.0/16. remote_ts = 172.16.0.0/16 # The protected data flows on the Alibaba Cloud side. Enter the VPC CIDR block, which is 172.16.0.0/16. mode = tunnel rekey_time = 85500 life_time = 86400 # The SA lifetime of Tunnel 1, which must be the same as that specified in the IPsec configurations of Tunnel 1 on Alibaba Cloud. dpd_action = restart start_action = start close_action = start esp_proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 1, which must be the same as those specified in the IPsec configurations of Tunnel 1 on Alibaba Cloud. A value of group2 indicates modp1024. } } } vco2 { # The VPN configurations of IPsec-VPN Tunnel 2. version = 2 # The IKE version, which must be the same as that configured for Tunnel 2 on Alibaba Cloud. A value of 2 indicates IKEv2. local_addrs = 10.0.0.1 # The IP address of the local NIC. remote_addrs = 4.4.XX.XX # The tunnel address, which is IPsec Address 2. dpd_delay = 10 rekey_time = 84600 # The SA lifetime of Tunnel 2, which must be the same as that specified in the IKE configurations of Tunnel 2 on Alibaba Cloud. over_time = 1800 proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 2, which must be the same as those specified in the IKE configurations of Tunnel 2 on Alibaba Cloud. A value of group2 indicates modp1024. encap = yes local { auth = psk # Set the authentication algorithm of the data center to PSK. id = 1.1.XX.XX # The public IP address of the local Internet egress. This value must be the same as RemoteId of Tunnel 2. } remote { auth = psk # Set the authentication algorithm of the VPC to PSK. id = 4.4.XX.XX # IPsec Address 2 on the Alibaba Cloud side. This value must be the same as LocalId of Tunnel 2. } children { vco_child2 { local_ts = 10.0.0.0/16 # The local protected data flows. Set this value to the CIDR block of the data center, which is 10.0.0.0/16. remote_ts = 172.16.0.0/16 # The protected data flows on the Alibaba Cloud side. Enter the VPC CIDR block, which is 172.16.0.0/16. mode = tunnel rekey_time = 85500 life_time = 86400 # The SA lifetime of Tunnel 2, which must be the same as that specified in the IPsec configurations of Tunnel 1 on Alibaba Cloud. dpd_action = restart start_action = start close_action = start esp_proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 2, which must be the same as those specified in the IPsec configurations of Tunnel 2 on Alibaba Cloud. A value of group2 indicates modp1024. } } } } secrets { ike-vco1 { secret = ChangeMe*** # The PSK of Tunnel 1, which must be the same as that configured for Tunnel 1 on Alibaba Cloud. } ike-vco2 { secret = ChangeMe*** # The PSK of Tunnel 2, which must be the same as that configured for Tunnel 2 on Alibaba Cloud. } }
strongSwanプロセスを再起動します。
systemctl restart strongswan
トンネルのステータスを確認します。
watch swanctl --list-sas
図に示すように、IPsec-VPN接続は、strongSwanデバイスとVPNゲートウェイとの間に確立される。
デュアル出力
デュアル出力はXFRMインターフェイスに基づいています。 XFRMインターフェイスを使用するには、strongSwanバージョンが5.8.0以降、Linuxカーネルバージョンが4.19以降、iproute2バージョンが5.1.0以降、カーネルがXFRMモジュールをサポートしている必要があります。 lsmod | grep xfrm
が表示されない場合、XFRMインターフェイスはサポートされません。 詳細については、「Linux上のXFRMインターフェイス」をご参照ください。
IPsec Address 1からのアクセスがeth0を通過し、IPsec Address 2からのアクセスがeth1を通過するようにルートを設定します。
ip route add 3.3.XX.XX via 10.0.0.253 dev eth0 #10.0.0.253 is the IP address of the private gateway. ip route add 4.4.XX.XX via 10.0.0.253 dev eth1
次の2つのIPsecアドレスがpingできることを確認してください。
ping 3.3.XX.XX ping 4.4.XX.XX
IPsec-VPNトンネルを確立するための2つの仮想ネットワークインターフェイスを作成します。
ip link add ipsec0 type xfrm dev eth0 if_id 42 # Create an XFRM virtual network interface for Tunnel 1, with the interface ID 42 and the public interface eth0 as the underlying interface. ip link add ipsec1 type xfrm dev eth1 if_id 43 # Create an XFRM virtual network interface for Tunnel 2, with the interface ID 43 and the public interface eth1 as the underlying interface. ip link set ipsec0 up # Start the XFRM virtual network interface for Tunnel 1. ip link set ipsec1 up # Start the XFRM virtual network interface for Tunnel 2.
重要仮想ネットワークインターフェイスを作成するための上記の設定は、一時的な設定です。 strongSwanデバイスを再起動した後、設定を再度追加し、
sudo systemctl restart strongswan;swanctl -- load-all
コマンドを実行する必要があります。 コマンドにはroot権限が必要です。 strongSwanデバイスの再起動後に仮想ネットワークインターフェイスを自動的に作成するように、システムの起動時に実行されるスクリプトを構成する場合は、次の手順を実行します。
strongSwan用の2つのスクリプトを作成し、トラフィックを転送するルートを設定します。
/root/connect_1.shの作成と編集
vi /root/connect_1.sh
次のスクリプトを追加して保存します。
#!/usr/bin/env bash if [ x"$PLUTO_VERB" == "xup-client" ]; then echo "ip route add 172.16.0.0/16 dev ipsec0" >> /root/vpn_route.log;ip route add 172.16.0.0/16 dev ipsec0 metric 100 elif [ x"$PLUTO_VERB" == "xdown-client" ]; then echo "ip route del 172.16.0.0/16 dev ipsec0" >> /root/vpn_route.log;ip route del 172.16.0.0/16 dev ipsec0 metric 100 fi
スクリプトの目的: Tunnel 1のステータスがUPの場合、Tunnel 1のXFRM仮想ネットワークインターフェイスを介して、データセンターからCIDRブロックが172.16.0.0/16のVPCにトラフィックを送信するルートを追加します。 さらに、このルートのメトリック値を100に設定して、このルートに、トンネル2のXFRM仮想ネットワークインターフェイスを指すルートよりも高い優先度を割り当てます。 トンネル1のステータスがDOWNの場合、ルートを撤回します。
/root/connect_2.shの作成と編集
vi /root/connect_2.sh
次のスクリプトを追加して保存します。
#!/usr/bin/env bash if [ x"$PLUTO_VERB" == "xup-client" ]; then echo "ip route add 172.16.0.0/16 dev ipsec1" >> /root/vpn_route.log;ip route add 172.16.0.0/16 dev ipsec1 metric 101 elif [ x"$PLUTO_VERB" == "xdown-client" ]; then echo "ip route del 172.16.0.0/16 dev ipsec1" >> /root/vpn_route.log;ip route del 172.16.0.0/16 dev ipsec1 metric 101 fi
スクリプトの目的: Tunnel 2のステータスがUPの場合、Tunnel 2のXFRM仮想ネットワークインターフェイスを介して、データセンターからCIDRブロックが172.16.0.0/16のVPCにトラフィックを送信するルートを追加します。 さらに、このルートのメトリック値を101に設定して、このルートに、トンネル1のXFRM仮想ネットワークインターフェイスを指すルートよりも低い優先度を割り当てます。 トンネル2のステータスがDOWNの場合、ルートを撤回します。
次のコマンドを実行して、スクリプトを実行可能にします。
sudo chmod +x /root/connect_1.sh sudo chmod +x /root/connect_2.sh
strongSwan設定ファイルを変更します。
元のstrongSwan設定ファイルをバックアップします。
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak
strongSwan設定ファイルを作成します。
vi /etc/strongswan/swanctl/swanctl.conf
例に基づいて、次の設定を追加して保存します。
connections { vco1 { # The VPN configurations of IPsec-VPN Tunnel 1. version = 2 # The IKE version, which must be the same as that configured for Tunnel 1 on Alibaba Cloud. A value of 2 indicates IKEv2. local_addrs = 10.0.0.1 # The IP address of the first local NIC. remote_addrs = 3.3.XX.XX # Set the remote address of Tunnel 1 to the VPN gateway address of Tunnel 1 on Alibaba Cloud, which is IPsec Address 1. dpd_delay = 10 rekey_time = 84600 # The SA lifetime of Tunnel 1, which must be the same as that specified in the IKE configurations of Tunnel 1 on Alibaba Cloud. over_time = 1800 proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 1, which must be the same as those specified in the IKE configurations of Tunnel 1 on Alibaba Cloud. A value of group2 indicates modp1024. encap = yes local { auth = psk # Set the authentication algorithm of the data center to PSK. id = 1.1.XX.XX # The public IP address of the first local egress. This value must be the same as RemoteId of Tunnel 1. } remote { auth = psk # Set the authentication algorithm of the VPC to PSK. id = 3.3.XX.XX # IPsec Address 1 on the Alibaba Cloud side. This value must be the same as LocalId of Tunnel 1. } children { vco_child1 { local_ts = 0.0.0.0/0 # Specify that the CIDR block of the protected data flows for the destination-based route mode on Alibaba Cloud is 0.0.0.0/0. remote_ts = 0.0.0.0/0 # Specify that the CIDR block of the protected data flows for the destination-based route mode on Alibaba Cloud is 0.0.0.0/0. mode = tunnel rekey_time = 85500 life_time = 86400 # The SA lifetime of Tunnel 1, which must be the same as that specified in the IPsec configurations of Tunnel 1 on Alibaba Cloud. dpd_action = restart start_action = start close_action = start esp_proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 1, which must be the same as those specified in the IPsec configurations of Tunnel 1 on Alibaba Cloud. A value of group2 indicates modp1024. if_id_out = 42 # Specify that the XFRM virtual network interface of Tunnel 1 is used as the egress port and ingress port of Tunnel 1. if_id_in = 42 updown = /root/connect_1.sh # Execute the /root/connect_1.sh script to configure routing based on the UP/DOWN status of Tunnel 1. } } } vco2 { # The VPN configurations of IPsec-VPN Tunnel 2. version = 2 # The IKE version, which must be the same as that configured for Tunnel 2 on Alibaba Cloud. A value of 2 indicates IKEv2. local_addrs = 10.0.0.2 # The IP address of the second local NIC. remote_addrs = 4.4.XX.XX # Set the remote address of Tunnel 2 to the VPN gateway address of Tunnel 2 on Alibaba Cloud, which is IPsec address 2. dpd_delay = 10 rekey_time = 84600 # The SA lifetime of Tunnel 2, which must be the same as that specified in the IKE configurations of Tunnel 2 on Alibaba Cloud. over_time = 1800 # proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 2, which must be the same as those specified in the IKE configurations of Tunnel 2 on Alibaba Cloud. A value of group2 indicates modp1024. encap = yes local { auth = psk # Set the authentication algorithm of the data center to PSK. id = 2.2.XX.XX # The public IP address of the second local egress. This value must be the same as RemoteId of Tunnel 2. } remote { auth = psk # Set the authentication algorithm of the VPC to PSK. id = 4.4.XX.XX # IPsec Address 2 on the Alibaba Cloud side. This value must be the same as LocalId of Tunnel 2. } children { vco_child2 { local_ts = 0.0.0.0/0 # Specify that the CIDR block of the protected data flows for the destination-based route mode on Alibaba Cloud is 0.0.0.0/0. remote_ts = 0.0.0.0/0 # Specify that the CIDR block of the protected data flows for the destination-based route mode on Alibaba Cloud is 0.0.0.0/0. mode = tunnel rekey_time = 85500 life_time = 86400 # The SA lifetime of Tunnel 2, which must be the same as that specified in the IPsec configurations of Tunnel 1 on Alibaba Cloud. dpd_action = restart start_action = start close_action = start esp_proposals = aes-sha1-modp1024 # The encryption algorithm, authentication algorithm, and DH group of Tunnel 2, which must be the same as those specified in the IPsec configurations of Tunnel 2 on Alibaba Cloud. A value of group2 indicates modp1024. if_id_out = 43 # Specify that the XFRM virtual network interface of Tunnel 2 is used as the egress port and ingress port of Tunnel 2. if_id_in = 43 updown = /root/connect_2.sh # Execute the /root/connect_2.sh script to configure routing based on the UP/DOWN status of Tunnel 2. } } } } secrets { ike-vco1 { secret = ChangeMe*** # The PSK of Tunnel 1, which must be the same as that configured for Tunnel 1 on Alibaba Cloud. } ike-vco2 { secret = ChangeMe*** # The PSK of Tunnel 2, which must be the same as that configured for Tunnel 2 on Alibaba Cloud. } }
strongSwanプロセスを再起動します。
vi /etc/strongswan/swanctl/swanctl.conf
ルートを表示
route -n
トンネルのステータスを確認します。
watch swanctl --list-sas
図に示されるように、IPsec − VPN接続は、ストロングスワン装置とVPNゲートウェイとの間に確立される。
5. 接続性と高可用性のテスト
strongSwanデバイスとVPC間の接続をテストします。
strongSwanデバイスからVPC内のECSインスタンスに
ping
した後にエコー応答パケットが返された場合、接続が確立されます。ping <The IP address of an ECS instance in the VPC>
IPsec-VPN接続の高可用性をテストします。
接続が有効になったら、アクティブなトンネルを閉じます。
アクティブトンネルを閉じるには、アクティブトンネルの事前共有キーを変更します。 アクティブなトンネルは、トンネルの両側が異なる事前共有鍵を使用するときに閉じられる。
アクティブなトンネルを閉じた後、
ping
コマンドを実行して接続を確認できます。 ECSインスタンスのping
後にエコー応答パケットが返された場合、アクティブなトンネルがダウンした後にスタンバイトンネルが引き継ぐことを示します。
よくある質問
IKEv1はstrongSwanを使用して作成されたIPsec-VPN接続でサポートされていますか?
はい。
IKEv1を使用するには、/etc/strongswan/swanctl/swanctl.confファイルの設定時にversion = 1
を指定します。
保護されたデータフローを指定する方法?
保護されたデータフローを指定するには、/etc/strongswan/swanctl/swanctl.confファイルを設定するときに、次のコードブロックの説明に従ってCIDRブロックを追加します。 保護されたデータフローがAlibaba Cloud側のIPsec-VPN接続に指定されていることを確認します。
データセンター側またはAlibaba Cloud側で複数のCIDRブロックを指定する必要がある場合、Alibaba Cloud側のstrongSwanデバイスとIPsec-VPN接続はIKEv2を使用する必要があります。
children {
vco_child1 {
local_ts = 192.168.20.0/24,192.168.50.0/24 # The CIDR block of the data center.
remote_ts = 10.0.0.0/16 # The CIDR block of the VPC.
}
}
NICにパブリックIPアドレスが割り当てられているstrongSwanデバイスを構成するにはどうすればよいですか?
このような非NATシナリオでは、strongSwanデバイス上の可視IPアドレスはパブリックIPアドレスである。 /etc/strongswan/swanctl/swanctl.confファイルの各トンネルのlocal_addrsフィールドを、対応するパブリックIPアドレスに変更する必要があります。
connections {
vco1 {
local_addrs = 1.1.XX.XX # The public IP address assigned to the NIC of the strongSwan device.
}
}
シングルトンネルモードを設定するにはどうすればよいですか?
VPNゲートウェイがシングルトンネルIPsec-VPN接続のみをサポートしている場合は、VPNゲートウェイをアップグレードしてデュアルトンネルモードを有効にすることを推奨します。 IPsec-デュアルトンネルモードのVPN接続は、ゾーン間のディザスタリカバリをサポートします。 これは、ネットワークの高可用性を効果的に高める。 詳細については、「VPN gatewayのアップグレードによるデュアルトンネルモードの有効化」をご参照ください。