Feel6 がこんなに簡単に終了するはずがない

って思っていたら、ちょっと前にフリービット株式会社より『「Feel6接続サービス」終了のご案内』なんていうメールが届いてた。

サイトにも記載されているが、Feel6 接続サービスの終了は、2013/7/31 12:00 とのことで、自宅 LAN に Feel6 接続サービスから払い出された /48 のプレフィックスのネットワークから /64 を割り当てて使用していたので、さてどうしようかと。

件のメール中には代替サービスとして、「Feel@DTI」の提案もあるのだけど、ネットワークの払い出しではないようで、私の場合は代替にならなくて、結局「Hurricane Electric Free IPv6 Tunnel Broker」に切り替えた。

※というか、私は ISP に eo 光を使っていて、こちらでも IPv6 接続サービスをやっているのだけど、外部からの接続は遮断、専用ルータのレンタルが必須とか言う仕様…。

話を戻して、HE の Tunnel Broker 、海外のトンネリングサービスになるが、東京にトンネルのエンドポイントがある上、/64 のプレフィックスのネットワークを割り当ててくれる。(/48 もアサイン出来る様だが、個人的にはそこまで必要じゃないので今回はそのまま /64 で。)

当然ながら、自宅 LAN の IPv6 ネットワークアドレスは変わってしまうけど、比較的導入が楽だったので、その備忘録。

