Dockerの「jwilder/nginx-proxy」で簡単にSSL化できてしまうというエントリを前回書いたのだけれど,今回はIPv6でもアクセスできるようにしてみたのでやったことのメモ。
前提条件
ドメインのDNSレコードにAAAAレコードを設定しておく。
Value-domainの場合DNS設定のところで次のように記載する。
(この場合「blog」というサブドメインを「2400:8500:1801:413:118:27:27:95
」へポイント)
aaaa blog 2400:8500:1801:413:118:27:27:95
サーバーはConohaのVPS。今時IPv6に対応していないサーバーは珍しいと思うけど,IPv6アドレスが割り振られているか一応確認。
OSはCentOS7,firewalldがサービスとして起動している状態。
今回IPv6にするのはDockerまで。Dockerとコンテナの間はこれまで通りIPv4。
最初はDockerとコンテナの間もIPv6にして,IPv6対応のDockerネットワークを作成したりしてみたけどそこまではしなくてもいいかなと。Dockerネットワーク内はプライベートIPアドレスだし,結局Dockerかませる時点でNAT変換起きてるので。
Nginx-proxyのIPv6有効化
Nginx-proxyのdocker-compose.ymlを以下のように編集する
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- 80:80
- 443:443
volumes:
- ./certs:/etc/nginx/certs:ro
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: always
networks:
- nginx_net
environment:
- ENABLE_IPV6=true
letsencrypt-nginx-proxy-companion:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: nginx-letsencrypt
volumes:
- ./certs:/etc/nginx/certs
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes_from:
- nginx-proxy
restart: always
networks:
- nginx_net
networks:
nginx_net:
external: true
大事なのは「environment:」セクションで「ENABLE_IPV6=true」を指定すること。これでIPv6でListenするようになる。
これでできたかなと思って試してみるができている気配がない。ここから沼にはまる。Docker自体のIPv6設定をしてみたり,DockerネットワークをIPv6仕様のものに作り直してみたりするもののやはりアクセスできず。
このNginx-proxyを通さない別アプリに直接http://[IPv6アドレス]:ポート番号/でアクセスしてみると表示がされるので,DockerはIPv6アクセスを通している。となると原因はProxy?と疑ってみるもとくにこれ以上の設定はなさそう。
ファイアウォールの設定
しかしふと思い立ってDockerホストから「wget -6 https://blog.shipweb.jp」をしてみると,アクセスできた。となると,怪しいのはファイアーウォール。
Dockerがポートを勝手に開けてくれるのでIPv4の場合,わざわざ手動でポート解放せずアクセスできていたので,IPv6でもそうだろうと思い込んでいたのだけど,それが間違っていたようだ。たしかに,直接直打ちだとアクセスできるポートは,手動でポートをFirewalldで追加していた。試しにFirewalldを停止させてみると,IPv6でのチェックが通った。ということで,firewall-cmdでポート443を追加してやる。
firewall-cmd --add-port=443/tcp
これで,ファイアウォール有効な状態でもIPv6でアクセスができるようになった。なぜかポート80は追加せずともOKだったので追加していない。
参考サイト
自分のWebサイトがIPv6でアクセスできる状態かどうかをチェックできるサイト
IPv6 test
Comments