v4v6 移行が終わらない

解いた人:momom-i

参照した問題・解説のサイト:v4v6 移行が終わらない

問題

おお久しぶり!!

君が居ないあいだに社内ネットワークを IPv6 only にしておいたんだ。外向きの IP アドレスは v4 しかないけどルーターで NAT64 をしているからインターネットにはつながるようになっているよ。

ただ名前解決ができないのと社内ネットワークにある Web に繋がらなくなっちゃったんだ、これ以上は手が付かないから君がなんとかしてくれないかな?

初期状態

  • ubuntu-1 から curl https://blog.icttoracon.net/ をしてもつながらない
  • ubuntu-1 から curl http://[2403:bd80:c000:900::1]/ をしてもつながらない

終了状態

  • ubuntu-1 から curl https://blog.icttoracon.net/ をするとステータスコード 200 のレスポンスが返ってくる。
  • ubuntu-1 から curl http://[2403:bd80:c000:900::1]/ をするとステータスコード 200 のレスポンスが返ってくる。

配点

  • ubuntu-1 から curl https://blog.icttoracon.net/ をするとステータスコード 200 のレスポンスが返ってくる 80%
  • ubuntu-1 から curl http://[2403:bd80:c000:900::1]/ をするとステータスコード 200 のレスポンスが返ってくる。 20%

問題文でされた操作

  1. 社内ネットワークを IPv6 only にした
  2. 外向き IP アドレスは v4 しかないが、ルーターで NAT64 をしている

https://blog.icttoracon.net/が返らない原因

プリフィックスのある v6 アドレスを DNS で生成されていない

まずは、DNS で IPv6 アドレスを問い合わせてみる

dig -t AAAA blog.icttoracon.net +short

NAT64、DNS64 そして通信に介在するネットワーク機器は同じ IPv4-IPv6 変換アドレス用のプリフィクスを使用するよう設定されている必要があります。(参照)

今回は外向き IP アドレスは v4 のみなのでプリフィックスのある v6 アドレスが返されないといけない。

https://[2403:bd80:c000:900::1]/が返らない原因

ping6 2403:bd80:c000:900::1をしてみる。もし疎通性がなければ、パケットフィルタリングが問題。もし疎通性があれば、前回と同様で web サーバが IPv6 で受け付けてないとか nginx だったら config の不備が問題。

考えられる解決方法

DNS64 に対応させる

BIND の場合、BIND のバージョンが 9.8 以降か確認し、/etc/bind/named.conf に以下のような記述 DNS64 の設定があるか確認する

options {
    # IPv4は32bitなので96bit付け足してIPv6に対応させる
    dns64 64:ff9b::/96 {
    #     クライアントを指定できるが、anyで良い気がする
        clients { any; };
    };
};

service named restartをして再起動

UNBOUND の場合は、/etc/unbound/unbound.conf に

server:
    # dns64をつければ後の文字はなんでも良いっぽい
    module-config: "dns64 validator iterator"
    dns64-prefix: 64:ff9b::/96

を設定して、unbound -c unbound.confで設定を読み込み

※参照サイト:
1.オライリー DNS64 ページ
2.unbound 公式 DNS64 ドキュメント

Nginx の config を修正

/etc/nginx/nginx.conf のlisten 80;の下に以下のような記述があるか確認。

# IPv6のポート80でリッスンするよ〜という記述
listen [::]:80;

パケットフィルタリング

ip6tables という IPv6 の iptables コマンドで確認ができるらしい!(参照)

ip6tables -L

アプリケーションに必要なポートを web サーバ側で許可する

# TCP80番ポートのアクセス許可
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT

※参考※


解説

unbound と Apache2 の設定が適切になされていないことで起こる問題です。

unbound

dns64-prefixubuntu-routerJOOL の設定を参照する必要があります。これを確認すると dns64-prefix64:ff9b::/96 で有ることがわかります。(jool global displayコマンドのpool6で prefix が確認できそう(参照))

また、blog.icttoracon.net ではデュアルスタック方式を採用しているおり dns64-synthall が no に設定されていると、blog.icttoracon.net にもともと設定されている IPv6 アドレスが AAAA レコードとして名前解決されるため、 ubuntu-1 からアクセスすることができなくなってしまいます。(元から AAAA レコードに何かアドレスが入っていたっぽいな。dns64-synthall のオンオフによる挙動はここら辺に載っている)

さらに、この dns-1 のサーバーは NAT64 ネットワーク内に設置されているために forward-addr が 8.8.8.8 になっていると通信が行えません。forward-addr: 64:ff9b::808:808 に変更する必要があります。(そうだったのか^^;;)

問題が発生している原因は 2 つ存在している。1 つ目は、unbound に DNS64 の設定が正しくされていない点である。これを解決するために /etc/unbound/unbound.conf.d/dns.conf を以下のように変更する。(公式の example.conf 参照)

server:
# ログレベル
  verbosity: 2
#   pidfileの場所指定
  pidfile: "/var/run/unbound.pid"
#   ログを出すかどうか
  use-syslog: yes
#   さっき書いた通りでdns64を使用する場合はかく
  module-config: "dns64 iterator"
#   prefixを指定する
  dns64-prefix: 64:ff9b::/96
#   yesにするとDNS64やNAT64を通るようになる
  dns64-synthall: yes
  interface: ::0
  access-control: ::0/0 allow

forward-zone:
# `.`にすると全て転送される
  name: "."
#   8.8.8.8のプレフィックス付きIPv6アドレス。
  forward-addr: 64:ff9b::808:808

これにより https://blog.icttoracon.net/ にアクセスできるようになる。

2 つ目の原因は ubuntu-router の Web (Apache2) の Listen Address が適切に設定されていないことにある。これを解決するために以下の一行を config に追記する。

Listen [::0]:80

※参考※