Raspberry PiでIPv6 PPPoE接続、パケット転送、LAN内へのRA送信を行い、IPv6ルータにしてみる。
環境
Raspberry Pi 3 (Raspbian Jessie Lite)
$ uname -a Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux $ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)" NAME="Raspbian GNU/Linux" VERSION_ID="8" VERSION="8 (jessie)" ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
背景
NTT東西の提供するフレッツ網および対応プロバイダでは、下の例のようにIPv6が使えるようになっている。
- 「IPv6アドレスを用いたインターネット接続」について|フレッツ光ネクスト|フレッツ光公式|NTT東日本|光とテレビで楽しむサービス
- サービス概要 | OCN 「フレッツ光」対応 IPv6インターネット接続
IPv6接続の方式にはPPPoE方式とIPoE方式があるが、PPPoE形式の場合、以下のようなIPv6 PPPoEトンネル対応ルータを用意する必要がある。
- IPv6 PPPoE接続機器 IPv6トンネル対応アダプタ MA-100|ブロードバンドルータ等|商品一覧|通信機器トップ|Web116.jp|NTT東日本
- AtermWG1800HP2 | 製品一覧 | AtermStation
- NVR500 - ルーター - ヤマハ株式会社
このような機器を利用する以外の方法としては、LinuxマシンでIPv6 PPPoE接続を行い、IPv6ルータとして設定することでもIPv6通信を行うことができる。 ここでは、次のような構成でIPv6通信できるようにすることを考える。
なお、NGN IPv6網の代わりにプロバイダのIPv6網に接続するため、前者を用いるフレッツサービス情報サイトやひかり電話は使えなくなる。
必要なもの
- NTTから配られるONU
- PPPoEパススルー(PPPoEブリッジ)機能のあるIPv6対応ブロードバンドルータ
- Raspberry Pi 3 Model B (Raspbian)
ブロードバンドルータの設定
まず、ブロードバンドルータで次のような設定を行う。
フレッツサービスにおけるPPPoEセッション数の上限は通常2となっている。 そこで、プロバイダのIPv4、IPv6それぞれでPPPoE接続を使えるようにするために、「フレッツ・スクウェア」へのPPPoE接続を無効にしておく。
Raspbianの設定
まず、PPPoE接続を行うために有線LAN接続にしておく。
次に、/etc/sysctl.conf
に以下を追記する。
net.ipv6.conf.eth0.accept_ra = 0 net.ipv6.conf.all.forwarding = 1
accept_raはRA(Router Advertisement)を受け取らない設定、forwardingは自分宛でないパケットを転送する設定である。
ip6tablesの設定
インターネットからLAN内への接続を制限するために、ip6tablesでフィルタ設定を行う。
まず、iptables-persistentパッケージをインストールする。
$ sudo apt-get install iptables-persistent
次に、/etc/iptables/rules.v6
を編集し、以下のようなフィルタ設定を追加する。
$ sudo vi /etc/iptables/rules.v6 # Generated by ip6tables-save v1.4.21 on Sun Apr 17 21:20:30 2016 *filter :INPUT ACCEPT [0:0] :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 :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT # Completed on Sun Apr 17 21:20:30 2016
UDP 547から546への通信を許可するルールは、DHCPv6でIPv6アドレスを取得するための設定である。
再起動し、設定したルールが有効になっていることを確認する。
$ sudo reboot
$ sudo ip6tables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all anywhere anywhere ACCEPT ipv6-icmp anywhere anywhere ACCEPT udp fe80::/10 fe80::/10 udp spt:dhcpv6-server dpt:dhcpv6-client ACCEPT all anywhere anywhere state RELATED,ESTABLISHED INPUT-SERVICES all anywhere anywhere DROP all anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain INPUT-SERVICES (1 references) target prot opt source destination
PPPoEの設定
次に、PPPoE接続の設定を行う。
まず、次のパッケージをインストールする。
$ sudo apt-get install pppoe pppoeconf
次のコマンドを実行し、必要なアカウントの設定を行う。 IPv6 PPPoEアカウントのユーザ名、パスワードについては、プロバイダの契約情報およびサービス仕様を参照。
$ sudo pppoeconf
新しく作られるppp0インターフェースがIPv6アドレスを持つように、/etc/ppp/peers/dsl-provider
に次の行を追記する。
+ipv6 ipparam ipv6default
再起動した後、/var/log/syslog
のpppdのログを確認しながら、しばらくの後ppp0インタフェースが追加されることを確認する。
また、ppp0インタフェースにIPv6リンクローカルアドレスが振られていることを確認する。
$ sudo reboot
$ tailf /var/log/syslog
$ ifconfig ppp0 Link encap:Point-to-Point Protocol inet6 addr: fe80::8d3:caeb:c0ce:9856/10 Scope:Link
dhcpcdの設定
次に、DHCPクライアントデーモンの設定を行い、DHCPv6-PDでIPv6アドレスを受け取れるようにする。
/etc/dhcpcd.conf
を開き、次の行を追記する。
noipv6rs interface ppp0 ipv6rs iaid 1 ia_pd 1 eth0
デフォルトルートの設定
次に、ppp接続時にデフォルトルート設定を行うようにする。
/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
ここで、作成したファイルのパーミッションを実行可能にしておく。
$ sudo chmod +x /etc/ppp/ipv6-up.d/routing
再起動した後、/var/log/syslog
のpppdのログを確認しながら、しばらくの後eth0インタフェースにグローバルIPv6アドレスが振られることを確認する。
また、デフォルトルートがppp0インタフェースになっていることを確認する。
$ sudo reboot
$ tailf /var/log/syslog
$ ifconfig eth0 Link encap:Ethernet HWaddr b8:27:eb:06:b3:3e inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::ba27:ebff:fe06:b33e/64 Scope:Link inet6 addr: 2400:4030:XXXX:XXXX::1/64 Scope:Global $ ip -6 route default dev ppp0 metric 1024
ping6コマンドでIPv6接続できるか確認してみる。
$ ping6 -n -c 4 ipv6.google.com PING ipv6.google.com(2404:6800:400a:806::200e) 56 data bytes 64 bytes from 2404:6800:400a:806::200e: icmp_seq=1 ttl=52 time=12.8 ms 64 bytes from 2404:6800:400a:806::200e: icmp_seq=2 ttl=52 time=12.7 ms 64 bytes from 2404:6800:400a:806::200e: icmp_seq=3 ttl=52 time=12.8 ms 64 bytes from 2404:6800:400a:806::200e: icmp_seq=4 ttl=52 time=12.8 ms --- ipv6.google.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 12.757/12.819/12.859/0.042 ms
接続できない場合は、NGN IPv6のアドレスがインターフェースに振られていないか、ルート設定に加えられていないか確認する。
radvdの設定
最後に、LAN内にIPv6アドレスを配るため、IPv6 Router Advertisement Daemon(radvd)を設定する。
まず、パッケージをインストールする。
$ sudo apt-get install radvd
次に、/etc/radvd.conf
を新規作成し、次の内容を記述する。
interface eth0 { AdvSendAdvert on; MinRtrAdvInterval 3; MaxRtrAdvInterval 10; prefix ::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; }; };
LAN内の適当な端末のインタフェース設定を確認し、グローバルIPv6アドレスが振られていることを確認する。 また、ルート設定を確認し、デフォルトゲートウェイがRaspberry PiのリンクローカルIPv6アドレスになっていることを確認する。
>ipconfig Wireless LAN adapter Wi-Fi: 接続固有の DNS サフィックス . . . . .: IPv6 アドレス . . . . . . . . . . . .: 2400:4030:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX 2 一時 IPv6 アドレス. . . . . . . . . .: 2400:4030:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX リンクローカル IPv6 アドレス. . . . .: fe80::d146:3b6e:5092:b8c2%4 >route PRINT -6 IPv6 ルート テーブル =========================================================================== アクティブ ルート: If メトリック ネットワーク宛先 ゲートウェイ 4 276 ::/0 fe80::ba27:ebff:fe06:b33e
LAN内の端末からhttp://test-ipv6.com/を開いたときのスクリーンショットを次に示す。
LAN内から正常にIPv6通信が行えていることが確認できる。
サーバの再起動等によりLAN内の端末から通信できなくなった際は、radvdを再起動するとよい。
$ sudo systemctl restart radvd.service
DNSサーバでのAAAAフィルタについて
IPv6とIPv4が共存する環境では、まず最初にIPv6の接続が行われる。 ここでIPv6での通信に失敗する場合、IPv4での接続まで時間がかかってしまうため、プロバイダによってはDNSサーバでAAAAフィルタを行っていることがある(参考)。 AAAAフィルタは、IPv6用のDNSレコード(AAAAレコード)を返さないようにする仕組みである。
OCNの場合、IPv6が有効な環境向けにAAAAフィルタが行われていないDNSサーバが別途提供されている。
*3 現在「OCN 『フレッツ 光ネクスト』対応 IPv6インターネット接続」をWindowsXPまたはMac OSでご利用のお客さまは、6月6日以降、IPv6接続のご利用に際して機器の設定変更が必要になります。こちらのPDFファイルをクリックして手順をご確認ください。
必要に応じて、ブロードバンドルータにこのようなDNSサーバを手動で設定しておくとよい。 OCN以外のプロバイダについては、次が参考になる。