ConoHaVPS + Cloudflare で IPv6 に対応する
ConoHa の VPS を IPv6 対応させて、Cloudflare の DNS に設定してみます。
公式記事として IPv6 を VPS へ設定する があるのですが、CentOS での設定方法しか記載されていないので、この記事では Ubuntu でやってみます。
サブドメインのために CNAME を使って対応させる話も含んでいます。
なお、Cloudflare で プロキシ をオンにしている場合、Cloudflare とオリジンサーバ間 を IPv6 対応させる話になります。Cloudflare では Enterprise プランでない限り IPv6 Compatibility がオン になっているためです。
環境
この記事では、サンプルドメインとして example.com
と sub.example.com
を使います。
- 作業日: 2022/11/18, 2022/11/30
- ConoHa VPS
- Ubuntu 22.04.1 LTS
- nginx 1.21.4
- Cloudflare
- ネームサーバを Cloudflare のネームサーバに設定し、Cloudflare で DNS 管理をしていること
作業
ざっくり以下の流れで作業します。
- nginx の設定を確認し、IPv6 が有効になっているかを確認します。
- ConoHa VPS に IPv6 のアドレスを割り当てます。
- Cloudflare の DNS 設定に、AAAA レコードを設定します。必要に応じて、CNAME レコードも設定します。
- プロキシ設定を解除したうえで、
nslookup
を使って設定が反映されていることを確認します。
nginx の設定を確認
nginx の設定を確認し、IPv6 で Listen しているかを確認します。
nginx.conf
などを確認し、listen [::]:80;
などがあるかを確認するか、sudo lsof -i:80
を実行して以下のように IPv6 で Listen しているかを確認してください。
$ sudo lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 20637 root 6u IPv4 73100 0t0 TCP *:http (LISTEN)
nginx 20637 root 7u IPv6 73101 0t0 TCP *:http (LISTEN)
nginx 20638 nobody 6u IPv4 73100 0t0 TCP *:http (LISTEN)
nginx 20638 nobody 7u IPv6 73101 0t0 TCP *:http (LISTEN)
SSL/TLS のポートである 443 番ポートも IPv6 で Listen していることを確認してください。
VPS に IPv6 のアドレスを割り当てる
この項では、以下の 3 つに分割して解説しています。
- VPS に IPv6 アドレスが割り当てられていないかを確認する
- 利用可能な 17 個の IPv6 IP アドレスを確認する
- IPv6 アドレスを割り当てる
VPS に IPv6 アドレスが割り当てられていないかを確認する
ConoHa VPS 上で立てた Ubuntu では[1]、立てた VPS に IPv6 のアドレスが割り当てられていないようです。
検証していた限り環境によってかなり状況が違いそうなので、まずは IPv6 のアドレスが VPS に割り当てられていないかどうかを確認しましょう。
コマンド ip addr show eth0
を実行し、以下のように inet6
から始まる行で 2400:8500:1302:776
から始まる IPv6 のアドレスがあれば割り当てられています。
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 02:01:76:1b:72:94 brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 111.11.111.111/23 metric 100 brd 111.11.111.111 scope global dynamic eth0
valid_lft 64352sec preferred_lft 64352sec
inet6 2400:8500:1302:776:111:11:111:111/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::1:76ff:fe1b:xxxx/64 scope link
valid_lft forever preferred_lft forever
割り当てられていない場合...
inet6
の行はあるものの、リンクローカルアドレスしか設定されていません。
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 02:01:76:1b:72:94 brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 111.11.111.111/23 metric 100 brd 111.11.111.111 scope global dynamic eth0
valid_lft 64352sec preferred_lft 64352sec
inet6 fe80::1:76ff:fe1b:xxxx/64 scope link
valid_lft forever preferred_lft forever
割り当てられていない場合、VPS に IPv6 アドレスを割り当てる必要があります。
VPS に割り当てることが可能な IPv6 アドレスを調べる
まず、VPS に割り当てることのできる IPv6 アドレスとゲートウェイを調べる必要があります。
ConoHa ダッシュボード にアクセスし、対象サーバのページを開きます。
その後、「ネットワーク情報」タブを開き、「タイプ」を「IPv6」に変更します。
ConoHa では 1 つの VPS につき 17 個の IPv6 アドレスが割り当てられている ので、「IP アドレス」欄で 17 個の IPv6 アドレスを確認できます。
どのアドレスを使ってもよいのですが、とりあえずここではわかりやすいように一番上の IP アドレスをメモしておきましょう。
IPv6 アドレスを割り当てる
/etc/netplan/10-gmovps.yaml
を vim
などで開きます。<IPV6-ADDRESS>
を先ほど調べた IPv6 アドレスに、<GATEWAY-ADDRESS>
を先ほど調べたゲートウェイに書き換えた上で書き込んでください。
network:
ethernets:
eth0:
addresses:
- <IPV6-ADDRESS>/64
dhcp4: true
dhcp6: true
accept-ra: false
optional: true
routes:
- to: default
via: <GATEWAY-ADDRESS>
version: 2
書き込んだあと、sudo netplan apply
で適用できます。
適用後、ip addr show eth0
を再度実行し IPv6 アドレスをきちんと割り当てられているかを確認してください。
inet6
から始まる行で 2400:8500:1302:776
から始まる IPv6 のアドレスがあれば割り当てられています。
AAAA レコードを設定する
A レコードを追加するときと同じように、IPv6 版の A レコードである AAAA レコードを追加しましょう。
Cloudflare の DNS 設定から、以下のように AAAA レコードを追加してください。
CNAME レコードを設定する(サブドメインの場合)
sub.example.com
などのサブドメインも IPv6 対応する場合、CNAME レコードを 1 つ追加するだけでサブドメインごとに A レコードと AAAA レコードの 2 つを用意しなくて済むようになります。以下のように設定しましょう。
以下は実際に運用しているサーバの DNS 設定画面なのですが、A レコードと AAAA レコードがそれぞれ 1 つずつしかなく、それに紐づく CNAME レコードが複数あるだけなので見やすくなっています。
設定反映を確認する
Cloudflare では Enterprise プランでない限り IPv6 Compatibility の関係で クライアントと Cloudflare 間 は元から AAAA レコードが存在し IPv6 での接続が可能なので、Proxied されているレコードに関しては安直に nslookup
しても本当に設定できているかわかりません。
したがって、ここでは一時的に Cloudflare のプロキシ設定を解除し nslookup
してみようと思います。
対象レコードの Proxy status
を DNS only
にします。
その後、手元のターミナルから nslookup
してみます。
$ nslookup sub.example.com 1.1.1.1
Server: 1.1.1.1
Address: 1.1.1.1#53
Non-authoritative answer:
Name: sub.example.com
Address: xxx.xx.xxx.xxx
Name: sub.example.com
Address: 2400:8500:1302:776:xxx:xx:xxx:xxx
IPv4 のアドレスだけでなく、IPv6 のアドレスが表示されれば成功です。
-
2021/05 に立てた CentOS 7 のサーバは IPv6 アドレスが割り当てられていたものの、この記事を書いているときに検証で立てた Ubuntu のサーバ[2]では割り当てられていなかったので、よくわかりません。IPv6 の DHCP をオンにしても振られませんでした。 ↩︎
-
ConoHa さん、RAM 512 MB で Ubuntu 22.04 を立てると Kernel Panic する問題をなんとか解決していただけると非常にうれしいです…。参考: Twitter での検索結果 ↩︎
Discussion