OCNIPv6 for Fedora (Ver2)
背景変更 ENV
※お断り
  • 無保証です(^^;; 自己責任にてお試しください。
  • ご質問や問題点のご指摘は大歓迎です。何かありましたらお気軽にご連絡ください。
旧ページはこちら

OCNIPv6とは

OCNIPv6は、OCNが行っているL2TPによるIPv6接続サービスです。
OCNユーザーであれば月額315円で手軽にIPv6接続を行うことが出来ます。
このサービスでは、固定プレフィックス/64・非固定プレフィックス/64のグローバルIPv6アドレスが それぞれ1ブロックずつ割り当てられますので、実質的にほぼ無限のグローバルアドレス空間が手に入ります。
グローバルアドレスはなかなか便利なもので、NAT越え問題や動的IPによる問題を一挙に解決してくれます。
これは一度使うと便利でやめられません(^^;;
また、IPv6がIPSecネイティブ対応という点も見逃せません。

OCNではWindowsXP/Windows7対応の接続プログラムを用意していますが、
このメモでは安いPCでも充分な性能を発揮してくれるLinuxをルータに仕立て上げ、
これを用いてOCNIPv6へ接続することで、いつでも安心して利用できる環境の構築を目指します。

必要なもの


インストールの前に


インストールが必要なソフトウエアとその設定

※既にFedora14以上がインストール済みであることが前提です。
※yum -y updateしてシステムを最新にした上で行うことをお勧めします。

インストール/設定が必要なソフトウエア

インストール/設定手順

  1. 事前確認
    • /etc/sysconfig/network-scripts/ifcfg-$eth
      イーサネットインターフェースにIPv6アドレスを設定します。
      $〜、をそれぞれ以下に置換します。
      • $addrv6 - このインターフェースにつけるIPv6アドレス(例 "2001:****:****:****::efef:0001/64")
      • $eth - イーサネットのデバイス名(例 "eth0")
      ファイル - /etc/sysconfig/network-scripts/ifcfg-$eth DEVICE="$eth"
      BOOTPROTO="dhcp"
      NM_CONTROLLED="yes"
      ONBOOT="yes"

      IPV6INIT="yes"
      IPV6ADDR="$addrv6"
    • NetworkManagerを無効にしてnetworkを使う
      Fedora14はNetworkManagerがデフォルトで利用されていますので、これを無効にしてnetworkを利用する設定に変更します。
      コマンド /etc/rc.d/init.d/NetworkManager stop; /etc/rc.d/init.d/network stop; /etc/rc.d/init.d/network start;
      chkconfig NetworkManager off
      chkconfig network on
    • RouterAdvertisement(RA)を受け取らない。
      ルータにしますので、他のルータからの広告を受け取らないようにします。
      /etc/sysctl.conf (追記) net.ipv6.conf.all.accept_ra = 0;
      コマンド sysctl -w net.ipv6.conf.all.accept_ra=0
  2. IPv6パケットフォワード・パケットフィルタの設定
    • パケットフォワーディングの設定
      /etc/sysconfig/networkにipv6パケットフォワードを許可するパラメータを追加します
      ファイル - /etc/sysconfig/network (追記) NETWORKING=yes
      NETWORKING_IPV6=yes
      IPV6FORWARDING=yes
    • ip6tablesの設定
      ip6tablesの設定ファイル/etc/sysconfig/ip6tablesを次のように記述します。
      ただし、$〜はそれぞれ次のように置換します。
      • $eth - LANが接続されているイーサネットインターフェース(通常eth0)
      • $prefix - OCNから割り当てられた固定プレフィックス(2001:****:****:****::/64)
      なお、ここで示すのは原則LAN内からのパケットは通過、LAN外からのパケットは破棄、される設定です。
      また、サーバへのアクセスはLAN内、TCP22番(SSH)、UDP53番(DNS)、LinkLocalのDHCP(Server/Client)のみ許可します。
      IPv6サーバーを外部に公開したい場合は別途設定を追記する必要があります。
      また、スプーフィング対策のためにも、グローバルアドレスに対しては入力インターフェース名も指定するようにした方が良いと思います。
      ※Fedora14のip6tablesはコネクションの追跡が可能であり、stateが利用可能です。
      ファイル - /etc/sysconfig/ip6tables *filter
      :INPUT DROP [0:0]
      :FORWARD DROP [0:0]
      :OUTPUT ACCEPT [0:0]
      # 既に接続されているコネクションは通過、IPv6-ICMPは通過(必須)、ループバックも通過
      -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      -A INPUT -p ipv6-icmp -j ACCEPT
      -A INPUT -i lo -j ACCEPT

      # DHCPv6サーバ(547)、DHCPv6クライアント(546)はリンクローカルのみ通過
      -A INPUT -s fe80::/64 -p udp --dport 547 -j ACCEPT
      -A INPUT -s fe80::/64 -p udp --dport 546 -j ACCEPT

      # イーサネットからでかつ自ネットワークからのTCP22番(SSH)、TCP/UDP53番(DNS)は許可
      -A INPUT -i $eth -s $prefix -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
      -A INPUT -i $eth -s $prefix -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
      -A INPUT -i $eth -s $prefix -p udp --dport 53 -j ACCEPT

      # それ以外は拒否
      -A INPUT -j REJECT --reject-with icmp6-adm-prohibited

      # NetBIOS関連は外に出さない
      -A OUTPUT -p udp -m udp --dport 137:139 -j DROP
      -A OUTPUT -p tcp -m tcp --dport 137:139 -j DROP
      -A OUTPUT -p tcp -m tcp --dport 445 -j DROP

      # 接続済み転送要求は許可
      -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

      # NetBIOS関連は転送しない
      -A FORWARD -p udp -m udp --dport 137:139 -j DROP
      -A FORWARD -p tcp -m tcp --dport 137:139 -j DROP
      -A FORWARD -p tcp -m tcp --dport 445 -j DROP

      # イーサネットからでかつ自ネットワークからの転送要求は許可
      -A FORWARD -i $eth -s $prefix -j ACCEPT

      # それ以外は拒否
      -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited

      COMMIT
    • ip6tables設定反映
      最後にip6tablesを再起動し、設定を反映させます。
      また、パケットフォワーディングも開始させます。
      コマンド /etc/rc.d/init.d/ip6tables restart
      chkconfig ip6tables on
      sysctl -w net.ipv6.conf.all.forwarding=1
  3. IPv4パケットフィルタの設定例
    • IPv4パケットフィルタの設定
      このメモとはあまり関係ありませんが、一応IPv4パケットフィルタの設定も記述しておきます。
      iptablesの設定ファイル/etc/sysconfig/iptablesを次のように記述します。
      ただし、$〜はそれぞれ次のように置換します。
      • $eth - LANが接続されているイーサネットインターフェース(通常eth0)
      • $netaddr - LANで利用しているネットワーク(例:192.168.0.0/24)
      ファイル - /etc/sysconfig/iptables *filter
      :INPUT DROP [0:0]
      :FORWARD DROP [0:0]
      :OUTPUT ACCEPT [0:0]

      # 接続済みコネクション、ICMP(極力許可すること)、ローカルループバックは許可
      -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      -A INPUT -p icmp -j ACCEPT
      -A INPUT -i lo -j ACCEPT

      # イーサネットからでかつ自アドレスからのTCP22番(SSH)とTCP/UDP53(DNS)、UDP67-68(DHCPサーバ/クライアント)は許可
      -A INPUT -i $eth -s $netaddr -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
      -A INPUT -i $eth -s $netaddr -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
      -A INPUT -i $eth -s $netaddr -p udp --dport 53 -j ACCEPT
      -A INPUT -i $eth -p udp --dport 67:68 -j ACCEPT

      # それ以外は拒否
      -A INPUT -j REJECT --reject-with icmp-host-prohibited

      # パケット転送要求は全て拒否
      -A FORWARD -j REJECT --reject-with icmp-host-prohibited

      # NetBIOS関連は外に出さない
      -A OUTPUT -p udp -m udp --dport 137:139 -j DROP
      -A OUTPUT -p tcp -m tcp --dport 137:139 -j DROP
      -A OUTPUT -p tcp -m tcp --dport 445 -j DROP
      COMMIT
    • iptables設定反映
      最後にiptablesを再起動し、設定を反映させます。
      コマンド /etc/rc.d/init.d/iptables restart
      chkconfig iptables on
  4. xl2tpdのセットアップ
    • xl2tpdのインストール
      xl2tpdのインストールは次のコマンドで可能です。
      コマンド yum -y install xl2tpd
    • /etc/xl2tpd/xl2tpd.confの設定
      /etc/xl2tpd/xl2tpd.confを次のように作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $userid - OCNのユーザーID(****@***.ocn.ne.jp)
      • $l2tpserv - OCNから送られてきた固定プレフィックス用接続サーバ名
      ファイル - /etc/xl2tpd/xl2tpd.conf [global]
      auth file = /etc/ppp/chap-secrets

      [lac OCNIPv6]
      lns = $l2tpserv
      hostname = $userid
      ppp debug = yes
      pppoptfile = /etc/ppp/peers/ocn-ipv6
      length bit = yes
      require chap = yes
      refuse pap = yes
      redial = yes
      redial timeout = 10
      max redials = 6
      require authentication = yes
    • /etc/ppp/peers/ocn-ipv6の設定
      /etc/ppp/peers/ocn-ipv6を次のように新規にファイルを作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $userid - OCNのユーザーID(****@***.ocn.ne.jp)
      ファイル - /etc/ppp/peers/ocn-ipv6 nodefaultroute
      noip
      +ipv6
      usepeerdns
      user $userid
      mtu 1390
      noipdefault
      default-asyncmap
      nopcomp
      noaccomp
      noccp
      novj
      nobsdcomp
      nodeflate
      lcp-echo-interval 30
      lcp-echo-failure 2
      lock
      noauth

      debug
      logfile /var/log/xl2tpd.ocn-ipv6.log
      ipparam ocnipv6
    • /etc/ppp/chap-secretの設定
      次のコマンドを実行します。ただし、$〜、をそれぞれ以下に置換します。
      • $userid - OCNのユーザーID(****@***.ocn.ne.jp)
      • $password - OCNの接続パスワード
      /etc/ppp/chap-secret (追記) $userid * $password *
    • 接続スクリプト(ocn-ipv6.sh)の作成と設定
      /etc/ppp/peers/ocn-ipv6.shへ次のファイルを作成します。
      ただし、$eth、を以下に置換します。
      • $eth - イーサネットインターフェース名(例:eth0)
      /etc/ppp/peers/ocn-ipv6.sh #!/bin/sh

      DEVNAME=$2
      LOGICALNAME=$3
      ETH="$eth"
      L2TPNAME="OCNIPv6"

      XL2TPCTL="/var/run/xl2tpd/l2tp-control"
      DHCPDIR="/etc/dhcp/ocn/"
      INITSCR="/etc/rc.d/init.d/OCNIPv6"

      PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin
      export PATH

      writeToFile(){
        echo "interface $DEVNAME {"      > $DHCPDIR$DEVNAME;
        echo "  send ia-pd 0;"          >> $DHCPDIR$DEVNAME;
        echo "};"                       >> $DHCPDIR$DEVNAME;
        echo "id-assoc pd 0{"           >> $DHCPDIR$DEVNAME;
        echo "  prefix-interface $ETH {">> $DHCPDIR$DEVNAME;
        echo "    sla-id 1;"            >> $DHCPDIR$DEVNAME;
        echo "    sla-len 0;"           >> $DHCPDIR$DEVNAME;
        echo "  };"                     >> $DHCPDIR$DEVNAME;
        echo "};"                       >> $DHCPDIR$DEVNAME;
      }

      if [ "$LOGICALNAME" != "ocnipv6" ]; then
        exit 0;
      fi
      if [ "$DEVNAME" == "" ]; then
        if [ -f "$DHCPDIR-dev" ]; then
          $DEVNAME=`cat $DHCPDIR-dev`
        fi
      fi
      if [ "$DEVNAME" == "" ]; then
        exit 0;
      fi

      conStart(){
        writeToFile;

        dhcp6c -c $DHCPDIR$DEVNAME -p $DHCPDIR$DEVNAME-pid $DEVNAME
        route -A inet6 add ::/0 dev $DEVNAME

        echo "$DEVNAME" > $DHCPDIR-dev
      }


      conStop (){
        if [ ! -f "$DHCPDIR$DEVNAME-pid" ]; then
          return;
        fi
        if [ -f "$DHCPDIR-dev" ]; then
          rm "$DHCPDIR-dev"
        fi
        kill `cat $DHCPDIR$DEVNAME-pid`
        sleep 2
        echo "d $L2TPNAME" > $XL2TPCTL
        sleep 1
      }

      case "$1" in
        start)
          conStart
          ;;
        stop)
          conStop
          ;;
        reload)
          conStop
          sleep 20
          $INITSCR start
          ;;
        *)
          echo "$0 [start|stop] <devName> <logicalName>"
          ;;
      esac

      exit $?
      次に、パーミッションの設定とディレクトリの作成を行います。
      コマンド mkdir /etc/dhcp/
      mkdir /etc/dhcp/ocn/
      chmod 755 /etc/ppp/peers/ocn-ipv6.sh
      最後に、/etc/ppp/ipv6-up、/etc/ppp/ipv6-downを編集し、
      ppp(IPv6CP)のup/downに合わせてocn-ipv6.shを実行されるよう設定します。
      ※注:ちょっとスマートじゃないような...。何か良い方法がありましたらお教えいただけますと嬉しいです。
      /etc/ppp/ipv6-up (編集) (LINE40行近辺、REALDEVICE=$1の次の行へ1行追記)
      LOGDEVICE=$6
      REALDEVICE=$1

      /etc/ppp/peers/ocn-ipv6.sh start $1 $6
      /etc/ppp/ipv6-down (編集) (LINE35行近辺、REALDEVICE=$1の次の行へ1行追記)
      LOGDEVICE=$6
      REALDEVICE=$1

      /etc/ppp/peers/ocn-ipv6.sh reload $1 $6
      なお、/etc/ppp/ipv6-downの方は、上記記述の場合、自動で再接続を試みるようになります。ちょっと手抜きですが...。
      reloadをstopに変えることで、再接続させないようにできます。なお、最低でもstopは入れておいてください。
      さもなくば、DHCPv6 Clientが多重起動することになります。
    • xl2tpd起動設定
      xl2tpdを起動し、サーバの起動時にxl2tpdサーバも起動するよう設定します
      設定は次のコマンドで可能です。
      コマンド /etc/rc.d/init.d/xl2tpd start
      chkconfig xl2tpd on
    • (参考)xl2tpdによるL2TP接続〜ルーティング開始までの流れ
      xl2tpdによるOCNIPv6トンネリングの開始・終了は以下のコマンドで行います。
      コマンド # 開始
      echo "c OCNIPv6" > /var/run/xl2tpd/l2tp-control
      # 終了
      echo "d OCNIPv6" > /var/run/xl2tpd/l2tp-control
      開始することで、インターフェースppp0が出来あがります。
      次に、WIDE-DHCPv6 Clientを用いて、OCNからプレフィックスを割り当ててもらいます。
      このときWIDE-DHCPv6には以下の設定ファイルを渡します。
      以下は、PPPインターフェース"ppp0"、イーサネットインターフェース"eth0"での記述例です。
      ファイル dhclient6.conf interface ppp0 {
              send ia-pd 0;
      };

      id-assoc pd 0{
              prefix-interface eth0 {
                      sla-id 1;
                      sla-len 0;
              };
      };
      WIDE-DHCPv6 Clientの起動は以下コマンドで可能です。
      コマンド dhcp6c -c dhclient6.conf -p pid.dat ppp0
      これを実行した後、ifconfigでイーサネットインターフェースを見ると、グローバルIPv6アドレスがわり当たっていることが確認できます。
      このままではパケットがppp0へルーティングされませんので、以下コマンドを用いてppp0へIPv6パケットをスタティックにルーティングしてやります。
      コマンド route -A inet6 add ::/0 dev ppp0
      以上でOCNIPv6へIPv6パケットがルーティングされるようになります。
      あとはradvdを用いてルーティング情報を広報し、DHCPv6でIPv6アドレスを配布するだけで、
      各クライアントはIPv6通信ができるようになります。
      先に記したocn-ipv6.shはPPPのIPv6CP完了時に、以上一連の処理を自動で行います。
      スクリプトが気に入らないっという方は、自分でサクッと作ってしまった方が良いかもしれません(^^;;

      ※xl2tpdに終了コマンドを送った時は、/etc/ppp/ipv6-downは実行されない点に注意が必要です。
      ipv6-downが実行されるのは、リンクが何らかの原因で消失した時です。
      ※ppp0へのスタティックルートはppp0消失と同時に消えますので、L2TP接続毎にルートの再設定が必要です。 その際はDHCPv6 Clientの再起動も必要です。

  5. WIDE-DHCPv6のセットアップ
    • まず、http://sourceforge.net/projects/wide-dhcpv6/よりWIDE-DHCPv6のソースをダウンロードします
    • 適当な場所で展開して、インストールします。
      インストールは次のコマンドで可能です
      コマンド yum -y install gcc flex bison
      tar -xvzf wide-dhcpv6-20080615.tar.gz
      cd wide-dhcpv6-20080615
      sed -i 's/dprintf/debug_printf/g' *.c *.h
      CFLAGS="-D _GNU_SOURCE" ./configure
      make
      make install
      cd ..
      rm -rf wide-dhcpv6-20080615*
      openssl rand -base64 16 > /usr/local/etc/dhcp6cctlkey
      なお、WIDE-DHCPv6 Clientはocn-ipv6.shより自動起動されますので、自動起動設定等は不要です。
      また、dhcp6cctlkeyは必須です(ないとWIDE-DHCPv6 Clientを起動できません)

  6. radvdのセットアップ
    • radvdのインストール
      IPv6ルーティング情報を広告するradvdをインストールします。
      radvdでIPv6アドレスを一緒に配布することもできますが、このメモではIPアドレスはDHCPv6で配布し、 radvdではルーティング情報のみ配布させることを前提にします。
      インストールは次のコマンドで可能です。
      コマンド yum -y install radvd
    • /etc/radvd.confの設定
      /etc/radvd.confを次のように作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $eth - LANに接続されているイーサネットインターフェース(通常eth0)
      • $prefix - 固定プレフィックス/プレフィックス長 (2001:****:****:****::/64)
      DHCPv6を利用するか否かはAdvManagedFlagのon/offで切り替えることが出来ます。
      このメモではDNS等もDHCPv6で設定しますので、AdvManagedFlag onを基本としますが、
      DHCPv6を利用しないAdvManagedFlag off(デフォルトoffのため記述しない)の例も記載しておきます。
      なお、DHCPv6を利用しない場合、DHCPv4でDNS等を設定するなどが必要かもしれません。
      ※当然DHCPv4ではIPv4 DNSしか設定できませんので注意。

      ↓DHCPv6を利用する場合(Statefull設定)
      ファイル - /etc/radvd.conf interface $eth
      {
              AdvSendAdvert on;
              MinRtrAdvInterval 30;
              MaxRtrAdvInterval 100;
              AdvManagedFlag on;
              prefix $prefix
              {
                      AdvAutonomous off;
              };
      };
      ↓DHCPv6を利用しない場合(Stateless設定)
      ファイル - /etc/radvd.conf interface $eth
      {
              AdvSendAdvert on;
              MinRtrAdvInterval 30;
              MaxRtrAdvInterval 100;
              prefix $prefix
              {
                      AdvOnLink on;
                      AdvAutonomous on;
              };

      };
    • radvd起動設定
      radvdを起動し、サーバの起動時にradvdサーバも起動するよう設定します
      設定は次のコマンドで可能です。
      コマンド /etc/rc.d/init.d/radvd start
      chkconfig radvd on
  7. IPv6対応DNSサーバのセットアップ
    IPv6対応のDNSを名前解決に利用しないと特にIPv6対応アプリケーションで接続に物凄く時間がかかる、という現象が生じます。
    これを回避するため、IPv6対応DNSがLAN内に無い場合はIPv6対応DNSを用意することをお勧めいたします。
    • named(BIND9)のインストール
      named(BIND9)のインストールは次のコマンドで可能です。
      また、インストール後、ルートゾーンの更新、bindコントロール用共通鍵の生成も一緒に行います。
      ※Fedora14のbind-chrootは、/etc/named/をbind起動時に/var/named/chroot/etc/named/へmount -t bindしてくれます。
      そのため、bind設定ファイルを/var/named/chroot以下へわざわざ移動させる必要はありません。
      コマンド yum -y install bind bind-chroot
      dig . ns \@198.41.0.4 > /var/named/named.ca
      rndc-confgen -a -b 256 -r /dev/urandom -u named
    • /etc/named.confの設定
      /etc/named.confを次のように作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $domain - このネットワークのドメイン名(例:hoge-net.local)
      ファイル - /etc/named.conf options {
              listen-on port 53 { any; };
              listen-on-v6 port 53 { any; };
              directory       "/var/named";
              dump-file       "/var/named/data/cache_dump.db";
              statistics-file "/var/named/data/named_stats.txt";
              memstatistics-file "/var/named/data/named_mem_stats.txt";
              allow-query     { localhost; localnets; };
              recursion no;

              dnssec-enable yes;
              dnssec-validation yes;
              dnssec-lookaside auto;

              #/* Path to ISC DLV key */
              #bindkeys-file "/etc/named.iscdlv.key";

              managed-keys-directory "/var/named/dynamic";
      };

      logging {
              channel default_debug {
                      file "data/named.run";
                      severity dynamic;
              };
      };

      view "internal" {
              match-clients { localnets;};
              match-destinations { localhost; };
              recursion yes;
              zone "." IN {
                      type hint;
                      file "named.ca";
              };
              include "/etc/named/$domain.zones";
              include "/etc/named.rfc1912.zones";
              include "/etc/named.root.key";
      };

      include "/etc/rndc.key";

      controls {
        inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; };
      };
    • ゾーンの作成
      /etc/named/$domain.zonesを次のように作成します。ただし、$〜、を以下に置換します。
      • $domain - LAN内で使うドメイン名(例:hoge-net.local)
      • $rev_net - LAN内のネットワークアドレスをひっくり返した値。
        (例: 192.168.254.0ネットワークの場合、"254.168.192")
      • $rev_prefix - 割り当てられたIPv6固定プレフィックスをひっくり返した値。
        (例: 2001:abcd:ef12:3456::/64の場合、"6.5.4.3.2.1.f.e.d.c.b.a.1.0.0.2")
      ファイル - /etc/named/$domain.zones
      zone "$domain" {
              type master;
              file "/etc/named/$domain/$domain.db";
      };
      zone "$rev_prefix.ip6.arpa" {
              type master;
              file "/etc/named/$domain/$rev_prefix.ip6.arpa.db";
      };
      zone "$rev_net.in-addr.arpa" {
              type master;
              file "/etc/named/$domain/$rev_net.in-addr.arpa.db";
      };
    • 正引き設定
      /etc/named/$domain/$domain.dbを次のように作成します。ただし、ファイル名・ファイル内容共に$〜、を以下に置換します。
      • $domain - LAN内で使うドメイン名(例:hoge-net.local)
      • $addr - このサーバのIPv4プライベートアドレス
      • $addrv6 - このサーバのIPv6グローバルアドレス
      • $hostname - このサーバのホスト名(例:gateway)
      ファイル - /etc/named/$domain/$domain.db $TTL    3d
      @       IN      SOA     $domain.  root.$domain.(
                                    2011010101 ; Serial
                                    28800      ; Refresh
                                    14400      ; Retry
                                    3600000    ; Expire
                                    86400 )    ; Minimum
                IN NS    ns1.$domain.

      ns1       IN A     $addr
      ns1       IN AAAA  $addrv6

      $hostname IN A     $addr
      $hostname IN AAAA  $addrv6

    • IPv4逆引き設定
      /etc/named/$domain/$rev_net.in-addr.arpa.dbを次のように作成します。ただし、ファイル名・ファイル内容共に$〜、を以下に置換します。
      • $rev_net - LAN内のネットワークアドレスをひっくり返した値。
        (例: 192.168.254.0ネットワークの場合、"254.168.192")
      • $domain - LAN内で使うドメイン名(例:hoge-net.local)
      • $addr_host - このサーバのIPv4プライベートアドレスのホストアドレス
        (例:192.168.254.2の場合、"2")
      • $hostname - このサーバのホスト名(例:gateway)
      ファイル - /etc/named/$domain/$rev_net.in-addr.arpa.db $TTL    3d
      @       IN      SOA     $domain.  root.$domain.(
                                   2011010101 ; Serial
                                   28800      ; Refresh
                                   14400      ; Retry
                                   3600000    ; Expire
                                   86400 )    ; Minimum
                 IN      NS     ns1.$domain.
      $addr_host IN      PTR    $hostname.$domain.
    • IPv6逆引き設定
      /etc/named/$domain/$rev_prefix.ip6.arpa.dbを次のように作成します。
      ただし、ファイル名・ファイル内容共に$〜、を以下に置換します。
      • $rev_prefix - 割り当てられたIPv6固定プレフィックスをひっくり返した値。
        (例: 2001:abcd:ef12:3456::/64の場合、"6.5.4.3.2.1.f.e.d.c.b.a.1.0.0.2")
      • $domain - LAN内で使うドメイン名(例:hoge-net.local)
      • $addr_host6 - このサーバのIPv6ホストアドレスをひっくり返した値。
        (例: 2001:abcd:ef12:3456::2/64の場合、"2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0")
      • $hostname - このサーバのホスト名(例:gateway)
      ファイル - /etc/named/$domain/$rev_prefix.ip6.arpa.db $TTL    3d
      @       IN      SOA     $domain.  root.$domain.(
                                            2011010102 ; Serial
                                            28800      ; Refresh
                                            14400      ; Retry
                                            3600000    ; Expire
                                            86400 )    ; Minimum
                  IN   NS  ns1.$domain.
      $addr_host6 IN   PTR $hostname.$domain.
    • DNSリゾルバ設定
      /etc/resolv.confを次のように作成します。ただし、$〜、を以下に置換します。
      • $domain - LAN内で使うドメイン名(例:hoge-net.local)
      ファイル - /etc/resolv.conf search $domain
      nameserver localhost
    • DNS起動設定
      最後にDNSを起動し、サーバの起動時にDNSサーバも起動するよう設定します
      設定は次のコマンドで可能です。
      コマンド /etc/rc.d/init.d/named start
      chkconfig named on
      無事起動できたら、nslookup www.kame.netでIPv4アドレスが、nslookup -type=AAAA www.kame.netでIPv6アドレスが、
      それぞれ引ける事を確認してください。また、ssh 、でこのサーバーへログインできることも確認してください。

  8. DHCPv6サーバのセットアップ
    IPv6アドレスの固定化等が必要無い場合、DHCPv6は必要ありません。(ステートレス設定で構成します)
    固定IPv6サーバ等を置く場合、DHCPv6を利用した方が便利です。また、DHCPv6を利用するとIPv6 DNSアドレスを設定できますので便利です。
    • dhcpのインストール
      dhcpのインストールは次のコマンドで可能です。
      ※Fedora14のdhcpはIPv4/IPv6両方に対応しています。
      コマンド yum -y install dhcp
    • DHCPv6サーバ設定
      /etc/dhcp/dhcpd6.confを次のように作成します。ただし、$〜、を以下に置換します。
      • $domain - LAN内で使うドメイン名(例:hoge-net.local)
      • $addrv6 - DNSサーバIPv6アドレス(このサーバのIPv6アドレス)
      • $prefix - OCNから割り当てられた固定プレフィックス(2001:****:****:****::/64)
      • $net - ご利用中のLANのネットワークアドレス
      • $min - 貸し出し開始IPv6ホストアドレス(例: fefe:1)
      • $max - 貸し出し終了IPv6ホストアドレス(例: fefe:10)
      ファイル - /etc/dhcp/dhcpd6.conf default-lease-time 3600;
      max-lease-time 7200;
      subnet6 $prefix {
        # Range for clients
        range6 $prefix::$min $prefix::$max;
        # Additional options
        option dhcp6.name-servers $addrv6;
        option dhcp6.domain-search "$domain";

        # アドレス固定化したいホストを記述
        # option dhcp6.client-idには対象機器インターフェースのDUIDを記述
        # fixed-address6には設定したい固定IPv6アドレスを記述
        host fixedhost1 {
          host-identifier option dhcp6.client-id 00:01:02:03:04:05:06:07:08:09:10:11:12:13;
          fixed-address6 2001:****:****:****::1234;
        }
      }
    • DHCPv6起動設定
      最後にDHCPv6を起動し、サーバの起動時にDHCPv6サーバも起動するよう設定します
      設定は次のコマンドで可能です。
      コマンド /etc/rc.d/init.d/dhcpd6 start
      chkconfig dhcpd6 on
      無事起動できたら、お使いのパソコンを再起動し、正しくDHCPv6からIPv6アドレスが割り当てられていることを確認してください。

  9. initスクリプトの作成
    • OCNIPv6をサーバ起動・終了に合わせてUp/Downさせるinitスクリプトを作成します。
      このスクリプトは、メモの通り設定されている限り、特に編集の必要はありません。
      ファイル - /etc/rc.d/init.d/OCNIPv6 #!/bin/sh
      #
      ### BEGIN INIT INFO
      # Provides: ocnipv6
      # Default-Start:
      # Default-Stop:
      # Should-Start:
      # Required-Start: $network
      # Required-Stop:
      # Short-Description: Start and stop the OCNIPv6 Service
      # Description: ocnipv6 provides the OCNIPv6 Connection Service
      ### END INIT INFO
      #
      # chkconfig: - 99 10
      #
      # echo "d OCNIPv6" > /var/run/xl2tpd/l2tp-control


      PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin
      export PATH

      L2TPNAME="OCNIPv6"
      XL2TPCTL="/var/run/xl2tpd/l2tp-control"
      DEVFILE="/etc/dhcp/ocn/-dev"
      LOCK=/var/lock/subsys/OCNIPv6

      start() {
        if [ -f "$DEVFILE" ]; then
          return;
        fi
        touch $LOCK
        echo "OCNIPv6 Starting..."
        echo "c $L2TPNAME" > $XL2TPCTL
      }

      stop() {
        echo "OCNIPv6 Stopping..."
        if [ -f "$LOCK" ]; then
          rm $LOCK
        fi
        if [ -f "$DEVFILE" ]; then
          DEVNAME=`cat $DEVFILE`
          /etc/ppp/peers/ocn-ipv6.sh stop $DEVNAME ocnipv6
        fi
      }

      usage() {
          echo $"Usage: $0 {start|stop}"
      }

      case "$1" in
          start)
              start
              ;;
          stop)
              stop
              ;;
          *)
              usage
              exit 2
              ;;
      esac

      exit $?
    • システムへの登録
      作成したOCNIPv6をchkconfigを用いてinitスクリプトとして登録します。
      特に、chkconfig --addは、行わないと正常にシステム終了時にOCNIPv6が終了され無くなりますので注意が必要です。
      OCNIPv6を正しく終了させずにシャットダウンすると、しばらくL2TP接続時に認証が通らなくなります。
      コマンド chmod 755 /etc/rc.d/init.d/OCNIPv6
      chkconfig --add OCNIPv6
      chkconfig OCNIPv6 on

