mDNS と IPv6 とアクセス制限
デフォルトでプライベートIPアドレスを許可するようなLAN内向けのアプリケーションがあったりする。つまり192.168.0.13 とかでアクセスする分には特に設定せず問題なく繋がるというもの。
IP アドレスを調べる手間をはぶくため、mDNS 対応していて、voron2.local というホスト名でアクセスできるようになっているとする。この場合、このホスト名でアクセスするときだけうまくアプリケーションが動かないという挙動をすることがある。
mDNS で voron2.local などとアクセスした場合、解決されるアドレスは環境によって IPv4 だったり IPv6 だったりになる。IPv4 で解決されるなら 192.168.0.13 などでアクセスしたことと同じで、問題ない。
問題は IPv6 かつ、しっかりグローバルIPアドレスを持っている場合で、アプリケーションはグローバルIPアドレスからのアクセスをデフォルトで許可するわけにはいかないので拒否される。
この件でやっかいなのは、アプリケーション自体はデュアルスタックで IPv6 対応しているが、IPアドレスベースのアクセス制限をかけているというところで、アクセス制限をかけてない部分には問題なくアクセスできる。
これは localhost と書くと IPv6 対応したときに死ぬことがあると同種の問題といえる。ホスト名はデュアルスタック環境だとどちらに解決されるか環境依存なので、IPv6 環境になり、特に今回の場合はグローバルアドレスが付与されているという条件付きでうまく動作しない環境ができあがる。
正攻法
IPv6 の Link local アドレスならデフォルトで許可しやすいので、mDNS でこのアドレスをひければ一番良いが、avahi でそのような設定を行うことは不可能なようだ (mDNS の仕様的にできないっぽい?)。
または自分と同じ IPv6 prefix を持つなら許可するみたいな動的なアクセス制御を行うようにすればいいがこれは実装が必要になる。
あるいは明示的に現在持っている IPv6 prefix を許可するようにする。が prefix がいつ変化するかよくわからないのでやりたくない。
IPv6 を無効にする
あまりやりたくはないが mDNS 時に利便性が悪 すぎるので、今回は該当機の IPv6 を無効にすることにした。
以下を /etc/sysctl.conf に書く。
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
これで aaaa が解決できなくなる。
dig aaaa voron2.local
関連エントリー
- さくらのVPSを踏み台にして IPv6 アドレスがついているホストへ ssh さくらのVPSはIPv4/IPv6デュアルスタックで、双方ともにグローバルアドレスがついているため、IPv4 しかない環境から IPv6 ア...
- さくらのVPSのウェブサーバでIPv6の接続をうける 最初からアドレスついてたので意外とやることない。 ifconfig すると既に v6 のアドレスがついている。Scope:Global にな...
- localhost と書くと IPv6 対応したときに死ぬことがある 127.0.0.1 より localhost のほうが書きやすいし良さそう、と思って localhost と書いているとしばしばハマります。...
- DS-Lite の挙動の理解 おおざっぱにいうと 家庭内のルーター(B4)で IPv4 パケットを IPv6 にカプセル化 (IP IP tunnel) IPv4 ネット...
- IPv6 対応にした さくらのVPSのウェブサーバでIPv6の接続をうける | tech - 氾濫原 で、IPv6 アクセス環境がないと書いたが、スマフォで簡単に...