作業日記@HatenaBlog

各種の作業メモ

jail マシンを IPv4 と IPv6 のデュアルスタックにする

ネットワーク構成

192.168.X.1 で動作する Apache が proxy により 192.168.X.2, 192.168.X.3, …の各 jail の web サーバへ代理アクセスする。

   Internet
       |
 +-----+------+ ← Global Add. AAA.BBB.CCC.DDD
 |Gateway Svr |
 |192.168.X.1 |
 |200X:XXXX::1|
 |EXAMPLE.com |
 +---(re0)----+ ← LAN 192.168.X.0/24
       |               200X:XXXX::/56
       |
       +---------------+-----------------+
       |               |                 |
 +-----+------+  +-----+------+  +-------+--------+
 |  FOO.com   |  |  BAR.com   |  |www.EXAMPLE.com |
 |192.168.X.2 |  |192.168.X.3 |  |  192.168.X.4   |
 |www6.FOO.com|  |www6.BAR.com|  |www6.EXAMPLE.com|
 |200X:XXXX::2|  |200X:XXXX::3|  |  200X:XXXX::4  |
 +------------+  +------------+  +----------------+

/etc/rc.conf の設定

内部インタフェース re0 に繋がる各仮想 jail マシンに対し、192.168.X.1 側から IPv6 アドレスのエイリアスを設定する。(書式はどちらでも可)

# vi /etc/rc.conf
 
ipv6_ifconfig_re0_alias0="200X:XXXX::2 prefixlen 128"
ipv6_ifconfig_re0_alias1="200X:XXXX::3 prefixlen 128"
ipv6_ifconfig_re0_alias2="200X:XXXX::4 prefixlen 128"
または 
ifconfig_re0_alias0="inet6 200X:XXXX::2 prefixlen 128"
ifconfig_re0_alias1="inet6 200X:XXXX::3 prefixlen 128"
ifconfig_re0_alias2="inet6 200X:XXXX::4 prefixlen 128"
設定完了

設定が完了したらネットワーク設定を再読み込み

# /etc/netstart
アドレス確認

この場合、re0 に対し設定を行ったので次のとおり確認する。

# ifconfig re0 inet6
 
inet6 200X:XXXX::2 prefixlen 128
inet6 200X:XXXX::3 prefixlen 128
inet6 200X:XXXX::4 prefixlen 128

ezjail の設定

仮想マシンIPv6 アドレスを指定する。

ezjail 設定ファイルの編集

各 jail の設定ファイルは /usr/local/etc/ezjail/ 配下にある。

# cd /usr/local/etc/ezjail/
# ls
JAILNAME1
JAILNAME2
JAILNAME3
 
# vi JAILNAME1
 
(変更前)
export jail_JAILNAME1_ip="192.168.X.2"
↓
(変更後)
export jail_JAILNAME1_ip="192.168.X.2,200X:XXXX::2"
ezjail 再起動
# /usr/local/etc/rc.d/ezjail.sh restart
設定確認

便宜的に色分けした。

# jls -v
   JID  Hostname                      Path
        Name                          State
        CPUSetID
        IP Address(es)
     1  FOO.com                       /usr/jails/JAILNAME1
        1                             ACTIVE
        2
        192.168.X.2
        200X:XXXX::2
     2  BAR.com                       /usr/jails/JAILNAME2
        2                             ACTIVE
        3
        192.168.X.3
        200X:XXXX::3
     3  www.EXAMPLE.com               /usr/jails/JAILNAME3
        3                             ACTIVE
        4
        192.168.X.4
        200X:XXXX::4

Apache (VirtualHost) の設定

2011-01-23 Apache22によるVirtualHostの設定で設定した httpd-vhosts.conf を、IPv4IPv6 の共存(デュアルスタック)に書き換える。

httpd-vhosts.conf

バーチャルホストの設定変更。

Gateway Svr

IPv6 用のドキュメントルートを用意すると、アクセス確認がしやすい。

# cd /usr/local/etc/apache22/extra
# vi httpd-vhosts.conf
 
### IPv4 ###
<VirtualHost *:80>
        ServerAdmin     info@EXAMPLE.com
        ServerName      192.168.X.1
        DocumentRoot    "/usr/local/www/apache2/data"
</VirtualHost *:80>
 
### IPv6 ###
<VirtualHost *:80>
        ServerAdmin     info@EXAMPLE.com
        ServerName      [200X:XXXX::1]
        DocumentRoot    "/usr/local/www/apache2/data/data6"
