AzureのVPN GatewayでオンプレミスLinuxサーバーとVNetをIPsecで接続する方法|サイト間VPN設定の実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのVPN GatewayでオンプレミスLinuxサーバーとVNetをIPsecで接続する方法|サイト間VPN設定の実践手順
「オンプレのLinuxサーバーとAzure VNetをVPNで安全に繋ぎたいが、何から手をつければいいかわからない」
クラウド移行の過渡期や、既存の物理サーバーをすぐに廃止できない現場では、このような相談がよく出てきます。AzureのVPN Gatewayを使えば、オンプレミスネットワークとAzure VNetをIPsec(IKEv2)の暗号化トンネルで安全に接続できます。

この記事では、Azure VPN GatewayとLinuxのIPsecソフトウェア「strongSwan」を組み合わせたサイト間VPN(Site-to-Site VPN)の構築手順を、azコマンドの実行ログとともに解説します。GatewaySubnetの設計から、Local Network Gatewayの設定、strongSwanの設定ファイル記述、疎通確認まで手順を網羅します。

動作確認環境:Azure CLI 2.61 / RHEL 9.4・Ubuntu 24.04 LTS / strongSwan 5.9

この記事のポイント

・az network vnet-gateway createでVPN Gatewayを作成(完了まで20~45分かかる)
・GatewaySubnetは/27以上が必須・サブネット名は「GatewaySubnet」固定
・オンプレLinuxにstrongSwanを導入しipsec.conf・ipsec.secretsで接続を定義する
・接続後はaz network vpn-connection showとpingで疎通を確認する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

サイト間VPNとはオンプレとAzureをIPsecで繋ぐ仕組み

Azureの「VPN Gateway」は、オンプレミスのネットワークとAzure仮想ネットワーク(VNet)をIPsecトンネルで繋ぐためのマネージドゲートウェイサービスです。接続の種類として「サイト間VPN(S2S)」「ポイント対サイトVPN(P2S)」「ExpressRoute」がありますが、この記事では拠点(オンプレ)とAzureを繋ぐS2S VPNを扱います。

Azure側のS2S VPN構築に必要なリソースは4種類です。
GatewaySubnet:VPN Gateway専用のサブネット(名前を「GatewaySubnet」固定・変更不可)
VPN Gateway:IPsec終端とルーティングを担うAzureマネージドゲートウェイ
Local Network Gateway:オンプレミス側のパブリックIPとネットワーク範囲を定義するリソース
Connection:VPN GatewayとLocal Network Gatewayを紐づける接続オブジェクト

接続の流れはIKEv2による2フェーズのネゴシエーションです。まずIKE Phase1でSA(Security Association)を確立し、次にIKE Phase2でIPsecトンネルを確立します。確立後はオンプレの内部IPからAzure VNet内のプライベートIPへ、暗号化された通信が通ります。

AWSのSite-to-Site VPNと比べると、Azure側は「Customer Gateway」に相当する概念がLocal Network Gatewayとして独立したリソースになっている点が異なります。設定の流れは同じIPsecですが、リソース名称と作成順を覚えておくことが大切です。

今回の構成と前提条件

今回の手順では次の構成を前提とします。

Azure VNet CIDR:10.1.0.0/16
GatewaySubnet:10.1.255.0/27
アプリケーション用サブネット:10.1.1.0/24
オンプレミスネットワーク:192.168.0.0/24
オンプレLinuxのパブリックIP:固定グローバルIPが必要(NAT環境は追加設定が必要)

前提条件を確認してください。
・Azure CLIがインストール・ログイン済み(az account showで確認)
・オンプレLinuxに固定グローバルIPがある(またはNATアドレスが固定)
・オンプレLinuxのファイアウォールでUDP 500・4500が通過できる
・strongSwanをインストールできるsudo権限がある

Azure側の設定手順

1. リソースグループとVNetを作成する

まずリソースグループとVNetを用意します。既存のVNetを使う場合はこのステップを省略してください。

# リソースグループを作成 az group create \ --name rg-s2s-vpn \ --location japaneast # VNetを作成(まず汎用サブネットのみ定義し、GatewaySubnetは後の手順で追加) az network vnet create \ --resource-group rg-s2s-vpn \ --name vnet-hub \ --address-prefix 10.1.0.0/16 \ --subnet-name subnet-app \ --subnet-prefix 10.1.1.0/24

