IPv6に勤しんでみる 実アドレス, apache

CentOS, IPv6」でググッたらIPv6を無効化する方法』ばっかあたってワロタ。

ということで基本的な設定から。まずはインタフェース。

構成

インタフェース設定

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
IPV6ADDR=xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/xx
IPV6INIT=yes
IPV6_AUTOCONF=no
ONBOOT=yes

疎通確認

$ ping6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

pingも6なんですね。てゆーか。ping一発打つだけなのに何この新鮮さ?Replyが返ってきたときに思わずニヤケちまったい...
しかし、IPv4でリーチャビリティがないと結局ファイル落としてインストールできない orz
ルータでトンネリングすればv4で抜けれるみたいなんですが、とりあえずそれはおいといてv4のアドレスもしゃーなしにつけました。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
HWADDR=xx:xx:xx:xx:xx
IPADDR=xxx.xxx.xxx.xxx
GATEWAY=xxx.xxx.xxx.xxx
IPV6ADDR=xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/xx
IPV6INIT=yes
ONBOOT=yes

折角なのでまずは王道?あぱっちぇさんでListenしてみる。

$ wget wget http://www.meisei-u.ac.jp/mirror/apache/httpd/httpd-2.2.11.tar.gz
$ tar zxvf httpd-2.2.11.tar.gz
$ cd httpd-2.2.11

ふむconfigureどうすりゃいいのだ。と思い。grep v6 configureしてみる

 --enable-v4-mapped      Allow IPv6 sockets to handle IPv4 connections

他にそれっぽいオプションなし。
v6をenableするオプションじゃないような...デフォルトで有効というか有効にしかできない?
ということで公式を覗き見。

http://httpd.apache.org/docs/2.0/ja/bind.html

多くのプラットホームで IPv6 がサポートされてきていて、 APR はこれら
のほとんどで IPv6 をサポートしているので、 ApacheIPv6 ソケット
を割り当てて IPv6 経由で送られてきたリクエストを扱うことができます。

IPv6 ソケットが IPv4IPv6 コネクションの両方を扱うことができるか
どうかは、Apache 管理者にとって厄介な問題です。 IPv4 コネクションを 
IPv6 ソケットで扱う場合は、 IPv4 マップされた IPv6 アドレスを使用し
ていて、 ほとんどのプラットホームではデフォルトで使用可能ですが、 
FreeBSD, NetBSD, OpenBSD では、システム全体としてのポリシーとの整合
性から、 デフォルトでは使用不可に設定されています。 これらのデフォル
トで使用不可のプラットホームであっても、 特別な設定パラメータで Apach
e の挙動を変化させることができます。

IPv4IPv6 のコネクションを最小限のソケットで扱いたいのであれば、IP
v4 マップの IPv6 アドレスを使用する必要があり、 --enable-v4-mapped co
nfigure オプションを指定して、単純に Listen ディレクティブで次のように
設定します。

Listen 80

 --enable-v4-mapped では、Apache の生成するデフォルトの設定ファイル中の
Listen ディレクティブはこの形式を使用しています。 --enable-v4-mapped は、
FreeBSD, NetBSD, OpenBSD 以外の全てのプラットホームでのデフォルトです。
ですから、おそらくお手元の Apache はこの設定でビルドされているでしょう。

プラットフォームや APR が何をサポートするかに関わらず、 IPv4 コネクショ
ンのみを扱うようにしたい場合は、 次の例のように全ての Listen ディレクテ
ィブで IPv4 アドレスを指定してください。

Listen 0.0.0.0:80
Listen 192.170.2.1:80

IPv4IPv6 のコネクションを個別のソケットで扱うようにしたい場合 (つま
り IPv4 マップのアドレスを無効にしたい場合) は、--disable-v4-mapped con
figure オプションを指定して、次のように個別指定の Listen ディレクティブ
を使用してください。

Listen [::]:80
Listen 0.0.0.0:80

 --disable-v4-mapped では、Apache の生成するデフォルトの設定ファイル中のL
isten ディレクティブはこの形式を使用しています。 --disable-v4-mapped は、
FreeBSD, NetBSD, OpenBSD プラットホームでのデフォルトです。


日本後でok。IPv4IPv6 のコネクションを最小限のソケットで扱いたいのであれば、 IPv4 マップの IPv6 アドレスを使用する必要があり、 --enable-v4-mapped configure オプションを指定してとあるので、v6そのそもを使うか否かなオプションじゃないですね。デフォルトは有効ですか。確かv6にtaranslationしたv4の記法が定義されてた気がするのでそれの事を言ってるのかなぁ。まあこの辺はそもそもIPv6の知識自体が薄いので要勉強ですね。
とりあえずまんまでいけるか試してみますか。

$ ./configure
$ make
$ su
# make install

起動してみる。んでnetstatで確認 -A オプションを使うとv6 onlyで表示できるみたい。

# netstat -na -A inet6

Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 :::80                       :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0    224 ::ffff:192.168.66.23:22     ::ffff:192.168.64.39:38912  ESTABLISHED
udp        0      0 :::32770                    :::*
udp        0      0 :::5353                     :::*

Listenしてる?けど外からtelnetで80叩いてもPermission deniedで怒られた....
なんだろ。フィルタリングどっかでされてるのかな...
と思ってローカルから叩いてみたら

# telnet xxxx:xxxx:11e:8401::902 80

Trying xxxx:xxxx:11e:8401::902...
Connected to xxxx:xxxx:11e:8401::902 (xxxx:xxxx:11e:8401::902).
Escape character is '^]'.
GET
<h1>It works!Connection closed by foreign host.

キタワァ*・゜゚・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜゚・* !!!!!

でも外からは叩けん。ip6tablesはいないと思うし、iptables止めてもダメだったから
TCP wrapper あたりか、Apacheの設定自体かなぁ。
netstatで見る限りはApacheではなさそうだけど...ふーむ。