Net: Feel6 で静的な IPv6 アドレスを得る

このエントリで、AirMac Extreme を利用しての自宅ネットワークの IPv6 利用について書いたのだけれど、この場合は端末に割り当てられるのは IPv4 アドレスをもとにした IPv6 アドレスとなる。つまり、IPv4 アドレスが動的な場合は、IPv6 アドレスも動的となってしまう。

せっかくの IPv6 なのだから固定のアドレスが欲しい、と言うことで、Feel6 のサービスに申し込んでみた。

固定で 48 ビットのプレフィックスが利用可能となるので、適切な設定を行えば、IPv6 ネットワークから、自ネットワーク内のホストにアクセスできるようになる。

今回は、自宅 Linux マシンを DTCP クライアントとする方法をとった。
※ちなみに、この設定を行う前に、AirMac Extreme の IPv6 設定はリンクローカルのみとしておく。

設定に関しては、ほとんどを下記で公開されている内容を参考にさせていただいた。感謝。

なお、上記で公開されている設定に加えて、下記を DTCP クライアントとなる Linux マシンに行っている。

  • IPv6 のモジュールを読み込むため、/etc/modules に下記を追記。
    ※この設定を行わないと、起動時に sysctl.conf の内容がエラーとなり反映されない。

    ipv6

  • IPv6 の自動構成を無効とするため、/etc/sysctl.conf に下記を追加して sysctl -p を実行。

    net.ipv6.conf.eth0.accept_ra = 0
    net.ipv6.conf.eth0.autoconf = 0
    net.ipv6.conf.all.forwarding = 1

  • ip6tables を用いて DTCP クライアントとなる Linux マシン以外への外部からの接続を制限するようパケットフィルタリングを設定。
    具体的な設定は下記のように 2001:03e0:xxxx::/48 への他ネットワークからの接続を制限 (INPUT ACCEPT なので IPv6 ルータとなっているマシンを除く) してみたが、全く持って自信がないので、間違っていたらコメント等で指摘いただければ、と思う。
    ※下記ルールだと、DTCP クライアントとなる Linux マシンへは特に制限なしにアクセスできるが、これはサービス側で対処を行った。

    /sbin/ip6tables -F
    /sbin/ip6tables -X
    /sbin/ip6tables -P INPUT ACCEPT
    /sbin/ip6tables -P OUTPUT ACCEPT
    /sbin/ip6tables -P FORWARD DROP
    /sbin/ip6tables -A FORWARD -i dtcp -o eth0 -j LOG
    /sbin/ip6tables -A FORWARD -i eth0 -o dtcp -s 2001:03e0:xxxx::/48 -j ACCEPT
    /sbin/ip6tables -A FORWARD -i dtcp -o eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT

とりあえずは、上記のような感じでテスト運用してみようと思う。