2. GatewaySubnetを追加する

GatewaySubnetの作成は、サブネット名を必ず「GatewaySubnet」にしてください。大文字小文字は区別されます。サイズは/27(32アドレス)以上を推奨します。/28では将来的にActiveActive構成へ拡張する際にサイズ不足になるため、最初から/27以上を確保しておくことをお勧めします。

# GatewaySubnetを追加する(名前変更不可・/27以上必須) az network vnet subnet create \ --resource-group rg-s2s-vpn \ --vnet-name vnet-hub \ --name GatewaySubnet \ --address-prefix 10.1.255.0/27

3. パブリックIPとVPN Gatewayを作成する

VPN Gateway用のパブリックIPを確保してから、ゲートウェイ本体を作成します。VPN Gatewayの作成は20~45分かかります。--no-waitで非同期実行し、作業を続けながら待機できます。

# VPN Gateway用パブリックIPを作成(StaticのStandard SKU) az network public-ip create \ --resource-group rg-s2s-vpn \ --name pip-vpngw \ --allocation-method Static \ --sku Standard \ --location japaneast # VPN Gatewayを作成(--no-waitで非同期実行) az network vnet-gateway create \ --resource-group rg-s2s-vpn \ --name vpngw-hub \ --vnet vnet-hub \ --public-ip-address pip-vpngw \ --gateway-type Vpn \ --vpn-type RouteBased \ --sku VpnGw1 \ --no-wait # 作成状況を確認(Succeeded になるまで数分おきに確認する) az network vnet-gateway show \ --resource-group rg-s2s-vpn \ --name vpngw-hub \ --query "provisioningState" -o tsv

作成完了後、VPN GatewayのパブリックIPを取得しておきます。このIPをオンプレ側strongSwanの設定に使います。

# VPN GatewayのパブリックIPを取得 az network public-ip show \ --resource-group rg-s2s-vpn \ --name pip-vpngw \ --query ipAddress -o tsv # 出力例(このIPをstrongSwanのrightに設定する) 40.74.xxx.xxx

4. Local Network Gatewayを作成する

Local Network Gatewayは「オンプレミス側の情報」をAzureに登録するリソースです。オンプレのパブリックIPとルーティング先のネットワーク範囲を指定します。

# Local Network Gatewayを作成 # --gateway-ip-address : オンプレLinuxの固定グローバルIP # --local-address-prefixes : オンプレの内部ネットワーク(複数指定可) az network local-gateway create \ --resource-group rg-s2s-vpn \ --name lgw-onprem \ --gateway-ip-address 203.0.113.xxx \ --local-address-prefixes 192.168.0.0/24 \ --location japaneast

5. VPN Connectionを作成する

VPN GatewayとLocal Network Gatewayを紐づけるConnectionを作成します。事前共有鍵(PSK)はopensslで生成した32バイト以上のランダム文字列を使用してください。

# 事前共有鍵(PSK)を生成 openssl rand -base64 32 # 出力例(この値をAzureとstrongSwanの両方に設定する) # 7Xt5vBqN2mP8wRkL4sYjDcHaUeGfZnIo9T3pEyMuAvWX1b6= # VPN Connectionを作成(IKEv2・PSK認証) az network vpn-connection create \ --resource-group rg-s2s-vpn \ --name conn-s2s-onprem \ --vnet-gateway1 vpngw-hub \ --local-gateway2 lgw-onprem \ --connection-type IPsec \ --shared-key "7Xt5vBqN2mP8wRkL4sYjDcHaUeGfZnIo9T3pEyMuAvWX1b6="

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

オンプレミスLinuxサーバー側の設定(strongSwan)

1. strongSwanをインストールする

strongSwanはRHEL 9/Rocky LinuxとUbuntu 24.04 LTSの両方で利用できます。

# RHEL 9 / Rocky Linux 9の場合 sudo dnf install -y strongswan # Ubuntu 24.04 LTSの場合 sudo apt update && sudo apt install -y strongswan strongswan-pki libcharon-extra-plugins # バージョン確認 ipsec version # strongSwan 5.9.x University of Applied Sciences Rapperswil...

