UbuntuでIPv6を無効化
以前、FedoraでIPv6を停止する方法を調べた。Fedoraでは「FredoraでIPv6を無効化」で書いた様に/etc/modprobe.confに
install ipv6 /sbin/modprobe -n -i ipv6
を追加すればよかった。その後、このブログを参照した方が Ubuntuでは /etc/modprobe.d/blacklist に
blacklist ipv6
を追加すれば良いと書かれていた。私も「Ubuntuの方が気が利いているなぁ」などと思って、この方法を使っていた。
しかし、「blacklist ipv6」を追加する方法がbestなのか、ちょっと疑問が出てきた。確かにこの方法でIPv6のモジュールはロードされなくなり、IPv6の機能が抑制される。
adsaria@ubuntu804:~$ lsmod | grep ipv6 adsaria@ubuntu804:~$ adsaria@ubuntu804:~$ ping6 ::1 socket: Address family not supported by protocol adsaria@ubuntu804:~$
ところが、別件(UbuntuでVNCを使うとgnome-settings-daemonがうまく動かない件)でsyslogなどのログを見ていたら次のような警告("お知らせ"程度の内容)がかなり頻繁に出てくることが分かった。
May 25 18:56:45 ubuntu804 modprobe: WARNING: Not loading blacklisted module ipv6 May 25 18:56:54 ubuntu804 last message repeated 17 times : : May 25 19:24:15 ubuntu804 modprobe: WARNING: Not loading blacklisted module ipv6 May 25 19:24:48 ubuntu804 last message repeated 124 times May 25 19:24:50 ubuntu804 last message repeated 13 times : :
どうも blacklistへの登録は、IPv6の機能を使おうとするプログラムがIPv6のモジュールを呼び出す毎にmodprobeがロードを抑制しているようである。
そこでFedoraと同様に"install ipv6 /sbin/modprobe -n -i ipv6"を使った方法を試してみた。この方法では先ほどのような警告メッセージは出てこない。念のため手動でIPv6のコマンドを実行してみた。
adsaria@ubuntu804:~$ ping6 ::1 socket: Address family not supported by protocol adsaria@ubuntu804:~$
しかし、やはり警告メッセージは出てこなかった。
多分、どちらの方が「正解か」ということは無いと思う。backlistはLinuxにおけるモジュールの取扱いから言えば正道だと思う。ただ、IPv6が静的に制限されるのではなく、プログラムがIPv6機能を呼び出すたびにモジュールのロードを抑制している。installコマンドを使う方法はIPv6モジュールを「ロードしたふり」をしているのでダマシ的ではあるが、モジュールのロードを繰り返し抑制する必要はないようだ。(どちらも巷で一般化している"alias ipv6 off"よりはbetterかと思っているが....。)
追記 2009/03/08
ふと思ったのだが、“install ipv6 /sbin/modprobe -n -i ipv6”もエラーを引き起こさないだけで、IPv6の機能を必要するソフトウェアが実行されるたびに、呼び出されている可能性はある。“/sbin/modprobe”の代わりにシェルスクリプトを作って、呼び出されたらログを残すようにすれば確認できると思うが、今はちょっと時間がないので未確認としておく。
なお、Ubuntuの環境で"install ipv6 /sbin/modprobe -n -i ipv6"をどのファイルに記述すれば良いのかは、チョット問題である。Fadoraであれば迷うことなく/etc/modprobe.confなのだが、Ubuntuではファイルの構成が異なる。Ubuntuでは/etc/modprobe.d/の下に設定ファイルが集められているが、どれもそれらしい名前のものが無い。
adsaria@ubuntu804:~$ ls /etc/modprobe.d/ aliases blacklist-framebuffer isapnp options alsa-base blacklist-modem libpisock9 toshiba_acpi.modprobe arch blacklist-oss libsane arch-aliases blacklist-watchdog lrm-video blacklist fuse nvidia-kernel-nkc adsaria@ubuntu804:~$
aliseファイルはaliasを定義するファイルでinstallコマンドによる記述を書くところではなさそうである。blacklistも同様だが、抑制するモジュールについて記述する、という意味ではblacklistだろうか。(実際のところaliasでもblacklistでも、どちらに記述してもIPv6は抑制できる。)今のところは/etc/modprobe.d/blacklistを間借りして記述している。
大したことではないのだが、ついつい凝り性なので遊んでしまう。
補足:"alias ipv6 off"を試してみる
Ubuntu 8.04の環境で一般的に定常化している"alias ipv6 off"を使って確認してみた。/etc/modprobe.d/aliasesの最初もしくは最後に
alias ipv6 off
を追加して見たがIPv6は抑制できない。元々は aliasesの中でも定義されている様に
alias net-pf-10 ipv6
と、"net-pf-10"(プロトコル・ファミリー10)とIPv6を結び付けているので、無理やり"off"に結びつけるのであれば、ここを変更しなければならない筈。aliasesの中を次のように変更してみる。
alias net-pf-10 off
これでIPv6は抑制できる。ただ、面白いことにFedoraでは出ていたブート時の警告メッセージ
FATAL: Module off not found.
とかは出てこない。Ubuntuでは容認されているということか。(標準でoffという名前のダミーモジュールを用意されているとか?)
ではでは、これは?
alias net-pf-10 adsaria alias ipv6 adsaria
"FATAL: Module adsaria not found."なんてメッセージは何処にも見当たらない。だんだん、ドツボにはまりそうなのでこの辺で止めておく。(これ以上はソースを見ないとならないが、そこまでは困ってもいないし。)