IPv6 で IPv6 Ready なサーバの Nginx にアクセスしようとしたら 404 になったのと IPv6 のこれからの話し

IPv6 で自分のブログ(:80)にアクセスしたら 404 になってた件について

私のブログのリファラを辿ってどこからリンクされているのかなと興味があって見てみたのが発端。
なんかはてなブログから参照されているなーと思って私のブログへのリンクが貼られているのに加えてちょっと上に iframe の埋め込みと思われる Nginx の 404 画面が表示されていた。

はてなブログにほほえまーって思ってたらほほえましいのは私の方だった。
そして自分のブログへのリンクを踏んだら 404 になった。
リダイレクトされるはずだと思ってたが Nginx 404 になってる。
もしかして iframe で表示されてた 404 は私のサーバの Nginx が吐き出していたのである。

ここでの原因は Nginx 自身は IPv4 でしかリッスンしない設定になっていたことによるものである。

80 番ポートなんてリダイレクト専用のバーチャルホスト設定する以外に使わない。
こうでもしないと気付かなかったでしょう。

半年前ぐらいに、はてなブログから自分で持ってるこの WordPress ブログに移行してリダイレクトも設定したのだが
リダイレクトの設定したのははてなと WordPress の記事 URL の体系が異なっていたため。
旧来の記事参照アクセスはしばらくこのはてなブログの URL 体系でアクセスしてくるとかんがえられるため 301 リダイレクトをかましている。

IPv6 は最近のキャリア(ISP)はデフォルトでデュアルスタックでインターネット接続可能な IPv6 アドレスを払い出しているので、限界集落一歩手前の実家もご多分に漏れず IPv6 アドレスが払い出されていた。

さくらの VPS 上にサーバーを構築しているので IPv6 GUA(Global Unicast Address) はデフォルトで付与されていたので Route 53 に DNS レコードとして AAAA レコードも一緒に登録しておいたのでした。
IPv6 で遊んでみたいというのもあった。

Nginx のログを抜粋。ちなみに IPv6 のプレフィックスはドキュメント用のものに置換してあります。
IPv4 用の TEST-NET があったり、ドメイン名を example.com にするのと同様に IPv6 にも TEST-NET 相当のものがあります。

2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:12:59 +0900] "GET /entry/2014/11/09/232916 HTTP/1.1" 404 564 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Geck
o) Chrome/63.0.3239.84 Safari/537.36" "-"


2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:24:34 +0900] "GET /entry/2014/11/09/232916 HTTP/1.1" 404 564 "http://example.com/entry/2015/08/02/022855" "Mozilla/5.0 (Macintosh; Intel Mac
 OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" "-"


2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:29:54 +0900] "GET /entry/2014/11/09/20141109232916/ HTTP/1.1" 404 63388 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML
, like Gecko) Chrome/63.0.3239.84 Safari/537.36" "-"

2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:30:55 +0900] "GET /embed/2014/11/09/232916 HTTP/1.1" 404 63358 "http://example.com/entry/2015/08/02/022855" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" "-"

IPv6 からのアクセスとなっている。
盛大に自分のブログが見れなくなってれば実家についてさて記事書くぞと思ったら気付くはずだったんですが、
SSL 版は default の設定が入っていたので影響を受けなかったのでした。

/embed/ アクセス oEmbed があったのでそのリダイレクトルールも追記しておいた。
こうゆう標準的な埋め込みプロトコルアクセスもあるのね。

Before

server {
    listen 80;

    # from hatenablog access (normal)
    rewrite ^/entry/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.+)$ https://blog.pg1x.com/$1/$2/$3/$1$2$3$4/ permanent;
    rewrite ^(.*)$ https://blog.pg1x.com$1 permanent;

}

server {
    listen 443 default ssl;

After

server {
    listen 80;
    listen [::]:80;

    # from hatenablog access (normal)
    rewrite ^/entry/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.+)$ https://blog.pg1x.com/$1/$2/$3/$1$2$3$4/ permanent;
    # from hatenablog access (oEmbed)
    rewrite ^/embed/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.+)$ https://blog.pg1x.com/$1/$2/$3/$1$2$3$4/embed permanent;
    rewrite ^(.*)$ https://blog.pg1x.com$1 permanent;

}

server {
    listen 443 default ssl;
    listen [::]:443 ssl;

重要なのは listen [::]:80, [::]:443 の記述です。

また、 1.3.4 以上の Nginx であれば ipv6only=on は不要です。

Option ipv6only=on might not be needed anymore and on the contrary potentially create issues.

http://nginx.org/en/CHANGES

Changes with nginx 1.3.4 31 Jul 2012

*) Change: the “ipv6only” parameter is now turned on by default for
listening IPv6 sockets.