</VirtualHost *:80>
FOO.com

BAR.com, www.EXAMPLE.com の設定も IP アドレス以外は全て同じ。

### IPv4 ###
<VirtualHost *:80>
        ServerAdmin     info@EXAMPLE.com
        ServerName      FOO.com
        ServerAlias     www.FOO.com
        ProxyRequests   Off
        <Proxy *>
                Order deny,allow
                Allow from All
        </Proxy>
        ProxyPass        /      http://192.168.X.2/
        ProxyPassReverse /      http://192.168.X.2/
        ErrorLog "/var/log/FOO_proxy-error.log"
        CustomLog "/var/log/FOO_proxy-access.log" common
</VirtualHost *:80>
 
### IPv6 ###
<VirtualHost *:80>
        ServerAdmin     info@EXAMPLE.com
        ServerName      www6.FOO.com
        ProxyRequests   Off
        <Proxy *>
                Order deny,allow
                Allow from All
        </Proxy>
        ProxyPass        /      http://[200X:XXXX::2]/
        ProxyPassReverse /      http://[200X:XXXX::2]/
        ErrorLog "/var/log/FOO_proxy-error.log"
        CustomLog "/var/log/FOO_proxy-access.log" common
</VirtualHost *:80>
設定の再読み込み

restart ではなく reload を使うこと。

# /usr/local/etc/rc.d/apache22 reload

BIND の設定

2010-05-01 BIND 9 の設定(イントラネット向け)で設定した named.conf および zone ファイルの一部を書き換える。

named.conf の設定

listen-on-v6

今のところエラーが出るのでコメントアウトしている。

# vi /etc/namedb/named.conf
 
//listen-on-v6    {
//                         ::1;
//                         fe80::1;
//                         200X:XXXX::1;
//                };
zone ステートメント

allow-query に IPv6 アドレスを追加する。
loopback アドレス、リンクローカルアドレス(fe80::/64)、グローバルアドレス(200X:XXXX::/56) からの問い合わせを受け付けるようにする。

zone "FOO.com" {
        type master;
        file "master/FOO.com.zone";
        allow-transfer { none; };
        allow-query {
                127.0.0.1;
                192.168.1.0/24;
                ::1/128;
                fe80::/64;
                200X:XXXX::/56;
        };
};

zone ファイル

上記の zone ステートメントで指定した zone ファイルに IPv6 アドレスを追加する。
IPv6 でアクセスするさいは、http://www6.FOO.com/ へアクセスする。
または http://[200X:XXXX::2]/ で IPv6 アドレスを直接指定する。

# vi /etc/namedb/master/FOO.com.zone
 
$TTL 86400
@                       IN SOA  @       root.FOO.com. (
                                        2012010901      ;serial
                                        10800           ;refresh
                                        900             ;retry
                                        604800          ;expiry
                                        86400 )         ;minimum

                        IN NS           @
                        IN MX           10 @
                        IN A            192.168.X.2

www6.FOO.com.           IN      AAAA    200X:XXXX::2

zone ファイル(その2)

EXAMPLE.com ドメイン配下の www.EXAMPLE.com (IPv4) と www6.EXAMPLE.com (IPv6) は、次のとおり設定する。
www6.EXAMPLE.com は、200X:XXXX::1 の web サーバから proxy により 200X:XXXX::4 へ接続するので設定アドレスに注意。
webmail.EXAMPLE.com や ircsvr.EXAMPLE.com は、その他のサービスが稼働している場合の設定例。
Alaxala ネットワークの IPv6 導入ガイドを参考にした。

# vi /etc/namedb/master/EXAMPLE.com.zone
 
$TTL 3600
$ORIGIN EXAMPLE.com.
@       IN      SOA     gatewaysvr  root.EXAMPLE.com. (
                        2012010901      ; Serial
                        3600            ; Refresh
                        900             ; Retry
                        3600000         ; Expire
                        3600 )          ; Minimum
           IN      NS      gatewaysvr
           IN      MX      10 gatewaysvr

gatewaysvr IN      A       192.168.1.1
           IN      AAAA    200X:XXXX::1
webmail    IN      A       192.168.1.2  ← webmail.EXAMPLE.com.
           IN      AAAA    200X:XXXX::2
irc        IN      A       192.168.1.2  ← ircsvr.EXAMPLE.com.
           IN      AAAA    200X:XXXX::2
@          IN      A       192.168.1.1  ← EXAMPLE.com.
           IN      AAAA    200X:XXXX::1
