IPv6 on Debian GNU/Linux

At your own risk.
Jun 2007 (state: 6to4を使って外部接続可能に)
Table of Contents
-Packet Filter(ip6tables) ...IPv6が稼動するまえに、フィルタを整備しよう。
-IPv6 config .../proc/sys以下のIPv6ルータ用設定をする。
-IPv6 6to4 ...近くの6to4ルータへのトンネルを作ろう
-Router Advertisement Daemon(radvd) ...IPv6の自動設定できるようにルータ広告デーモンを動かそう。
-DNS(bind9) ...IPv6対応のbind9で名前解決をしよう。


Packet Filter(ip6tables)

やはりフィルタは必要と思うので設定。
ルータとなるマシンでの設定(とりえあずの設定)。
#
# ethx = device of subnetwork
#
#<<<<<<<<< FILTER >>>>>>>>>>#
*filter
:INPUT DROP 
:FORWARD DROP 
:OUTPUT DROP 
#
##### INPUT ##############
### LOOPBACK
-A INPUT -i lo -j ACCEPT
-A INPUT -s ::1/128 -d ::1/128 -j ACCEPT 
### SESSION CONNECTED(if support state)
#-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
### SESSION CONNECTED(if not support state)
-A INPUT -p tcp --tcp-flags ! FIN,SYN,RST,ACK SYN -j ACCEPT
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN,ACK -j ACCEPT
### [POWER USER USE/TCP] 22(SSH)
-A INPUT -i sit0 -p tcp -m tcp --dport 22 -j ACCEPT 
### SUB-NETWORK
-A INPUT -i ethx -j ACCEPT 
### ICMP
-A INPUT -i ethx -p ipv6-icmp -j ACCEPT 
-A INPUT -i sit0 -p ipv6-icmp -j ACCEPT 
### LOG
-A INPUT -j LOG 
#
##### FORWARD ############
### SESSION CONNECTED(if support state)
#-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 
### SESSION CONNECTED(if not support state)
-A FORWARD -p tcp --tcp-flags ! FIN,SYN,RST,ACK SYN -j ACCEPT
-A FORWARD -p tcp --tcp-flags FIN,SYN,RST,ACK SYN,ACK -j ACCEPT
### [TWO WAY] 22,22(SSH)
-A FORWARD -i ethx -p tcp -m tcp --dport 22 -j ACCEPT 
-A FORWARD -i ethx -p tcp -m tcp --dport 22 -j ACCEPT 
-A FORWARD -i sit0 -p tcp -m tcp --dport 22 -j ACCEPT 
-A FORWARD -i sit0 -p tcp -m tcp --dport 22 -j ACCEPT 
### [TO OUTSIDE ONLY] ICMPv6, 20,21(FTP), 2401(CVS)
-A FORWARD -i ethx -p ipv6-icmp -j ACCEPT 
-A FORWARD -i ethx -p tcp -m tcp --dport 20:21 -j ACCEPT 
-A FORWARD -i ethx -p tcp -m tcp --dport 2401 -j ACCEPT 
### [TO OUTSIDE ONLY] 80(HTTP), 433(HTTPS)
#-A FORWARD -i ethx -p tcp -m tcp --dport 80 -j ACCEPT 
#-A FORWARD -i ethx -p tcp -m tcp --dport 443 -j ACCEPT 
### LOG
-A FORWARD -j LOG 
##### OUTPUT #############
### LOOPBACK
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -s ::1/128 -d ::1/128 -j ACCEPT 
### SESSION CONNECTED(if support state)
#-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
### SESSION CONNECTED(if not support state)
-A OUTPUT -p tcp --tcp-flags ! FIN,SYN,RST,ACK SYN -j ACCEPT
-A OUTPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN,ACK -j ACCEPT
### [POWER USER USE]22,22(SSH)
-A OUTPUT -o sit0 -p tcp -m tcp --dport 22 -j ACCEPT 
-A OUTPUT -o sit0 -p tcp -m tcp --dport 22 -j ACCEPT 
### [TO OUTSIDE ONLY] 20,21(FTP), 2401(CVS), 80(HTTP), 433(HTTPS)
-A OUTPUT -o sit0 -p tcp -m tcp --dport 20:21 -j ACCEPT 
-A OUTPUT -o sit0 -p tcp -m tcp --dport 2401 -j ACCEPT 
-A OUTPUT -o sit0 -p tcp -m tcp --dport 80 -j ACCEPT 
-A OUTPUT -o sit0 -p tcp -m tcp --dport 443 -j ACCEPT 
### SUB-NETWORK
-A OUTPUT -o ethx -j ACCEPT 
### ICMP
-A OUTPUT -o ethx -p ipv6-icmp -j ACCEPT 
-A OUTPUT -o sit0 -p ipv6-icmp -j ACCEPT 
### LOG
-A OUTPUT -j LOG 
#
#
COMMIT
#

