してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

Apache HttpdのIPv6の設定と確認

さて、仕上げに、IPv6対応のHTTPDを設定します。

とはいえ、コチラで、インストールした場合、FreeBSD, NetBSD, OpenBSD は除く、多くのOSでは、configureにおいて、 --enable-v4-mappedがデフォルトで含まれるため、80番も443番も、IPv4とIPv6の両方をバインドする状態になっています。

FreeBSD, NetBSD, OpenBSD の方はコチラの方法に、--enable-v4-mappedを追加して、./configureを行い、コンパイルし直してください。

あとは、注意事項的な部分と、確認方法がメインです。

httpd.confの設定

まず、以下のファイルを確認します。

# vi /usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
(…省略…)
Listen 80
(…省略…)

このように、ポート番号だけならIPv6のアドレスもバインドされます。

ここに、Listen 192.168.1.1:80のように、IPv4アドレスとポート番号が並んだ記述になっていたら、これを上記のようにポート番号(80)だけにします。

それが難しい場合は、 以下のように、続けて、IPv4とIPv6のListenディレクティブを並べます。

# vi /usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
(…省略…)
Listen 192.168.1.1:80
Listen [240d:XXXX:XXXX:XXXX::2]:80
(…省略…)

IPv6のアドレスは、[]の括弧でくくります。

この表記は、ブラウザからIPv6アドレスで直接アクセスする場合に、アドレスバー入力する際にも使用します。

同じように、<VritualHost [IP ADDR]:[PORT]>の設定も確認します。

IPv4のアドレスが入っていると、IPv6では無視されて、デフォルト設定が利用されてしまいます。

手っ取り早くは、以下のように、アスタリスクをIPアドレスの部分に使用します。

# vi /usr/local/apache2/conf/extra/httpd-ssl-vhosts.conf
/usr/local/apache2/conf/extra/httpd-ssl-vhosts.conf
<VirtualHost *:443> <=IPv4とIPv6共通の設定にしたい場合
(…省略…)
</VirtualHost>
(…省略…)
<VirtualHost [240d:XXXX:XXXX:XXXX::2]:443> <=IPv6だけの設定
(…省略…)
</VirtualHost>

 

続いて、HTTPS側も、同様に確認します。

# vi /usr/local/apache2/conf/extra/httpd-ssl.conf
/usr/local/apache2/conf/extra/httpd-ssl.conf
(…省略…)
Listen 443
(…省略…)

ここもポート番号(443)だけになるようにしますが、IPv4が複数乗っているホストで、そのうち一つのIPv4アドレスだけをWebサーバに割り当てたい場合などは、Listenを並べて,IPv4の設定に加えて、IPv6の設定も記述します。

必要に応じて、apachctl -tで、設定ファイルの間違いが無いことを確認の上、下記のように

# /usr/local/apache2/bin/apachctl -t
Syntax OK
# /usr/local/apache2/bin/apachctl stop
# /usr/local/apache2/bin/apachctl start

として、再起動します。

IPv6で動作しているか確認

OpenSSL1.0.2はOSによっては、優先的にIPv6で通信するようですが、IPv4でしか動作しない環境もあるようです。

たいていの環境で、試せる方法を探してみたのですが、nghtp2はAAAAレコードがあれば、そちらを優先するようなので、これで確認してみます。

まずは、いつも通りnghttpでアクセスしてみます。

コチラの方法でOSとは別にOpenSSLをソースからインストールした方は、LDライブラリパスの設定が必要ですので、コチラを参考にしてください。

$ nghttp -v -s https://example.com
[  0.001] Connected
The negotiated protocol: h2
[  0.013] recv SETTINGS frame <length=6, flags=0x00, stream_id=0>
          (niv=1)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[  0.013] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
          (window_size_increment=2147418112)
[  0.013] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.013] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
(…省略…)

これだけでは、IPv4なのか、IPv6なのかは判別できません。そこでログを見てみます。

当サイトで紹介したのログ取得設定をしている場合、以下のようなログになります。

# tail /var/log/https/example.com/access_log.20160520
2408:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX "2016-05-20 04:51:15 +0900" TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 20738 209-1 - GET "/index.html" "" HTTP/2 304 0 "https://example.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36" "PUSHED" 1

このように、IPv6アドレスがログに残っていれば成功です。

IPアドレスが長くなったこと以外に違いはありません。TLSバージョンと、暗号スイートも確認できます。

なお、IPv6対応をチェックしてくれるサイトもあります。

ipv6 test - Website IPv6 accessibility validator - >> http://ipv6-test.com/validate.php
NEXT >> トップページに戻る

©Copyrights 2015-2023, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。