2. /etc/ipsec.confを設定する

strongSwanの接続定義ファイルを編集します。leftがオンプレ側(自分)、rightがAzure側(相手)です。暗号スイートはAzureのデフォルト互換であるAES-256・SHA-256・DH Group14(modp2048)を指定します。

# /etc/ipsec.conf config setup charondebug="ike 2, knl 2, cfg 2" conn azure-vpn # 認証・起動設定 authby=secret auto=start type=tunnel keyexchange=ikev2 # オンプレ側(left)の設定 left=%defaultroute leftid=203.0.113.xxx # オンプレのパブリックIP leftsubnet=192.168.0.0/24 # オンプレの内部ネットワーク # Azure側(right)の設定 right=40.74.xxx.xxx # VPN GatewayのパブリックIP rightsubnet=10.1.0.0/16 # Azure VNetのCIDR # 暗号スイート(Azureデフォルト互換・DH Group14=modp2048) ike=aes256-sha256-modp2048! esp=aes256-sha256-modp2048! # ライフタイム(Azureデフォルト値に合わせる) ikelifetime=28800s lifetime=27000s margintime=540s # Dead Peer Detection(DPD) dpddelay=30 dpdtimeout=120 dpdaction=restart

3. /etc/ipsec.secretsを設定する

PSKをipsec.secretsに登録します。フォーマットは「オンプレIP Azure側IP : PSK "鍵文字列"」です。

# /etc/ipsec.secrets 203.0.113.xxx 40.74.xxx.xxx : PSK "7Xt5vBqN2mP8wRkL4sYjDcHaUeGfZnIo9T3pEyMuAvWX1b6="

ファイルの権限をroot読み取り専用に設定します。

sudo chmod 600 /etc/ipsec.secrets sudo chown root:root /etc/ipsec.secrets

4. strongSwanを起動し接続を確立する

設定ファイルを保存したらstrongSwanを起動します。

# strongSwanを有効化・起動 sudo systemctl enable strongswan sudo systemctl start strongswan # 接続を手動で開始する sudo ipsec up azure-vpn

接続が成功すると以下のようなログが出力されます。

initiating IKE_SA azure-vpn[1] to 40.74.xxx.xxx IKE_SA azure-vpn[1] established between 192.168.0.10[203.0.113.xxx]...40.74.xxx.xxx[40.74.xxx.xxx] CHILD_SA azure-vpn{1} established with SPIs c3a8f1b2_i 7e5d4c6a_o connection 'azure-vpn' established successfully

接続確認と疎通テスト

VPNトンネルが確立されたら、Azure側・オンプレ側の両方から状態を確認します。

Azure CLIで接続状態を確認する

az network vpn-connection show \ --resource-group rg-s2s-vpn \ --name conn-s2s-onprem \ --query "{status:connectionStatus,egress:egressBytesTransferred,ingress:ingressBytesTransferred}" \ -o table # 出力例(Connectedが成功の証) Status Egress Ingress --------- ------ ------- Connected 45231 12087

オンプレLinuxからAzure VNet内のVMへpingを確認する

# Azure VM(10.1.1.4)への疎通確認 ping -c 4 10.1.1.4 # 出力例(オンプレ192.168.0.10からAzure VM 10.1.1.4へ到達確認) PING 10.1.1.4 (10.1.1.4) 56(84) bytes of data. 64 bytes from 10.1.1.4: icmp_seq=1 ttl=63 time=18.4 ms 64 bytes from 10.1.1.4: icmp_seq=2 ttl=63 time=17.8 ms 64 bytes from 10.1.1.4: icmp_seq=3 ttl=63 time=18.1 ms 64 bytes from 10.1.1.4: icmp_seq=4 ttl=63 time=18.3 ms --- 10.1.1.4 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 17.8/18.15/18.4/0.219 ms

strongSwanの詳細な接続状態を確認する(実機出力)

