ライン

ポイント:Apacheの設定はこれまでとほぼ変わらない

ライン

 はじめに

 やっとIPv6が使える環境になりました。
こうなると、公開サーバでIPv6専用のApacheサーバを動かしてみようと欲が出てきました。
ちょっと完成までには時間を要することが予想されますが、1つづつ手順を踏んで進めていこうと思います。

 環境構築

Feel6を利用する

 以前に取得だけして使っていないFeel6のアカウントがありましたので、これを使うことにします。

2001:03e0:074b::/48

 というのが振り出されたIPv6のアドレスです。
 サブネットマスク /48というのがわからないので調べてみました…なるほど。
上記でいう 2001:03e0:074b という部分だけで 48bit。
残りを使うことができるということになります。

 イメージとしては、192.168.200.x/24 を例に考えると、xに相当する256(0-255)が使えるというのと似たイメージ。
IPv4は1つのIPアドレスに32bitを使いますが、IPv6では128bitが使われます。
IPv4だと192.168.200.1/32 は1個に限定した表記となりますが、IPv6では2001:03e0:074b::1/128 のような感じが1個に限定した形になります。
 IPv6のサブネットマスクは 64bitと固定されるそうなので、全体の半分に相当しますね。

 IPv6で/48 の場合、65536が使えるということになるようです。(こりゃ、どう考えても使い切れませんな)
 さて、今回は公開サーバを建てるので、1つのサブネットを公開することと決めることにします。
/64を1つ決めて公開用のネットワークにすればいいわけです。

 今回は以下にしました。

2001:03e0:074b:5656::/64 

 まずは、ウェブサーバを動作させるマシンを準備することにします。(VMwareのゲストを利用します)
FreeBSD 9.0-Release 64bit版で他を試した環境が残っていたので、これを使うことにしました。
(まずは、入っていた全portsを削除して、Perlなどから入れ直ししました。)

 VMwareなので、仮想でネットワークアダプタを追加するのは簡単です。
IPv4にプライベートなアドレスを割り当てて、ここにIPv6のIPアドレスを振ってみることにします。

# ifconfig em1 inet6 2001:03e0:074b:5656::2 prefixlen 64

状態を確認してみます。

# ifconfig -n em1
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:0c:29:aa:bb:cc
        inet 192.168.200.1 netmask 0xffffff00 broadcast 192.168.200.255
        inet6 fe80::〜
        inet6 2001:3e0:74b:5656::2 prefixlen 64
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active

ちゃんと割り当たることを確認できました。

 rc.confに設定を開始します。
事前にデフォルトはどうなっているかを見ておきました。
※#grep ipv6 /etc/defaults/rc.confでも良い

# grep ipv6 /usr/share/examples/etc/defaults/rc.conf
#firewall_client_net_ipv6="2001:db8:2:1::/64" # IPv6 network prefix for
#firewall_simple_iif_ipv6="ed1" # Inside IPv6 network interface for "simple"
#firewall_simple_inet_ipv6="2001:db8:2:800::/56" # Inside IPv6 network prefix
#firewall_simple_oif_ipv6="ed0" # Outside IPv6 network interface for "simple"
#firewall_simple_onet_ipv6="2001:db8:2:0::/56" # Outside IPv6 network prefix
#ifconfig_ed0_ipv6="inet6 2001:db8:1::1 prefixlen 64" # Sample IPv6 addr entry
ipv6_network_interfaces="auto"  # List of IPv6 network interfaces
ipv6_activate_all_interfaces="NO"       # If NO, interfaces which have no
                                        # corresponding $ifconfig_IF_ipv6 is
