UbuntuでIPv6を無効化

以前、FedoraIPv6を停止する方法を調べた。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."なんてメッセージは何処にも見当たらない。だんだん、ドツボにはまりそうなのでこの辺で止めておく。(これ以上はソースを見ないとならないが、そこまでは困ってもいないし。)