・2009/08/09 追記

  • 上記では INPUT が許可なので、これを一部サービスを除いて拒否とするようなルールを作成した。

    # ip6tables 初期化
    /sbin/ip6tables -F
    /sbin/ip6tables -X

    # 基本ポリシー (INPUT / FORWARD は拒否、OUTPUT は許可)
    /sbin/ip6tables -P INPUT DROP
    /sbin/ip6tables -P OUTPUT ACCEPT
    /sbin/ip6tables -P FORWARD DROP

    # ループバックアドレスは許可
    /sbin/ip6tables -A INPUT -i lo -j ACCEPT

    # ICMPv6 Destination Unreachable / Packet too Big / Time Exceeded / Parameter Problem を許可
    /sbin/ip6tables -A INPUT -p icmpv6 –icmpv6-type destination-unreachable -j ACCEPT
    /sbin/ip6tables -A INPUT -p icmpv6 –icmpv6-type packet-too-big -j ACCEPT
    /sbin/ip6tables -A INPUT -p icmpv6 –icmpv6-type time-exceeded -j ACCEPT
    /sbin/ip6tables -A INPUT -p icmpv6 –icmpv6-type parameter-problem -j ACCEPT

    # ICMPv6 Router Solicitation / Router advertisement / Neighbor Solicitation / Neighbor Advertisement を許可
    # ※これらを許可しないと、IPv6 ルータとしてまともに動作しない
    /sbin/ip6tables -A INPUT -i eth0 -p icmpv6 –icmpv6-type router-solicitation -j ACCEPT
    /sbin/ip6tables -A INPUT -i eth0 -p icmpv6 –icmpv6-type router-advertisement -j ACCEPT
    /sbin/ip6tables -A INPUT -i eth0 -p icmpv6 –icmpv6-type neighbor-solicitation -j ACCEPT
    /sbin/ip6tables -A INPUT -i eth0 -p icmpv6 –icmpv6-type neighbor-advertisement -j ACCEPT

    # IPv6 の ICMP Echo Request と Echo Reply を許可
    /sbin/ip6tables -A INPUT -p icmpv6 –icmpv6-type echo-request -j ACCEPT
    /sbin/ip6tables -A INPUT -p icmpv6 –icmpv6-type echo-reply -j ACCEPT

    # 外部からの http アクセスを許可
    /sbin/ip6tables -A INPUT -p tcp -d 2001:3e0:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/128 –dport 80 -j ACCEPT

    # 自ネットワークからの ssh アクセスを許可
    /sbin/ip6tables -A INPUT -p tcp -s 2001:03e0:xxxx::/48 -d 2001:3e0:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/128 –dport 22 -j ACCEPT

    # 接続済みパケットの許可
    # ※ ip6tables の -m state は linux カーネルのバージョンによっては動作しない場合もあるらしい。
    /sbin/ip6tables -A INPUT -i eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
    /sbin/ip6tables -A INPUT -i dtcp -m state –state RELATED,ESTABLISHED -j ACCEPT

    # 自ネットワークから他ネットワークへの通信を許可
    /sbin/ip6tables -A FORWARD -i eth0 -o dtcp -s 2001:03e0:xxxx::/48 -j ACCEPT
    /sbin/ip6tables -A FORWARD -i dtcp -o eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT

追記終わり

・追記
IPv6 からでは表示が異なるページを作成してみた。
IPv6 でのみ表示可能なコンテンツは、環境変数表示しかないけれど・・・。
※上記リンクを IPv4 で接続すると、www.manabii.info と同じコンテンツが表示される。

※よく考えたら、IPv6 でメール配送する場合、自宅サーバでも対応しなければならないのでやめた。

・追記 2
たまにネットワークに dtcp や sit0 を残したまま dtcp の接続が切れるようなので、下記のようなスクリプトを適当な間隔で cron に登録してみた。

#!/bin/sh

ps -C "dtcpc"|fgrep dtcpc > /dev/null

if [ $? -ne 0 ]
  then
  
  if [ -e /var/run/dtcpc.pid ]
  then
    rm /var/run/dtcpc.pid
  fi
  
  ifconfig | fgrep dtcp > /dev/null
  if [ $? -eq 0 ]
    then
        ifconfig dtcp down
        sleep 5
    fi
    
    ifconfig | fgrep sit0 > /dev/null
    if [ $? -eq 0 ]
    then
        ifconfig sit0 down
        sleep 5
    fi
    
    /etc/init.d/networking restart
    
    sleep 10
    
    /usr/local/sbin/dtcpc -u username -P password -t network -n eth0 dtcp.feel6.jp
fi

※ dtcpc の username と password は Feel6 のそれを設定。
※ユーザネームやパスワードが記述されているので、所有権 root 、アクセス権 700 にしておく。
※ /etc/init.d/networking restart で、ネットワークの再起動行っているので、/etc/network/interfaces ファイルの記述を変更しないと、ネットワーク疎通が切れるかもしれない。(記憶があやふやだけど、allow-hotplug eth0 ではなく auto eth0 と指定しないと、ネットワーク再起動時に eth0 がつながらなくなることがあったように思う。)

・追記 3
うちのネットワークはルータに AirMac Extreme を使用しているのだけれど、このルータ、DTCP クライアントが動作しているマシンを DMZ に配置しなくても、トンネルが掘れてしまうあたり、プロトコル 41 もパススルーしている模様。

Net: Feel6 で静的な IPv6 アドレスを得る” への2件のコメント

  1. 御礼。
    ip6tables を参考にさせて頂き IPv6 で自宅サーバ fukutaro.jpn.com を公開することが出来ました。

    • どうもです。IPv6については私も試行錯誤な状態ですので、誤りとかあれば突っ込み入れて頂けると助かります。

コメントは受け付けていません。