これでサーバを再起動すると、自動でOCNIPv6へ接続され、IPv6パケットのルーティングをはじめるはずです。
また、Windows7を利用中であれば、しばらくしてWindows7にIPv6アドレスが割り当てられます。
再起動したくない場合は
コマンド /etc/rc.d/init.d/OCNIPv6 start
を実行することで、同様のことが可能です。接続後、ping6 www.kame.netで応答が帰ってくれば設定は成功です。
また、お使いのパソコンからhttp://www.kame.netにアクセスした時、
カメが踊っていれば使用中のPCも正しくIPv6アドレスが割り当てられています。
カメが踊っていなかったりモザイクが掛かっていたりする場合、IPv6でアクセスできていません。
その場合、以下を確認してみてください。

参考: RedHat系LinuxでDHCPv6クライアントを有効にする DHCPv6クライアントを利用する場合、/etc/sysconfig/network-scripts/ifcfg-eth**へ、 以下のような記述をするだけで簡単に設定できます。
ファイル - /etc/sysconfig/network-scripts/ifcfg-eth** (追記) IPV6INIT=yes
IPV6_AUTOCONF=yes
DHCPV6C=yes
なお、radvdでManagedFlag onで広告を出していれば、DHCPv6 Clientが自動で起動されるのでは...と 思ってしまうのですが、どうもDHCPV6Cの指定は必須のようです。
また、CentOS5ではdhcpv6-clientのインストールが必要です。Fedora14では必要ありません。
Windows7ではManagedFlag onになっていると、自動でDHCPv6を使ってくれるようです。

スクリプトご利用に当たって
  • このページにて紹介されているスクリプトは全てフリーです。
    著作権は放棄しませんが、再配布・改造など自由に行ってくださって構いません。
  • すべて無保証です。ご利用の際は自己責任でお願いいたします。