Docker+Nginx-proxyでWebサイトをIPv6化する

blog

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

この記事を書いた人

PHPが好物な個人開発プログラマ。フリーランスエンジニアとしてWebサービス作ったりしてます。15年の経験を生かしてMENTAでメンターもやってます。WordPressやPHPでお困りのことがあればご相談に乗りますのでDMください。

Follow on SNS
blogDocker
SOHO MIND

Comments

タイトルとURLをコピーしました