[wnoguchi@mx1 ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
http://blog.pg1x.com/entry/2014/11/09/232916
http://blog.pg1x.com/entry/2014/08/12/175950-mac-mavericks-vagrant-omnibus-nokogiri-install-failure

リダイレクトも、 oEmbed もうまく表示されるのを確認したらこれで完了。

これからの IPv6 の話をしよう

これからは IPv6 だと 10 年以上前に言われてぜんぜん IPv4 グローバル IP アドレスがなくなる気配を見せず、当時は IPv6 は私の生きている間にメジャーとなるのだろうかと思っておりました。
どっかで 「 IPv4 は石油みたいなもんだからな 」というブコメを見てなるほどなと思いました。

こうして今に至るわけですが、最近になってじわりじわりと確実にグローバル IPv6 アドレスが浸透しているのを感じます。
Google は普通に IPv6 に対応してるし、 AWS EC2, VPC も IPv6 に対応し始めている。
NURO も INTERLINK も au光 も、UQ WiMAX 等のモバイルルータもデフォルトで IPv6 を払い出しています。
たぶんインターネット接続を電気水道ガスと同じ感覚で使っている人たちは IPv6 が広まってきていることには気付かないと思います。
まあ、気づかないうちに IPv6 が広まっていくのが理想だと思います。
こうしてインターネットはありふれたインフラとなっているわけですね。
IPv4 がレガシーな Layer 3 プロトコルになるのも近いなと思った次第です。

しかし先日のMITのクラスA IPアドレスを一部 Amazon に売却したのには驚いた。
クラスA グローバルIPアドレスなんて滅多なことではお目にかかれない。
具体的には 18.145.0.0/16 のネットワークを売ったのかな?
ゆうに 65536 個(ネットワークアドレスとブロードキャストアドレスを除けば 65534 個)の連続したアドレス空間。

  1. MIT No Longer Owns 18.0.0.0/8 – Slashdot
  2. Whois-RWS
  3. MIT no longer owns 18.0.0.0/8

よーし、おじさん iperf3 でネットワークの帯域測定しちゃうぞー(上り編)

iperfの使い方 | CCNA対策から学ぶネットワーク運用ガイド

$ iperf3 -v
iperf 3.1.3
Darwin Wataru-no-MacBook-Air.local 15.6.0 Darwin Kernel Version 15.6.0: Mon Aug 29 20:21:34 PDT 2016; root:xnu-3248.60.11~1/RELEASE_X86_64 x86_64
Optional features available: sendfile / zerocopy

上り側(サーバー)

その前に F/W のポートをあけておく。

別に永続的に開けたいわけではないので --permanent はつけない

firewall-cmd --zone=public --add-port=5201/tcp
# iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

iperf3 ではデフォルトリッスンポート 5201/tcp なのだろうか。

下り側(クライアント)

iperf3 -c 192.0.3.4
Connecting to host 192.0.3.4, port 5201
[  4] local 192.168.0.2 port 63051 connected to 192.0.3.4 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  10.9 MBytes  91.6 Mbits/sec
[  4]   1.00-2.00   sec  11.1 MBytes  93.3 Mbits/sec
[  4]   2.00-3.00   sec  9.70 MBytes  81.4 Mbits/sec
[  4]   3.00-4.00   sec  11.4 MBytes  96.0 Mbits/sec
[  4]   4.00-5.00   sec  11.2 MBytes  93.7 Mbits/sec
[  4]   5.00-6.00   sec  11.3 MBytes  94.7 Mbits/sec
[  4]   6.00-7.00   sec  11.3 MBytes  94.5 Mbits/sec
[  4]   7.00-8.00   sec  11.0 MBytes  92.7 Mbits/sec
[  4]   8.00-9.00   sec  11.4 MBytes  96.0 Mbits/sec
[  4]   9.00-10.00  sec  11.3 MBytes  95.2 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec   111 MBytes  92.9 Mbits/sec                  sender
[  4]   0.00-10.00  sec   110 MBytes  92.5 Mbits/sec                  receiver

iperf Done.

上り側では次のような結果が出ている

-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.0.2.123, port 63050
[  5] local 192.0.3.4 port 5201 connected to 192.0.2.123 port 63051
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  10.4 MBytes  87.2 Mbits/sec
[  5]   1.00-2.00   sec  11.2 MBytes  93.8 Mbits/sec
[  5]   2.00-3.00   sec  9.68 MBytes  81.2 Mbits/sec
[  5]   3.00-4.00   sec  11.3 MBytes  95.1 Mbits/sec
[  5]   4.00-5.00   sec  11.1 MBytes  93.4 Mbits/sec
[  5]   5.00-6.00   sec  11.3 MBytes  95.0 Mbits/sec
[  5]   6.00-7.00   sec  11.3 MBytes  94.5 Mbits/sec
[  5]   7.00-8.00   sec  11.2 MBytes  93.7 Mbits/sec
[  5]   8.00-9.00   sec  11.3 MBytes  94.9 Mbits/sec
[  5]   9.00-10.00  sec  11.3 MBytes  95.0 Mbits/sec
[  5]  10.00-10.01  sec   112 KBytes   102 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.01  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.01  sec   110 MBytes  92.4 Mbits/sec                  receiver

用が済んだら Ctrl+C でプロセス殺す。

ポートも閉じる。

firewall-cmd --zone=public --remove-port=5201/tcp