www6       IN      AAAA    200X:XXXX::1 ← www6.EXAMPLE.com.
 
www        IN      CNAME   ppprtr

逆引き zone ファイル

IPv6 に対応した逆引き zone ファイルを作成する。

200X:XXXX::1/56 の逆引きアドレス
  • IPv6 アドレスは 128 bit
  • 数字 1 桁につき 4 bit
  • 全部で 32 桁
  • プレフィックスが 56 bit なので上位 14 桁で区切る
  • 全 32桁 = 上位 14 桁 + 下位 18 桁
200X:XXXX::1/56
↓
200X:XXXX:0000:0000:0000:0000:0000:0001/56
↓
200X:XXXX:0000:00 + 00:0000:0000:0000:0001
↓
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 + 0.0.0.0.0.0.X.X.X.X.X.0.0.2
named.conf

IPv6 アドレスの逆引きゾーンファイルは EXAMPLE.com.ipv6.rev とする。
zone には逆引きアドレスの上位 14 桁を逆にして記述する。

zone "0.0.0.0.0.0.X.X.X.X.X.0.0.2.ip6.arpa" {
        type master;
        file "master/EXAMPLE.com.ipv6.rev";
};
EXAMPLE.com.ipv6.rev

逆引きゾーンファイルは次の通り。

# vi /etc/namedb/master/EXAMPLE.com.ipv6.rev
 
$TTL 86400
@               IN      SOA     gatewaysvr.EXAMPLE.com.   root.EXAMPLE.com. (
                                      2012010907      ;serial
                                      10800           ;refresh
                                      900             ;retry
                                      604800          ;expiry
                                      86400 )         ;minimum
 
                                      IN NS   gatewaysvr.EXAMPLE.com.
4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0   IN PTR  www6.EXAMPLE.com.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0   IN PTR  gatewaysvr.EXAMPLE.com.
変更を反映
# /etc/rc.d/named reload
逆引きの確認
# dig -x 200X:XXXX::4
 
; <<>> DiG 9.7.4-P1 <<>> -x 200X:XXX::4
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63423
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
 
;; QUESTION SECTION:
;1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.X.X.X.X.0.0.2.ip6.arpa. IN PTR
 
;; ANSWER SECTION:
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.X.X.X.X.0.0.2.ip6.arpa. 86400IN PTR www6.EXAMPLE.com.
 
;; AUTHORITY SECTION:
0.0.0.0.0.0.X.X.X.X.X.0.0.2.ip6.arpa. 86400 IN NS gatewaysvr.EXAMPLE.com.
 
;; ADDITIONAL SECTION:
gatewaysvr.EXAMPLE.com.   3600    IN      A       192.168.X.1
gatewaysvr.EXAMPLE.com.   3600    IN      AAAA    200X:XXXX::1
 
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Jan  9 23:50:59 2012
;; MSG SIZE  rcvd: 187

jail 内 web サーバの設定

jail の確認
# jls
   JID  IP Address      Hostname               Path
     1  192.168.X.2     FOO.com                /usr/jails/JAILNAME1
     2  192.168.X.3     BAR.com                /usr/jails/JAILNAME2
     3  192.168.X.4     www.EXAMPLE.com        /usr/jails/JAILNAME3
jail 内へログイン
# jexec 3 /bin/tcsh
httpd-vhosts.conf の設定

jail 内の httpd-vhosts.conf を設定し、IPv4IPv6 のアクセスによってドキュメントルートを変えるようにする。
また、ログファイルも切り分ける。/etc/newsyslog.conf にもログローテートするように書き加える。

# vi /usr/local/etc/apache22/extra/httpd-vhosts.conf
 
#NameVirtualHost *:80
NameVirtualHost 192.168.X.4:80
NameVirtualHost [200X:XXXX::4]:80
 
<VirtualHost [200X:XXXX::4]:80>
    ServerAdmin info@EXAMPLE.com
    ServerName www6.EXAMPLE.com
    DocumentRoot "/usr/local/www/apache22/data/data6"
    ErrorLog "/var/log/httpd6-error.log"
    CustomLog "/var/log/httpd6-access.log" common
</VirtualHost>
 
<VirtualHost 192.168.X.4:80>
    ServerAdmin info@EXAMPLE.com
    ServerName www.EXAMPLE.com
    ServerAlias EXAMPLE.com
    DocumentRoot "/usr/local/www/apache22/data"
    ErrorLog "/var/log/httpd-error.log"
    CustomLog "/var/log/httpd-access.log" common
</VirtualHost>