なお、この内容は、安全性や正当性などは一切保証しない。間違っていたらコメントなどをいただけると嬉しい。

  • 事前準備

    今回も LAN 内サーバに、IPv6 ルータの役割を担ってもらうので、事前に

    • Hurricane Electric Free IPv6 Tunnel Broker のサイトで登録して、トンネルを割り当ててもらう
    • ルータ側でプロトコル番号 41 を LAN 内サーバへ転送するように設定

    を行っておく。

    今回は、

    • 自宅 LAN サーバの Linux ディストリビューションは Debian GNU/Linux 7.0
    • 自宅 LAN サーバの IPv4 アドレスが 192.168.1.2 (デバイスは eth0)
    • 自宅 LAN サーバの LAN 側に割り当てる IPv6 アドレスは 2001:yyyy:yyyy:yyyy::1 (デバイスは eth0)
    • トンネルのエンドポイントの IPv4 アドレスが aaa.bbb.ccc.ddd
    • HE のサーバ側 IPv6 アドレスが 2001:xxxx:xxxx:xxxx::x
    • クライアント側 IPv6 アドレスが 2001:xxxx:xxxx:xxxx::y
    • 割当ネットワークが 2001:yyyy:yyyy:yyyy::/64

    と言う例である。

  • ネットワークの基本的な設定

    この設定も、実際にトンネルを作成した後、各 OS ごとの設定例などが表示できる。で、表示されるとおりに設定するのであるが、今回は LAN 内サーバなので、「local」の項目だけは、自分自身のプライベート IPv4 アドレスを指定する。

    /etc/network/interfaces に以下を追記

    auto he-ipv6
    iface he-ipv6 inet6 v4tunnel
    	address 2001:xxxx:xxxx:xxxx::y
    	netmask 64
    	endpoint aaa.bbb.ccc.ddd
    	local 192.168.1.2
    	ttl 255
    	gateway 2001:xxxx:xxxx:xxxx::x

    これで、一度サーバを再起動してあげれば、サーバ単体で IPv6 を使用できてしまう。(実際はフィルタリングなどが必要だけど)

  • パケットフィルタを実装 (ちょっと自信が無い)

    引き続き、LAN 内クライアントに IPv6 を自動的に割り振るように、radvd とパケットフィルタなどを設定する。まずはパケットフィルタから。以下は、最低限のパケットフィルタ。これを任意のディレクトリに実行権限付きで保存して、/etc/network/if-pre-up.d/iptables6 などとしてシンボリックリンクをかける。

    必要なサービスがある場合は、そのポートは通す必要がある。

    #!/bin/bash
    
    IP6TABLES="/sbin/ip6tables"
    
    # WAN
    router_ip="2001:xxxx:xxxx:xxxx::x"
    external_ip="2001:xxxx:xxxx:xxxx::y"
    external_dev="he-ipv6"
    
    # LAN
    local_ip="2001:yyyy:yyyy:yyyy::1"
    local_nw="2001:yyyy:yyyy:yyyy::/64"
    local_dev="eth0"
    
    # Flush, Reset
    $IP6TABLES -F
    $IP6TABLES -X
    
    # Deafult Rule
    $IP6TABLES -P INPUT DROP
    $IP6TABLES -P OUTPUT ACCEPT
    $IP6TABLES -P FORWARD DROP
    
    # INLOG Chain
    $IP6TABLES -N INLOG
    $IP6TABLES -A INLOG -j LOG --log-level warning --log-prefix "DROP IPv6IN: " -m limit
    $IP6TABLES -A INLOG -j DROP
    
    # FWDLOG Chain
    $IP6TABLES -N FWDLOG
    $IP6TABLES -A FWDLOG -j LOG --log-level warning --log-prefix "DROP IPv6FWD: " -m limit
    $IP6TABLES -A FWDLOG -j DROP
    
    # loopback
    $IP6TABLES -A INPUT -i lo -j ACCEPT
    
    # Block from WAN to eth (LAN IPv6)
    $IP6TABLES -A INPUT -i ${external_dev} -d ${local_ip} -j INLOG
    
    # icmp
    # WAN
    $IP6TABLES -A INPUT -i ${external_dev} -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
    $IP6TABLES -A INPUT -i ${external_dev} -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
    $IP6TABLES -A INPUT -i ${external_dev} -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
    $IP6TABLES -A INPUT -i ${external_dev} -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
    $IP6TABLES -A INPUT -i ${external_dev} -p icmpv6 --icmpv6-type echo-request -j ACCEPT
    $IP6TABLES -A INPUT -i ${external_dev} -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
    # LAN
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type echo-request -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
    $IP6TABLES -A INPUT -i ${local_dev} -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
    
    # Allow ESTABLISHED,RELATED Packet
    # WAN
    $IP6TABLES -A INPUT -i ${external_dev} -m state --state ESTABLISHED,RELATED -j ACCEPT
    # LAN
    $IP6TABLES -A INPUT -i ${local_dev} -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    # FORWARD
    $IP6TABLES -A FORWARD -i ${local_dev} -o ${external_dev} -s ${local_nw} -m state --state NEW,ESTABLISHED -j ACCEPT
    $IP6TABLES -A FORWARD -i ${external_dev} -o ${local_dev} -m state --state RELATED,ESTABLISHED -j ACCEPT
    
    # logging
    $IP6TABLES -A INPUT -j INLOG
    $IP6TABLES -A FORWARD -j FWDLOG
  • /etc/sysctl.conf の修正

    自分自身の eth0 に IPv6 アドレスを勝手に割り当てられないように、また IPv6 パケットの転送を許可するよう、/etc/sysctl.conf で以下のように指定する。

    net.ipv6.conf.eth0.accept_ra = 0
    net.ipv6.conf.eth0.autoconf = 0
    net.ipv6.conf.all.forwarding = 1
  • /etc/network/interfaces の修正

    eth0 に IPv6 アドレスを付与するために修正を行う。

    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet static
    	address 192.168.1.2
    	netmask 255.255.255.0
    	network 192.168.1.0
    	broadcast 192.168.1.255
    	gateway 192.168.1.1
    
    iface eth0 inet6 static
    	address 2001:yyyy:yyyy:yyyy::1
    	netmask 64
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_ra
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/autoconf
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_ra_defrtr
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_redirects
    
    iface he-ipv6 inet6 v4tunnel
    	address 2001:xxxx:xxxx:xxxx::y
    	netmask 64
    	endpoint aaa.bbb.ccc.ddd
    	local 192.168.1.2
    	ttl 255
    	gateway 2001:xxxx:xxxx:xxxx::x
  • radvd のインストールと設定

    インストールする。

    # apt-get install radvd

    /etc/radvd.conf ファイルを設定する。

    interface eth0
    {
    	AdvSendAdvert on;
    	prefix 2001:yyyy:yyyy:yyyy::/64
    	{
    		AdvOnLink on;
    		AdvAutonomous on;
    	};
    };
  • サーバを再起動する

    サーバを再起動すると、多分、そのマシンは IPv6 ルータとして動作するようになっていると思う。(目茶苦茶駆け足なので、実際は、各項目ごとに確認しながら進めた方が絶対に良い。)

あと、外側の IPv4 アドレスが動的な場合、こちら側の IPv4 アドレスが変わったことを HE Tunnel Broker 側に通知する必要があるが、「Dyn-compliant Endpoint Updates」によれば、DynDNS の IPv4 アドレス更新方法と互換性のある方法で出来るそうで、以前作成した DynDNS 更新用スクリプトをちょっと変更するだけで多分いけそう。

余談だが、上記で設定した IPv6 ルータから IPv6 アドレスを割り当てられるクライアント環境の OS は OS X Mountain Lion なのだが、OS X Lion 以降では、Happy Eyeballs が組み込まれているとのことで、必ずしも IPv6 で接続できるわけではないらしい。

普通は IPv6 ネイティブのアドレスを持っているホストが IPv6 ネイティブのアドレスへアクセスする場合は、IPv6 経由になるのだけれど、そうじゃ無かったので、最初はどこで設定を間違ったのか悩んだ。しかし、幸せ目玉ってどういう意味 ?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です