ぷららIPv6へGNU/Linuxから接続

家の回線は長らく光ネクストではなくBフレッツだったためにネイティブなIPv6サービスが受けられなかった*1が,ついにBフレッツが廃止され光ネクストに移行された*2のでISPIPv6サービスを利用してみることにした。

環境

ファイアウォール

手始めに,忘れずIPv6用のファイアウォールを整備しておく。IPv4と違ってNAPTが間に入らないため設定を忘れると危険である。
/etc/iptables/rules.v6 *3:

*filter
:INPUT-SERVICES - 
-A INPUT -i lo -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p udp --dport 546 --sport 547 -s fe80::/10 -d fe80::/10 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j INPUT-SERVICES
-A INPUT -j DROP
...

UDP 546はDHCPv6でIPアドレスを取得するために必要になる。ipv6-icmpを無条件に受け入れて良いかは要検討。

PlalaIPv6接続サービス

さて,PlalaのIPv6接続サービスのページを見ると利用のためにIPv6トンネル対応アダプタなる専用機器が必要だと書いてあるが,今回の目的はこの専用機器を利用せずにGNU/Linux上で構成することである。NetBSDにおける設定例をHachulog: NetBSDでぷららのIPv6を利用するで見つけることができたので,ありがたくこれを参考にさせて頂いて設定を行った。

記事によれば,PPPoEセッションをもうひとつ張って,DHCPv6でPrefixを取得するとのことである。順に設定していく。

PPPoEセッション

pppoeconfコマンドで設定を行った。
ログインIDはhttp://www.plala.or.jp/ipv6/access/flow/にあるように,ユーザIDの後に契約コースによって@v6h.plala.or.jpか@v6m.plala.or.jpを加えたものとなる。

pppoeconfコマンドによって設定が生成されると,/etc/network/interfacesにインターフェイスが追加される。

iface dsl-provider inet ppp
pre-up /sbin/ifconfig br0 up # line maintained by pppoeconf
provider dsl-provider

br0となっているのは仮想マシン用のブリッジを用意しているためなので,通常の環境ではeth0と読み替えてよい。
また,/etc/ppp/peers/dsl-providerにPPPの設定が配置される。

名前が気に入らないので各種リネームをした。

  • mv /etc/ppp/peers/dsl-provider /etc/ppp/peers/plala-ipv6
  • /etc/ppp/pppoe_on_boot の内容修正
  • /etc/network/interfacesの修正
    • iface ppp0 inet ppp
      • 名前をppp0に合わせるとifup/ifdownで
    • provider plala-ipv6

このままではppp0上でIPv6通信ができないので,/etc/ppp/peers/plala-ipv6に次の行を追加した。

+ipv6

これによりppp0にリンクローカルアドレスが割り当てられて,PPPoEの相手とIPv6で通信できるようになる。

以上の設定でPPPoE接続を行った。

$ sudo ifup plala-ipv6

DHCPv6

続いて,wide-dhcpv6-clientパッケージをインストールした。ppp0インターフェイスに限って動作するように/etc/default/wide-dhcpv6-clientに

INTERFACES="ppp0"

を設定した。
/etc/wide-dhcpv6/dhcp6c.confに次の設定を行った。

interface ppp0 {
  send ia-pd 0;
  request domain-name-servers;
  script "/etc/wide-dhcpv6/dhcp6c-script";
};

id-assoc pd 0 {
  prefix-interface br0 {
    # xxxx:xxxx:xxxx:xx00::/64
    sla-id 0;
    sla-len 8;
  };
};

ルーティング

IPv6のデフォルトルートが設定されていないため,ppp0をデフォルトルートに設定した。

$ sudo ip -6 route add default dev ppp0

とりあえずはこれで通信できるようになる。

自動でデフォルトルートを設定するために,https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477245を参考にPPPoEの接続が終わったタイミングで上記コマンドを実行するようにした。
/etc/ppp/ipv6-up.d/routing:

#!/bin/sh
if [ -z "${CONNECT_TIME}" ]; then
	if [ "${PPP_IPPARAM}" = "ipv6default" ]; then
		ip -6 route add default dev ${PPP_IFACE}
	fi
fi

/etc/ppp/peers/plala-ipv6 には次の行を追加した。

ipparam ipv6default

なお,pppd側ではなく/etc/network/interfacesのpost-upでデフォルトルートの追加を行うと,タイミングによってPPPoE接続が終わる前のまだppp0インターフェイスが存在しない状態でpost-upが実行されることがある。

DNSサーバ

dhcp6cがresolvconfに対応しており接続時に自動でresolv.confに追加されるが,ifdownした時には削除されないため修正した。
/etc/wide-dhcpv6/dhcp6c-ifupdown:

--- dhcp6c-ifupdown.orig	2014-08-04 08:15:08.875772378 +0900
+++ dhcp6c-ifupdown	2014-08-04 08:15:11.771745142 +0900
@@ -12,6 +12,7 @@
 
 case $MODE in
     start|stop)
+        [ "$MODE" = "stop" ] && /sbin/resolvconf -d $IFACE
         for i in $INTERFACES ; do
             if [ "$IFACE" = "$i" ] ; then
                 /usr/sbin/dhcp6ctl $MODE interface $IFACE

備考

今回は内部ネットワークへの広告やフォワーディングは行わなかった。