Azure上にOpenVPN Server(IPv4/IPv6)を立ち上げて接続元IPを固定化する(Part 1:Azure環境準備編)

はじめに

ニューノーマルな時代にかこつける訳ではないですが、リモートワークを行っていく中で、どうしてもそれぞれの自宅のインターネット環境から社外のサーバに繋げる必要があるケースはあると思います。

事前にアクセス元のIPアドレスを申請しておく場合、登録できるアドレスの数の制限や自宅のインターネット環境によっては固定IPアドレスを利用できないケースは多々あるでしょう。

そこで、Azure上の仮想マシンにOpenVPN Serverを立ち上げて、自宅のクライアントPCからはこちらのOpenVPN Server経由でインターネット上の対象サーバへアクセスできる仕組みを作ってみました。

本記事は非常に長くなりますので、3記事に分けて随時公開していく予定です。

  • Part 1:Azure環境準備編 (本記事)
  • Part 2:OpenVPNインストール編 (Coming soon)
  • Part 3:クライアント設定編 (Coming soon)

構築に関する要件

今回はテスト目的ですが以下の要件で作成します。

  • OpenVPN Serverの可用性は考慮しない(1台構成)
  • Azure Marketplaceから利用可能なCanonical Ubuntu server 20.04LTSをベースのOSイメージとする
  • クライアントPCからのOpenVPN Serverへの接続はIPv4にて標準のUDP/1194を利用
  • 接続方法はTUN
  • 認証方法は証明書(PKI)
  • Azure側の仮想ネットワーク、仮想マシンはIPv4/IPv6のデュアルスタックで構成
  • クライアントPCはOpenVPN Server接続後はIPv4の他IPv6接続も全てOpenVPN Server経由とする
  • 利用するDNSサーバはGoogle提供のものを使う(IPv4, IPv6ともに)

参考にしたサイト

正直OpenVPNの構築は素人同然でしたが、以下のサイトの内容が非常にクオリティが高くおすすめです。今回の環境も基本的にはこちらの内容をベースに(IPv6関連は別)構築しました。

Ubuntu 20.04でOpenVPNサーバーをセットアップ・設定する方法

基本的には本連載では同様の手順を記載しながら接続までの流れを記載しますが、説明に不足部分がある場合はこちらのサイトも併せて参照すると良いと思います。

Azure側の構成

IPv4/IPv6のデュアルスタックな仮想ネットワーク、仮想マシンはAzure portalから作れないため、今回はAzure CLI上から行います。

Azure Cloud Shellからの操作が楽だと思います。

Azureの基本的な契約や、Azure Cloud Shellへのアクセス方法などは割愛しています。

全体構成

仮想ネットワーク上に2つサブネットを用意して、DMZサブネット(snet-dmz)上にOpenVPN Server(vmvpngateway01)、Privateサブネット(snet-private)上に証明書の認証用サーバ(vmca01)を準備します。

認証用サーバはOpenVPN Serverの構築後は基本不要となりますので、利用しない間は停止しておくことが出来ます。

環境変数の設定

Azure Cloud Shell(bash)から、まずは環境変数の設定を行います。

変数名が微妙ですが、vmnameはOpenVPN Serverの仮想マシン名、vmname2は認証サーバの仮想マシン名です。適宜内容を修正して、Azure Cloud Shellのコンソール上に貼り付ければ良いと思います。

rgname=rg-test-gateway
location=japaneast

vmname=vmvpngateway01
vmname2=vmca01

nsgname=nsg-dmz
nsgname2=nsg-private
vnetname=vnet-gateway
subnetname=snet-dmz
subnetname2=snet-private

vmid=XXXXXXXX (sshログイン用のユーザ名)
vmpassword=XXXXXXXX (sshログイン用のパスワード)

リソースグループの作成

以下のコマンドでリソースグループを作成します。

az group create \
    --name $rgname \
    --location $location

Network Security Group(NSG)の作成

仮想ネットワーク上のそれぞれのサブネット(DMZ, Private)用にNSGを作成します。

DMZサブネット用のNSGでは、ssh(TCP/22)とOpenVPN(UDP/1194)をフルオープンにしていますが、こちらは必要に応じて適宜パラメータを変更して接続元を絞るなどの対応をしてください。Azure CLIでの変更が困難な場合は、こちらのコマンド実行後にAzure portalからGUIを使って変更しても大丈夫です。

# Create NSG(DMZ)
az network nsg create \
    --name $nsgname \
    --resource-group $rgname \
    --location $location

# Create inbound rule for port 22 for DMZ
az network nsg rule create \
    --name allowSSHIn \
    --nsg-name $nsgname \
    --resource-group $rgname \
    --priority 100 \
    --description "Allow SSH In" \
    --access Allow \
    --protocol "Tcp" \
    --direction Inbound \
    --source-address-prefixes "*" \
    --source-port-ranges "*" \
    --destination-address-prefixes "*" \
    --destination-port-ranges 22

# Create inbound rule for port 1194 for DMZ
az network nsg rule create \
    --name Allow_OpenVPN_UDP \
    --nsg-name $nsgname \
    --resource-group $rgname \
    --priority 2000 \
    --description "Allow_OpenVPN_UDP" \
    --access Allow \
    --protocol "Udp" \
    --direction Inbound \
    --source-address-prefixes "*" \
    --source-port-ranges "*" \
    --destination-address-prefixes "*" \
    --destination-port-ranges 1194

