CloudflareとIPv6でMAP-E環境でWebサーバを公開する

Cloudflare WorkersでMAP-E環境でWebサーバを公開する に加え、CloudflareとIPv6を使ってWebサーバを公開することが出来たので記事にしたいと思います。

前回のアプローチとの違い

以前の記事ではMAP-E環境で個別に割り当てられるポート番号を、Cloudflare Workersで80/443でリクエストを受け付け、リバースプロキシする形でWebサーバを公開する方法を紹介しました。
前回の方法ではCloudflare Workersの無料枠制限という制約と、URLリライトが発生する一方、今回はシンプルにMAP-E環境で割り当てられるIPv6アドレスでWebサーバにアクセスさせる方法になります。

構成図.今回drawioで書いてみました

上の図にある通り、CloudflareがIPv4/IPv6 デュアルスタック対応しているため、Webサーバ側がIPv6のみ設定(つまりCloudflare側でAAAAレコードのみ登録)の場合でも、Cloudflare側がAAAAレコードを参照してクライアントがIPv4からのアクセスにも応答が可能です。
いってしまえばMAP-E環境関係なく、DS-Liteや集合住宅などでNAT設定出来ない環境でもWebサーバを公開出来ます。
※あくまでWebサーバのみのプロキシであり、こちらのポート番号のみ可能です。ssh等はCloudflare Spectrum等を利用しないと、プロキシとして使えません。(またはプロキシせずに名前解決して直接アクセスするなど)

FreeBSDのIPv6設定

という事で今回はFreeBSDにIPv6アドレスを付与してCloudflare経由でWebサーバを公開してみようと思います。
MAP-E環境であればHGWやIPv6が有効になっているクライアント等で配布されるIPv6を確認出来るので、割り振るIPv6アドレスを確認します。またはこちらのサイトで確認しましょう。今回は2001:db8:1::123/64を設定するとします。

IPv6の基礎

FreeBSDへのIPv6設定の話の前に、IPv6の基礎的な部分として振り返ると、

  • デフォルトゲートウェイはRA(Router Advertisement)によって広告され、これを元にhost側で設定する。(設定先が分かっていれば、host側でstaticで設定しても良い)
  • IPv6アドレスの設定はSLAAC(Stateless Address Auto Configuration)またはDHCPv6、staticで行う。
    • SLAACで設定しても良いのですが、EUI-64形式でMACアドレスを元にアドレス設定されるので、今回はstaticに設定します。
    • ちなみにクライアント用途でSLAACでMACアドレスを元にしたアドレス設定の場合、アクセス元端末固有のアドレスになりプライバシーの観点から RFC4941 でPrivacy Extensionとして一時アドレスの利用が規定されています。クライアント用途で使うならば一時アドレスに設定したほうが良いです。
  • このスライドのP.16にまとまっています。

IPv6の設定とWebサーバのインストール

FreeBSDへの設定は以下の通りです。

sysrc ifconfig_vmx0_ipv6="inet6 2001:db8:1::123/64 accept_rtadv autoconf"

# 設定後再起動。ifconfigで手動設定、rtsol -D vmx0 などで再起動なしで設定も可能
reboot

RAからデフォルトルートのみ設定し、IPアドレスはstaticで設定するために色々調べていたのですが、autoconfフラグをstaitcに設定するIPアドレスに追加することで、SLAACによるIPアドレス設定を無効化出来ました。

次にWebサーバ公開のため、nginxをインストールします。

pkg install nginx
sysrc nginx_enable="YES"

nginx.confでIPv6でlistenさせるためにnginx.confに追加設定が必要です。

[email protected]:/usr/local/etc/nginx # diff -u nginx.conf.orig nginx.conf
--- nginx.conf.orig     2022-01-23 09:10:34.118686000 +0000
+++ nginx.conf  2022-01-23 09:08:24.246357000 +0000
@@ -39,6 +39,7 @@

     server {
         listen       80;
+        listen       [::]:80;
         server_name  localhost;

         #charset koi8-r;

あとはserviceコマンドでnginxを起動させればhost側の準備は完了です。必要に応じてipfwでfirewallを利用している場合には、IPv6アドレスの許可ルールも追加設定しておきましょう。 CloduflareのIP rangeはこちらで公開されています。

service nginx start
ipfw add 100 allow ip from { 2400:cb00::/32 or 2606:4700::/32 or 2803:f800::/32 or 2405:b500::/32 or 2405:8100::/32 or 2a06:98c0::/29 or 2c0f:f248::/32 } to me 80

ipfwでaddress block指定が出来るんですね。便利!

Cloudflareの設定

Cloudflare側ではAAAAレコードでWebサーバのIPv6アドレスを指定します。 AAAAレコードを設定

CloudflareはIPv4/IPv6ともに対応しているので、IPv4からのアクセスもCloudflareを経由させる事でWebサーバの公開が可能です。

まとめ

今回Cloudflareを経由してIPv6でWebサーバを公開する方法を紹介しました。IPv4でwell-knownポートでNAPT出来ない環境でもWebサーバの公開が可能であるため、MAP-EやDS-Lite、集合住宅でHGWの設定が出来ない環境など、ネットワークの環境制約が緩和出来ると思います。IPv6様様ですね。
冒頭書いた通り、Cloudflareがプロキシするポートは限定されているため、sshなどはIPv6でアクセスするしかないので、モバイル通信キャリアなどを選ぶときには注意しておくとよいと思います。といっても今どきIPv6対応していないキャリアはないと思いますが…海外に行ったときに気になるぐらいですかね。(今のご時世を考えるとそんなケース無さそうなのと、アメリカとかは日本よりIPv6の普及が進んでいたはず)
取りあえず今回の方法は以前の記事より使い勝手が良いと思うので、今後はIPv6を積極的に活用していきたいと思います!

Share Comments こ>のエントリーをはてなブックマークに追加
comments powered by Disqus