sudo ipsec statusall # 出力例(ESTABLISHEDが成功・転送バイト数が増えていれば通信中) Security Associations (1 up, 0 connecting): azure-vpn[1]: ESTABLISHED 12 minutes ago, 192.168.0.10[203.0.113.xxx]...40.74.xxx.xxx[40.74.xxx.xxx] azure-vpn[1]: IKEv2 SPIs: 8a2c1b4e9f3d7a01_i* 5c7e2a4b6d8f0e3c_r, rekeying in 7 hours azure-vpn{1}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c3a8f1b2_i 7e5d4c6a_o azure-vpn{1}: AES_CBC_256/HMAC_SHA2_256_128, 45231 bytes_i, 12087 bytes_o azure-vpn{1}: 192.168.0.0/24 === 10.1.0.0/16

ハイブリッド構成で名前解決が必要な場合は、AzureのPrivate DNSゾーンとオンプレDNSを連携させる必要があります。LinuxのDNS設定(resolv.conf・nmcliによる設定)の基本はこちらを参照してください。

接続できない時のトラブルシュート

【確認1】IKEネゴシエーションが失敗している場合

journalctl -u strongswan -fでリアルタイムログを確認します。よくあるエラーと対処は次のとおりです。

「no proposal chosen」:ike=またはesp=の暗号スイートがAzure側と一致していない。Azure側でカスタムIPsecポリシーを設定している場合は、そのパラメータとstrongSwanの設定を突き合わせてください
「authentication failed」:ipsec.secretsのPSKがAzure接続のShared Keyと一致していない。PSKにスペースや改行が混入していないか確認してください
「received INVALID_ID_INFORMATION」:leftidに指定したIPがNAT越しの実際のIPと異なる。NAT環境ではleftid=%anyを試してください

【確認2】UDPポートがブロックされている場合

IKEv2はUDP 500でSA確立を行い、NAT越しの場合はUDP 4500(NAT-T)を使用します。オンプレのファイアウォールで開放されているか確認します。

# LinuxのfirewalldでIPsec関連サービスを確認 sudo firewall-cmd --list-services | grep ipsec # 開放されていない場合は追加 sudo firewall-cmd --permanent --add-service=ipsec sudo firewall-cmd --reload # UDPポートの待受を確認(ssコマンド) sudo ss -nulp | grep -E "500|4500"

Linuxのポート確認コマンドの詳細はssコマンドとlsofでポートを確認する方法を参照してください。

【確認3】接続がすぐに切れる場合

DPD(Dead Peer Detection)の設定不一致が原因の場合があります。Azureのデフォルトは30秒間隔・45秒でタイムアウトです。

また、IPsecに必須の要件として時刻同期があります。オンプレとAzure間で時刻がずれているとIKEネゴシエーションが失敗することがあります。LinuxのNTP・時刻同期設定でchronydの動作を確認してください。

接続が確立してもすぐ切れる場合は、Azure側のNSGでオンプレのパブリックIPからのUDP 500・4500が許可されているかも確認が必要です。VPN GatewayのGatewaySubnet向けNSGはデフォルトでは不要ですが、カスタムNSGを適用している環境では意図せずブロックされることがあります。

本記事のまとめ

AzureのVPN Gatewayによるサイト間VPN構築の要点をまとめます。
やりたいこと コマンド・ポイント
GatewaySubnetを作成する az network vnet subnet create --name GatewaySubnet --address-prefix 10.1.255.0/27
VPN Gatewayを作成する az network vnet-gateway create --gateway-type Vpn --vpn-type RouteBased --sku VpnGw1
オンプレ情報をAzureに登録する az network local-gateway create --gateway-ip-address <IP> --local-address-prefixes <CIDR>
VPN Connectionを作成する az network vpn-connection create --connection-type IPsec --shared-key <PSK>
strongSwanで接続を確立する ipsec up azure-vpn(ipsec.conf・ipsec.secrets設定後)
Azure側の接続状態を確認する az network vpn-connection show --query connectionStatus
オンプレ側の接続状態を確認する ipsec statusall(ESTABLISHEDが成功)
VPN Gatewayの作成に20~45分かかるのが最大の待ち時間です。VNetとGatewaySubnetを準備したあとにVPN Gateway作成を--no-waitで走らせ、その間にLocal Network GatewayやオンプレのstrongSwan設定を進めると効率よく作業できます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。