# Create NSG(Private)
az network nsg create \
    --name $nsgname2 \
    --resource-group $rgname \
    --location $location

仮想ネットワークの作成

以下のコマンドで仮想ネットワークを作成します。

作成時に上で準備したNSGも一緒にサブネットに設定しています。

CIDRですが、IPv4用のアドレスレンジとしては 10.128.128.0/24 と決めました。IPv6のプレフィクスはDMZ用、Private用でそれぞれfc00::/64、fc01::/64としましたが、仮想ネットワーク作成時(サブネットではない)には/48にしないとうまく通らなかったりするので、以下の例の通りにすれば良いと思います。

アドレス範囲が他のネットワーク(Azureに限らず)とかぶる場合は適宜修正してください。

# Create the virtual network
az network vnet create \
    --name $vnetname \
    --resource-group $rgname \
    --location $location \
    --address-prefixes "10.128.128.0/24" "fc00::/48" "fc01::/48"

# Create a single dual stack subnet
az network vnet subnet create \
    --name $subnetname \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --address-prefixes "10.128.128.0/28" "fc00::/64" \
    --network-security-group $nsgname

# Create a single dual stack subnet
az network vnet subnet create \
    --name $subnetname2 \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --address-prefixes "10.128.128.32/28" "fc01::/64" \
    --network-security-group $nsgname2

OpenVPN Server仮想マシン作成

Public IPは固定化したものをIPv4用、IPv6用それぞれ作成します。

その後NIC作成でipconfigとして2つのPublic IPを追加後に、仮想マシンを作成します。

仮想マシンのイメージはCanonical Ubuntu Server 20.04LTSの最新版を利用します。

今回は検証目的なのでおサイフに優しいStandard_b2sをStandardSSDで利用します。

# Create an IPV4 IP address
az network public-ip create \
    --name pip-${vmname}-v4 \
    --resource-group $rgname \
    --location $location \
    --sku standard \
    --allocation-method static \
    --version IPv4

# Create an IPV6 IP address
az network public-ip create \
    --name pip-${vmname}-v6 \
    --resource-group $rgname \
    --location $location \
    --sku standard \
    --allocation-method static \
    --version IPv6

# Create NICs
az network nic create \
    --name nic-${vmname} \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --subnet $subnetname \
    --private-ip-address-version IPv4 \
    --public-ip-address pip-${vmname}-v4 \
    --ip-forwarding

az network nic ip-config create \
    --name ifconfig-v6 \
    --nic-name nic-${vmname} \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --subnet $subnetname \
    --private-ip-address-version IPv6 \
    --public-ip-address pip-${vmname}-v6

# Create VM
az vm create \
    --name $vmname \
    --os-disk-name disk-${vmname} \
    --storage-sku StandardSSD_LRS \
    --resource-group $rgname \
    --nics nic-${vmname} \
    --size Standard_b2s \
    --admin-username $vmid \
    --admin-password $vmpassword \
    --image Canonical:0001-com-ubuntu-server-focal:20_04-lts:latest

認証サーバ仮想マシン作成

こちらはPublic IPを持たずに、OpenVPNサーバ経由でssh接続して利用する想定であるほか、IPv6での接続も不要なので、以下の手順でシンプルに作成します。

# Create NICs
az network nic create \
    --name nic-${vmname2} \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --subnet $subnetname2 \
    --private-ip-address-version IPv4

# Create VM
az vm create \
    --name $vmname2 \
    --os-disk-name disk-${vmname2} \
    --storage-sku StandardSSD_LRS \
    --resource-group $rgname \
    --nics nic-${vmname2} \
    --size Standard_b1s \
    --admin-username $vmid \
    --admin-password $vmpassword \
    --image Canonical:0001-com-ubuntu-server-focal:20_04-lts:latest

接続確認

外部PCからsshでvmvpngateway01に割り当てられたIPアドレス(IPv4でもIPv6どちらでも可)にて接続します。この時点ではUbuntu内のiptables(ufw)は設定していないので、NSGで許可している送信元アドレスから接続できると思います。

先にも書きましたが念の為、送信元IPアドレスはNSGで絞りましょう。同じTCP/22(ssh)のポートを絞る場合でも、NSGの受信セキュリティ規則は2行に分ける必要があります。IPv4アドレスとIPv6アドレスそれぞれ絞ります。

以下の画面例では先に作成した優先度100のSSH受信ルールは削除して、新たに1000と1010に特定の宛先からのみssh接続ができるように変更しています。

クライアントPCのコマンドプロンプト等からsshで接続できることを確認しましょう。

C:\>ssh XXXXXXXX@2603:1040:XXXX:XXXX::XXXX (IPv6アドレスの場合)

C:\>ssh XXXXXXXX@20.48.XX.XX (IPv4アドレスの場合)

おわりに

今回の記事はここまでです。

AzureでIPv4, IPv6のデュアルスタックな仮想ネットワーク、仮想マシン環境を作成する方法の紹介でしたが、この手順はOpenVPN Serverの構築だけではなく、色々と応用がきくと思います。

続きの手順については随時記事を公開していきますので、ご期待ください。(2021/4末までに公開予定)

  • Part 1:Azure環境準備編 (本記事)
  • Part 2:OpenVPNインストール編 (Coming soon)
  • Part 3:クライアント設定編 (Coming soon)