本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「パブリックIPをIPv6だけ持つAzure VMを立てて引っかかったポイント集」を再編集したものです。
こんにちは、毛利です。スマホのモバイル回線にIPv6が振られていることに最近気づいてびっくりしました。この記事ではパブリックIPをIPv6だけ持つAzure VMを立てるとき・立てた後に引っかかったポイントについて書きます。注意点として、この記事は2022年11月1日時点での状況に基づいています。今後これらの引っかかりポイントは解消されていくと思われます。
背景
私は趣味でもAzureを使っているのですが、IPv4のPublic IP Address代が趣味用にはコスパが悪いなぁと思いました。そこで、料金が発生しないIPv6のPublic IP Addressだけ使うことで料金を削減しようとしました。そうしたらありとあらゆるポイントで引っ掛かったので、それらをまとめました。
前半はパブリックIPをIPv6だけ持つVMの構築方法、後半はVMを使う上で引っ掛かった点についてになります。
VM構築編
まずはPublic IPアドレスをIPv6だけ持つVMの構築方法について書きます。説明はAzure Portalでの操作を元にしています。
最初の罠ですが、いつも通りPortalから新規VMを作成…を行なうとPublic IPにIPv6を指定できませんでした。また、新規VM作成の画面からVNetにIPv6のアドレス空間を設定できないようです。というわけでVNetのアドレス空間追加やPublic IP Address作成を別で行なう必要があります。
1. VM作成
PortalからVMの作成を行なってください。設定上の注意点は以下の通りです。
VNetは既存のものを選択するか新規作成
パブリックIPは「なし」に設定
この記事ではインフラストラクチャー冗長を使わないとして書きました。なんらかの冗長構成を取る場合はPublic IP Addressの作成時に適切に選択をしてください。
2. VNetでIPv6を使えるように設定
作成した、もしくは既存のVNetでIPv6を使えるように設定します。
まずは、IPv6のアドレス空間を設定します。設定はVMに割り当てたVNetの設定のアドレス空間タブを開いてください。
設定するアドレス空間はユニークローカルアドレスの使える範囲(fd00::/8)から持ってこれば大丈夫です。この記事ではfd00::/48で説明します。ちなみに時々見かける2001:db8::/32下のIPアドレスは例示用なので設定しないようにしましょう。
設定したら保存を押してアドレス空間の設定は終わりです。
次はサブネットにIPv6の空間を設定します。VNetの設定のサブネットタブを開き、VMが使っているサブネットを選択し、設定画面を開いてください。
設定画面を開いたら、「IPv6アドレス空間の追加」にチェックを入れ、「IPv6アドレス空間」にアドレス空間で設定した範囲からサブネットの範囲を入れてください。この記事ではfd00::/64で説明します。
設定したら保存を押してサブネットの設定は終わりです。
3. IPv6のPublic IP Addressを作成、VMに割り当て
次にIPv6のPublic IP Addressの作成、割り当てをします。
まずIPv6のPublic IP Addressの作成を行ないます。Portalから新規Public IP Addressの作成を行なってください。作成時の設定は以下の通りです。
IPバージョン:IPv6
SKU:Standard
可用性ゾーン:ゾーンなし(これはVMの冗長構成等に合わせて適切に選んでください)
Public IP Addressを作成できたら、VMに割り当てをします。PortalのVMの設定画面から ネットワーク → ネットワーク インターフェース(のリンク)→ IP構成 に進み、追加からIP構成を追加します。設定は以下の通りです
IPバージョン:IPv6
パブリックIPアドレス: 関連付けで先ほど作成したIPアドレスを指定
OK、保存を押して設定は完了です。おつかれさまでした。
VM利用編
ここからはVMを使っていく上で引っ掛かったポイントについてです。三段で済まず五段落ち?です。
1. aptが使えなかった
さて、ログインしてとりあえずapt update & apt upgradeするかと思って叩いてみると、できませんでした。
これはデフォルトで設定されているapt用のミラーサーバの azure.archive.ubuntu.com がIPv6でアクセスできないためです。IPv6を使えるミラーサーバーを指定すれば使えるようになります。日本ではJAISTのミラーサーバーなどがIPv6に対応しています。JAISTの場合は以下コマンドで設定を置換できます(sedでよく使われている'/'は他の文字に置き換え可能)。
sudo sed -i 's@azure.archive.ubuntu.com@ftp.jaist.ac.jp/pub/Linux@g' /etc/apt/sources.list
これでaptが使えるようになりました。めでたしめでたし。
2. snapが使えない
さて、aptができたら次はdockerを入れたいですね。私はUbuntuではいつも snap install docker でdockerのインストールをしています。で試すと分かりますが動きません。
これはsnapが現状IPv6に対応していないためです。どうしようもないです(終)。
というわけでdockerのインストールは公式のリポジトリを使う方法を取りましょう。
Install Docker Engine on Ubuntu | Docker Documentation
docker run hello-world が動かないと思いますが、それは次に説明します。
3. Docker Hubからimageのpullができなかった
さて、dockerが使えるようになったことですしdocker pullを…としようとするのですが、これまたできませんでした。
実はDocker Hubのデフォルトのアクセス先はIPv6に対応していません。ただし、IPv6対応のベータ版のサーバーがあり、 そのサーバを使うとIPv6経由でpullできるようになります。具体的には以下の通りです。
名前空間なしの場合(Official): registry.ipv6.docker.com/library/{image名}
例: docker pull registry.ipv6.docker.com/library/hello-world
名前空間ありの場合: registry.ipv6.docker.com/{namespace名}/{image名}
例: docker pull registry.ipv6.docker.com/grafana/grafana
これでDocker Hubからのpullができるようになりました。めでたしめでたし。
4. Azure Key Vault、Azure Cosmos DBに疎通しなかった
さて、dockerも使えるようになったことですし、なんらかのアプリケーションを動かしていきたいですね。
というわけでAzure Key VaultとAzure Cosmos DBを使う自作アプリケーションを使え…ませんでした。
これらのサービスもIPv4でしかアクセスできないようです。解決方法ですが、サービスエンドポイントを使ってローカルのIPv4でアクセスできるようにすると使えます。サービスエンドポイントを設定しましょう。他のAzureのサービスでもIPv4でしかアクセスできない場合は同様の対応で解決すると思います。
5. GitHubからリポジトリをcloneできない
さて、GitHubからリポジトリをcloneして…と思うのですが、これもできません。
解決方法ですが、どうしようもないです(終)。自分のコードならいくらでも手はありますが、公開されているコードだとどうしようもないです。GitHub PagesはIPv6に対応しているようなので、そのうち対応してくれることを祈りましょう。
参考: IPv6 support for cloning Git repositories · Discussion #10539 · community (github.com)
おわりに
思っていたよりもIPv6 onlyにやさしくない世界でびっくりしました。この記事を読んでいただいた皆様はIPv6 onlyに対応したサービスを展開してくださいね。
毛利 真士/FIXER
三重県出身の毛利真士です 趣味は競プロ、Rust、サーバー周り、自作言語・コンパイラなどなどです