ipv6_defaultrouter="NO"         # Set to IPv6 default gateway (or NO).
#ipv6_defaultrouter="2002:c058:6301::"  # Use this for 6to4 (RFC 3068)
ipv6_static_routes=""           # Set to static route list (or leave empty).
#ipv6_static_routes="xxx"       # An example to set fec0:0000:0000:0006::/64
#ipv6_route_xxx="fec0:0000:0000:0006:: -prefixlen 64 ::1"
ipv6_gateway_enable="NO"        # Set to YES if this host will be a gateway.
ipv6_cpe_wanif="NO"             # Set to the upstram interface name if this
ipv6_privacy="NO"               # Use privacy address on RA-receiving IFs
#ipv6_network_interfaces="ed0 ep0"      # Examples for router
#ipv6_prefix_ed0="fec0:0000:0000:0001 fec0:0000:0000:0002"  # Examples for rtr.
#ipv6_prefix_ep0="fec0:0000:0000:0003 fec0:0000:0000:0004"  # Examples for rtr.
ipv6_default_interface="NO"     # Default output interface for scoped addrs.
                                # ipv6_gateway_enable="NO".
stf_interface_ipv6_ifid="0:0:0:1"       # IPv6 interface id for stf0.
stf_interface_ipv6_slaid="0000" # IPv6 Site Level Aggregator for stf0
ipv6_faith_prefix="NO"          # Set faith prefix to enable a FAITH
ipv6_ipv4mapping="NO"           # Set to "YES" to enable IPv4 mapped IPv6 addr
ipv6_ipfilter_rules="/etc/ipf6.rules"   # rules definition file for ipfilter,
                                # (ipv4_prefer, ipv6_prefer, or AUTO)

 では、設定を入れていきます。(/etc/rc.conf)

ifconfig_em1_ipv6="inet6 2001:03e0:074b:5656::2"
ipv6_defaultrouter="2001:03e0:074b:5656::1"

再起動してみてちゃんと割り当たることが確認できました。

 次に、早速Feel6につなぐ準備をします。DTCPクライアントで接続する必要があるので、まずこれを導入します。

# whereis dtcpclient
dtcpclient: /usr/ports/net/dtcpclient
# cd /usr/ports/net/dtcpclient
kimura /usr/ports/net/dtcpclient #make install clean
===>  portaudit database exists, however, portaudit is not installed!
===>  License check disabled, port has not defined LICENSE
=> dtcpclient-20090812.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/distfiles/dtcpclient-20090812.tar.gz
dtcpclient-20090812.tar.gz                    100% of   13 kB  320 kBps
===>  Extracting for dtcpclient-20090812
=> SHA256 Checksum OK for dtcpclient-20090812.tar.gz.
===>  Patching for dtcpclient-20090812
===>  Configuring for dtcpclient-20090812
===>  Building for dtcpclient-20090812
cc -O2 -pipe -fno-strict-aliasing  -Wall -DPREFIX=\"/usr/local\" -DHAVE_MD5 -std=gnu99 -fstack-protector  -c dtcpclient.c
cc -O2 -pipe -fno-strict-aliasing  -Wall -DPREFIX=\"/usr/local\" -DHAVE_MD5 -std=gnu99 -fstack-protector   -o dtcpclient dtcpclient.o -lmd
Warning: Object directory not changed from original /usr/ports/net/dtcpclient/work/dtcpclient-20090812
gzip -cn dtcpclient.8 > dtcpclient.8.gz
===>  Installing for dtcpclient-20090812
===>   Generating temporary packing list
===>  Checking if net/dtcpclient already installed
install -o root -g wheel -m 444 dtcpclient.8.gz  /usr/local/man/man8
install -s  -o root -g wheel -m 555  dtcpclient /usr/local/sbin/dtcpclient
install -d /usr/local/share/examples/dtcpclient
install  -o root -g wheel -m 555  dtcpclient.script /usr/local/share/examples/dtcpclient/dtcpclient.script
if [ ! -f /usr/local/etc/dtcpclient.script ]; then  cp -p /usr/local/share/examples/dtcpclient/dtcpclient.script /usr/local/etc/;  fi
===> Installing rc.d startup script(s)
===>   Registering installation for dtcpclient-20090812
===>  Cleaning for dtcpclient-20090812

 すんなり完了しました。
 /etc/rc.conf の設定を入れます