IPv6 config

/etc/sysctrl.confに下記のように設定(ルータ設定)。
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=1

IPv6 6to4

RFC3056(Connection of IPv6 Domains via IPv4 Clouds), RFC3068(An Anycast Prefix for 6to4 Relay Routers)と Debian IPv6 -Debian Wiki を参考に、トンネルの設定(/etc/network/interfaces)。
auto sit0
iface sit0 inet6 static
        address 2002:xxxx:xxxx::1
        netmask 64
        gateway ::192.88.99.1
        mtu 1434  # via NTT Flet's PPPoE(MTU 1454)
192.88.99.1は一番近くの6to4ルータに接続するための特別なエニーキャストアドレスだそうだ。
この設定を通すためのiptables(IPv4)の下記設定を追加
-A INPUT  -p ipv6 -j ACCEPT
-A OUTPUT -p ipv6 -j ACCEPT

Router Advertisement Daemon(radvd)

/etc/radvd.confを作って、radvdを起動させます。
interface ethx
{  
   AdvSendAdvert on;
   prefix 2002:xxxx:xxxx:xxxx::/64
   {
        AdvOnLink on;
        AdvAutonomous on;
   };
};

DNS(bind9)

現在あるdomain.jpの名前データベースに"AAAA"レーコードを追加。 アドレスは上位64bitが言わばネットワークアドレスで、 下位64bitがユニークなアドレス(EthernetではMACアドレスのEUI-48をEUI-64拡張したもの)。
v6host		AAAA	2002:xxxx:xxxx:xxxx:yyyy:yyff:feyy:yyyy
逆引きデータを用意しよう。下位64bitを4bitづつ逆順に記述する。
@ IN    SOA     ns.domain.jp. root.domain.jp. (
                                200706071       ; Serial
                                28800   ; Refresh
                                7200    ; Retry
                                604800  ; Expire
                                86400)  ; Minimum TTL
                        NS      ns.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  ns.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  gw.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  proxy.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  cvs.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  dns.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  nfs.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  ntp.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  www.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  mail.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR  smtp.domain.jp.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0	IN PTR	agate.domain.jp.
;;
y.y.y.y.y.y.e.f.f.f.y.y.y.y.y.y	IN PTR	v6host.domain.jp.
named.confに"arpa"および"int"に両対応する設定を記述。上位64bitの4bitづつ逆順をzoneに記述。
zone "x.x.x.x.x.x.x.x.x.x.x.x.2.0.0.2.ip6.arpa" {
        type master;
        file "/etc/bind/local/2002:xxxx:xxxx:xxxx";
};
zone "x.x.x.x.x.x.x.x.x.x.x.x.2.0.0.2.ip6.int" {
        type master;
        file "/etc/bind/local/2002:xxxx:xxxx:xxxx";
};

EUI-64拡張

(EUI-48 to EUI-64変換)
EUI-48: OOOOOOOO OOOOOOOO OOOOOOOO SSSSSSSS SSSSSSSS SSSSSSSS 
EUI-68: OOOOOONO OOOOOOOO OOOOOOOO 11111111 11111110 SSSSSSSS SSSSSSSS SSSSSSSS 

Last modified: Mon Mar 2 17:52:10 JST 2009