ぷららIPv6へGNU/Linuxから接続
家の回線は長らく光ネクストではなくBフレッツだったためにネイティブなIPv6サービスが受けられなかった*1が,ついにBフレッツが廃止され光ネクストに移行された*2のでISPのIPv6サービスを利用してみることにした。
環境
- ISP: Plala
- ネットワーク構成:
- IPv6接続の専用機器は利用しない
- ブロードバンドルータのPPPoEブリッジを有効にしておく
- IPv4のセッションはブロードバンドルータが張る
- IPv6のセッションをPC側で張る
- ブロードバンドルータがIPv6対応してないせい
- PCのOS: Ubuntu 14.04
ファイアウォール
手始めに,忘れず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を無条件に受け入れて良いかは要検討。
PlalaのIPv6接続サービス
さて,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の修正
このままでは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
備考
今回は内部ネットワークへの広告やフォワーディングは行わなかった。