dtcpclient_enable="YES"
dtcpclient_server="dtcp.feel6.jp"
dtcpclient_username="(Felel6に登録したユーザ名)"

 次に、各種設定ファイルにパラメータを入れていきます。
設定ファイルは、/usr/local/etc/dtcpclient.authで作成しておきます。

dtcp.feel6.jp:(Felel6に登録したユーザ名):(Felel6に登録したパスワード)

設定が終わったら、パーミッション等を変更しておきます。

# chmod 600 /usr/local/etc/dtcpclient.auth

次に、/usr/local/etc/dtcpclient.scriptというスクリプトに、追加すべきものを追加します。
44-45行目にある部分に設定を入れます。

# Set IPv6 address if you wish to add it to gif interface. (default: '')
tunif_addrs='2001:03e0:074b:5656::1'

これで設定はできたはず。
一応、再起動をして自動であがってくることも確認した後に、以下で疎通確認。

# ping6 www.kame.net
PING6(56=40+8+8 bytes) 2001:3e0:74b:5656::1 --> 2001:200:dff:fff1:216:3eff:feb1:44d7
16 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7, icmp_seq=0 hlim=51 time=20.381 ms
16 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7, icmp_seq=1 hlim=51 time=20.488 ms
16 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7, icmp_seq=2 hlim=51 time=21.282 ms

トンネル経由だと、こんなもののようだ。
時々、

# ping6 www.kame.net
PING6(56=40+8+8 bytes) 2001:3e0:74b:5656::1 --> 2001:200:dff:fff1:216:3eff:feb1:44d7
ping6: sendmsg: Network is down
ping6: wrote orange.kame.net 16 chars, ret=-1
ping6: sendmsg: Network is down
ping6: wrote orange.kame.net 16 chars, ret=-1

のように、つながっているのにうまく通信できないことがあるが、dtcpclientの再接続でトライするしかないみたい。
(原因追及はしていないけどかなりの確率でそうなるので、もうちょいやり方があるのだろうか)
とりあえず、cronで5分に一回、IPv6サイトに疎通が取れなかったら、スクリプトの再起動を実行するようにして凌いでいますが。

のようにして試している状態です。

DNS設定を入れる

 今回は、公開ウェブサーバの作成なので、そのアドレスを登録していきます。
ドメインのZONEファイルに以下を1行追加してbind9 をリスタートしただけで終了。

ipv6            IN      AAAA    2001:03e0:074b:5656::80

Feel6は逆引き用の設定ができないみたいなので、設定はこれで終わり。

Apache22の設定

 apache22の導入から開始します。

# whereis apache22
apache22: /usr/ports/www/apache22
# make config

IPv6を有効にしておきます。

では、導入を実施します。

# make install clean

入れている間に、IPアドレスの指定をしておきます。
これまでの指定方法でやれそうなのはこの方法だったので、IPv6の作法とか一般的な指定方法がどのようなものなのかが確認できていません。

 /etc/rc.conf に入れるイメージで

ifconfig_em1_alias0="inet6 2001:03e0:074b:5656::80 prefixlen 64"

のようにしてみました。仮想のNICにIP alias。仮想じゃないときはどうするべきなんだろう。

 Apacheの導入も終わりましたので、上記を反映(再起動しています)してみます。

# ifconfig -n em1
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:0c:29:aa:bb:cc
        inet 192.168.200.1 netmask 0xffffff00 broadcast 192.168.200.255
        inet6 fe80::〜
        inet6 2001:3e0:74b:5656::2 prefixlen 64
        inet6 2001:3e0:74b:5656::80 prefixlen 64
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active

こんな感じ。ネットの外から pingしても応答が返ってきます。
/etc/rc.conf に

apache22_enable="YES"

を追加しておきましたので、apacheも起動できています。

手元のWindows 7のPCからもping確認してみます。

