どうすればIPv6を無効化できるか

色々なところで紹介されている方法では、実は、IPv6を無効化することが出来なかった。的確にIPv6を無効化する方法を探してみた。

LinuxIPv6を無効にするには、基本的にカーネルの(menuconfig等で)IPv6の機能を指定せずにカーネル再構築をすれば完璧なのだが、カーネルのバージョンが上がる度に再構築するのは手間もかかるし時間もかかるので、できればやりたくはない。

メモリを節約するための重い腰を上げてググってみた。ところが、ディストリビューションによって設定のしかたがまちまちで、Fedora関連でも色々な方法が紹介されている。しかし、実際にやってみてもIPv6が無効になっていないケースが多かった。

無効化できなかった方法

参考のためにやってみてIPv6を無効化できなかった例を書いておくが、今の環境は以下のとおりである。

ネットで良く出てくるのが以下の例である。

/etc/modprobe.conf に次の一行を追加

alias net-pf-10 off

/etc/sysconfig/network の NETWORKING_IPV6 をnoに設定

NETWORKING_IPV6=no

さっそく試してみたが、lsmodで確認するとIPv6のモジュールがロードされている。無効化できていない。ip6tablesも動いている。

無効化できた方法

結局、自分なりに色々と試行錯誤して、/etc/modprobe.conf に次の1行を追加すればIPv6を無効化できた。

install ipv6 /sbin/modprobe -n -i ipv6

この1行を追加するだけでOKだった。 etc/sysconfig/network に「NETWORKING_IPV6=no」は追加していない。上の1行をmodprobe.confに入れただけ。

なお、この方法にたどり着いたのは次のような流れだ。Webで検索すると

alias net-pf-10 off
alias ipv6 off

を追加する、という方法がほとんだった。確かに上記の方法でもIPv6を無効化できた。しかし、このalias行の意味は「alias」の本来の目的からするとちょっと疑問。

alias行はモジュール名に別名を定義するわけで、一般的には論理的なモジュール名と物理的なモジュール名を結びつけるとか、長い名前のモジュール名を短い名前で代用するのに使うらしい。例えば、

alias eth0 b44

という風に、「eth0」という論理的な名前に「b44(Broadcomイーサネットコントローラのドライバ)」を結びつけて「eth0」を活性化する際に実際に「b44」を活性化するということかと思う。(時間がないのでソースを追っていないので、manの記述と直感で書いている。)

では、「off」を指定すると言うのはどういうことか? 「alias ipv6 off」はIPv6のモジュールをロードするときに「off」というモジュールをロードしなさい、とうことにならないか? 実際にブートするとサービスの起動メッセージに

FATAL: Module off not found.

と表示される。「off」というモジュールは存在しないらしい。つまりこの方法はIPv6のモジュールをロードする時にワザとエラーを発生させてロードさせないという方法らしい。(そのため、ipv6でロードが失敗した場合、内部エイリアスのnet-pf-10で再度ロードしようとするためnet-pf-10も「失敗」させなければならないため2行必要になるのだと推測できる。)

副作用がなければ「IPv6を活性化しない」という目的を達成できるわけでこれでも構わない。私も良くお世話になっている「@IT」等にもこの方法を紹介しているので(Fedora CoreでIPv6を無効にするには)かなり一般的な方法として定着しているようだ。もともと今回、改めてIPv6の無効化を試してみようと思ったのはVMwareの「Guest Operating System Installation Guide」を読んでいてゲストOSでIPv6が動いていると都合が悪いこともあるので、IPv6を無効化する方法が書いてあった。例えば、97ページに次のような記述がある。

To disable IPv6 in a virtual machine running Linux

1 If the file /etc/sysconfig/network contains the line NETWORKING_IPV6=yes, change the line to
    NETWORKING_IPV6=no.
2 In the file /etc/modules.conf, add the following lines:
    alias ipv6 off
    alias net-pf-10 off

こういったマニュアルにも「alias lpv6 off」が紹介されている。(でも、これをやるとFatal errorメッセージが出ることは書かれていない。)

この方法でも特に不都合があるわけではない。しかしFatal errorが出るのは私としては気持ち悪い。(Fatal errorと言っても実質Warning程度の話ではあるが。)

そこで、modprobe.confとmodprobeのman pageを読んでみた。modprobeの-n (--dry-run)オプションでipv6モジュールをロードした"つもり"にさせれば良いのでは?と思い、試したところでエラーメッセージも出ないし、実際にipv6モジュールがロードされないのでIPv6の機能も無効化できた。この方法が「正解」かどうかは分からない。今のところ副作用は出ていない。alias offよりは気分的には良い。

最近、流行りの方法(2009/02/13)

最近、ネットを見ているとIPv6を無効化する方法として、/etc/modprobe.confに

install ipv6 /bin/true

を追加するというのがいくつか見られた。確かに“何もしない”という意味では“install ipv6 /sbin/modprobe -n -i ipv6”より短くてお手軽かも知れない。その意味ではワザとエラーを起こさせる“alias ipv6 off”も同じなのでだけど。