>ping -6 ipv6.fkimura.com
ipv6.fkimura.com [2001:3e0:74b:5656::80]に ping を送信しています 32 バイトのデータ:
2001:3e0:74b:5656::80 からの応答: 時間 =19ms
2001:3e0:74b:5656::80 からの応答: 時間 =16ms
2001:3e0:74b:5656::80 からの応答: 時間 =16ms

2001:3e0:74b:5656::80 の ping 統計:
    パケット数: 送信 = 3、受信 = 3、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 16ms、最大 = 19ms、平均 = 17ms

名前も引けていますね。
では、ブラウザで見てもいけるでしょうか…いけました。
何も設定していないので、

It works!

と表示されるだけですが、IPv6だけしかないアドレスで表示がされているわけです。
もちろん

http://[2001:3e0:74b:5656::80]/

でも大丈夫。

 さて、IPv6のページを作成するために、もう少し細かく書きます。
名前ベースで普通に動作を確認することにします。
/usr/local/etc/apache22/httpd.confで

# Virtual hosts
Include etc/apache22/extra/httpd-vhosts.conf

を1行有効にしました。
 該当するファイル /usr/local/etc/apache22/extra/httpd-vhosts.conf にバーチャル用に記述を入れます。

NameVirtualHost [2001:3e0:74b:5656::80]:80

<VirtualHost [2001:3e0:74b:5656::80]:80>
        DocumentRoot    /home/fkimura/ipv6.fkimura.com
        ServerName      ipv6.fkimura.com
        ErrorLog  "/home/fkimura/log/error_log"
        CustomLog "/home/fkimura/log/access_log" common
<Directory "/home/fkimura/ipv6.fkimura.com">
        AllowOverride FileInfo AuthConfig Limit
        Options Includes SymLinksIfOwnerMatch execCGI
        Order           allow,deny
        Allow from      all
</Directory>
</VirtualHost>

こんな感じ。
※必要なディレクトリは作成しておくようにしましょう。
アクセスログを見ると、こんな感じ。

2001:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx - - [22/Jul/2012:20:08:44 +0900] "GET /favicon.ico HTTP/1.1" 404 209
2001:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx - - [22/Jul/2012:20:10:41 +0900] "GET / HTTP/1.1" 200 130

 結論、Apacheの設定はIPv4と変わらない形で設定ができるということです。
あえて書けば、違う部分はIPアドレスの前後に[]をつけるだけが異なるところでしょう。

 (S)FTP

 IPv6の環境からIPv6のサーバにSFTPでデータをアップロードできるようにしました。
sshdは動作しているので、FTPDを立ち上げないでも十分なので楽ですし。

 まず、sshで普通に接続できるように /etc/hosts.allowに設定を加えました。

# Wrapping sshd(8) is not normally a good idea, but if you
# need to do it, here's how
sshd :  [2001:3e0:ZZZ:0::]/64,\
        .fkimura.com : allow
sshd : ALL : deny

これでIPv6でssh接続できるようになりました。
FileZilla FTP Clientを使って、接続をしてみました。特に問題なしです。
※ただし、パスワード認証です

 このタイミングで、IPv4の固定IPの指定をはずしてしまい、IPv4はプライベートアドレスに変更しました。
これで外向きの公開サーバは IPv6のトンネルのみになりました。
 リブートなどでFeel6にすんなりつながらない場合には、プライベートアドレスからしかメンテできないのが弱点ですけど。

 最後に

 電子メールとかFTPサーバなどはそのうちにやってみるつもりです。
セキュリティは、まだそんなに手をいれていなくて TCP Wrapperで制御できるものはしている程度。
 普通に使えるようになるのはまだまだ先という感じです。


【改訂履歴】作成:2012/ 7/21 改訂: 2012/7/28
【参考リンク】

IPv6 Ready への道 〜FreeBSD, NetBSD編〜 - CORY's twilight zone

Copyright © 1996,1997-2006,2007- by F.Kimura,