EdgeRouterでIPoE(IPv6)インターネットを接続を行う(ひかり電話あり)
EdgeRouterでひかり電話がある場合のIPoE(IPv6)接続を解説したページはいくつかありますが、とりあえずつながった的な説明が多かったので、細かい部分の解説も加えて、接続方法を纏めてみました。
なお、ひかり電話がない場合でもIPoE接続し、DS-Lite等を行うことは簡単に出来ますが、EdgeRouterがProxy NDという特殊機能に対応していないために、LAN側の機器がIPv6接続出来ないので、ひかり電話を使用する予定がなくても必ず契約しましょう(日本製のルーターであればYAMAHA RTXシリーズや、NECのIXシリーズはProxy NDに対応しています)。
接続環境
我が家ではホームゲートウェイとしてPR-500MIを使っています。この配下に、EdgeRouter ER-Xのeth0を接続します。今回説明に使っているER-Xのファームウェアはv1.10.9となります。
初期セットアップ(Basic Setup)
先ずはBasic Setupで基本的な設定を行います。Web画面のWizardからBasic Setupを開いて、PPPoE接続が必要であればアカウント情報を入れます(IPoE接続にはこれは不要なのでアカウントがなければDHCPのままでもOK)。
ここで、DHCPv6 PD (Enable DHCPv6 Prefix Delegation)という選択項目があるのでこれをチェックしたくなりますが、PPPoEの設定が入っているとPPPoEの設定とバッティングしてワークしませんので、チェックは入れないで下さい。
IPv4のIPアドレスをDHCPで取得かつIPv6アドレス(prefix)をDHCPv6で取得するようなプロバイダ(シンガポールのStarhubの個人向けサービスはそうです)の場合には、DHCPv6 PDのチェックを入れることで、Basic Setupで基本的にIPv4とIPv6両方のセットアップが一気に終わります。
Basic Setup後、SSHでログインし、show configuration commandsで設定を確認すると、以下の設定が作成されていることがわかります。
$ show configuration commands set firewall all-ping enable set firewall broadcast-ping disable set firewall ipv6-receive-redirects disable set firewall ipv6-src-route disable set firewall ip-src-route disable set firewall log-martians enable set firewall name WAN_IN default-action drop set firewall name WAN_IN description 'WAN to internal' set firewall name WAN_IN rule 10 action accept set firewall name WAN_IN rule 10 description 'Allow established/related' set firewall name WAN_IN rule 10 state established enable set firewall name WAN_IN rule 10 state related enable set firewall name WAN_IN rule 20 action drop set firewall name WAN_IN rule 20 description 'Drop invalid state' set firewall name WAN_IN rule 20 state invalid enable set firewall name WAN_LOCAL default-action drop set firewall name WAN_LOCAL description 'WAN to router' set firewall name WAN_LOCAL rule 10 action accept set firewall name WAN_LOCAL rule 10 description 'Allow established/related' set firewall name WAN_LOCAL rule 10 state established enable set firewall name WAN_LOCAL rule 10 state related enable set firewall name WAN_LOCAL rule 20 action drop set firewall name WAN_LOCAL rule 20 description 'Drop invalid state' set firewall name WAN_LOCAL rule 20 state invalid enable set firewall options mss-clamp mss 1412 set firewall receive-redirects disable set firewall send-redirects enable set firewall source-validation disable set firewall syn-cookies enable set interfaces ethernet eth0 description 'Internet (PPPoE)' set interfaces ethernet eth0 duplex auto set interfaces ethernet eth0 pppoe 0 default-route auto set interfaces ethernet eth0 pppoe 0 firewall in name WAN_IN set interfaces ethernet eth0 pppoe 0 firewall local name WAN_LOCAL set interfaces ethernet eth0 pppoe 0 mtu 1492 set interfaces ethernet eth0 pppoe 0 name-server auto set interfaces ethernet eth0 pppoe 0 password xxxxx set interfaces ethernet eth0 pppoe 0 user-id xxxxx@xxx.xxx.ne.jp set interfaces ethernet eth0 speed auto set interfaces ethernet eth1 description Local set interfaces ethernet eth1 duplex auto set interfaces ethernet eth1 speed auto set interfaces ethernet eth2 description Local set interfaces ethernet eth2 duplex auto set interfaces ethernet eth2 speed auto set interfaces ethernet eth3 description Local set interfaces ethernet eth3 duplex auto set interfaces ethernet eth3 speed auto set interfaces ethernet eth4 description Local set interfaces ethernet eth4 duplex auto set interfaces ethernet eth4 speed auto set interfaces loopback lo set interfaces switch switch0 address 192.168.29.1/24 set interfaces switch switch0 description Local set interfaces switch switch0 mtu 1500 set interfaces switch switch0 switch-port interface eth1 set interfaces switch switch0 switch-port interface eth2 set interfaces switch switch0 switch-port interface eth3 set interfaces switch switch0 switch-port interface eth4 set interfaces switch switch0 switch-port vlan-aware disable set service dhcp-server disabled false set service dhcp-server hostfile-update disable set service dhcp-server shared-network-name LAN authoritative enable set service dhcp-server shared-network-name LAN subnet 192.168.29.0/24 default-router 192.168.29.1 set service dhcp-server shared-network-name LAN subnet 192.168.29.0/24 dns-server 192.168.29.1 set service dhcp-server shared-network-name LAN subnet 192.168.29.0/24 lease 86400 set service dhcp-server shared-network-name LAN subnet 192.168.29.0/24 start 192.168.29.38 stop 192.168.29.243 set service dhcp-server static-arp disable set service dhcp-server use-dnsmasq disable set service dns forwarding cache-size 150 set service dns forwarding listen-on switch0 set service gui http-port 80 set service gui https-port 443 set service gui older-ciphers enable set service nat rule 5010 description 'masquerade for WAN' set service nat rule 5010 outbound-interface pppoe0 set service nat rule 5010 type masquerade set service ssh port 22 set service ssh protocol-version v2 set system host-name ubnt set system login user xxxxx authentication encrypted-password 'xxxxx' set system login user xxxxx level admin set system ntp server 0.ubnt.pool.ntp.org set system ntp server 1.ubnt.pool.ntp.org set system ntp server 2.ubnt.pool.ntp.org set system ntp server 3.ubnt.pool.ntp.org set system syslog global facility all level notice set system syslog global facility protocols level debug set system time-zone UTC
この状態でPPPoE接続がされ、LAN側からインターネットアクセスが出来るようになっているはずです。configは幾つかまずい箇所がありますが、IPoE接続を行うことが目標なので、先を急ぎます。
IPv6のファイアーウォールの設定
先のBasic SetupではIPv4のファイアウォールは作成されていますが、IPv6のファイアウォールは作成されていないので、IPoE(IPv6)接続の前に作成しておいたほうがいいでしょう(なくても接続できますが)。
set firewall ipv6-name WANv6_IN default-action drop set firewall ipv6-name WANv6_IN description 'WAN inbound traffic forwarded to LAN' set firewall ipv6-name WANv6_IN enable-default-log set firewall ipv6-name WANv6_IN rule 10 action accept set firewall ipv6-name WANv6_IN rule 10 description 'Allow established/related sessions' set firewall ipv6-name WANv6_IN rule 10 state established enable set firewall ipv6-name WANv6_IN rule 10 state related enable set firewall ipv6-name WANv6_IN rule 20 action drop set firewall ipv6-name WANv6_IN rule 20 description 'Drop invalid state' set firewall ipv6-name WANv6_IN rule 20 state invalid enable set firewall ipv6-name WANv6_LOCAL default-action drop set firewall ipv6-name WANv6_LOCAL description 'WAN inbound traffic to the router' set firewall ipv6-name WANv6_LOCAL enable-default-log set firewall ipv6-name WANv6_LOCAL rule 10 action accept set firewall ipv6-name WANv6_LOCAL rule 10 description 'Allow established/related sessions' set firewall ipv6-name WANv6_LOCAL rule 10 state established enable set firewall ipv6-name WANv6_LOCAL rule 10 state related enable set firewall ipv6-name WANv6_LOCAL rule 20 action drop set firewall ipv6-name WANv6_LOCAL rule 20 description 'Drop invalid state' set firewall ipv6-name WANv6_LOCAL rule 20 state invalid enable set firewall ipv6-name WANv6_LOCAL rule 30 action accept set firewall ipv6-name WANv6_LOCAL rule 30 description 'Allow IPv6 icmp' set firewall ipv6-name WANv6_LOCAL rule 30 protocol ipv6-icmp set firewall ipv6-name WANv6_LOCAL rule 40 action accept set firewall ipv6-name WANv6_LOCAL rule 40 description 'allow dhcpv6' set firewall ipv6-name WANv6_LOCAL rule 40 destination port 546 set firewall ipv6-name WANv6_LOCAL rule 40 protocol udp set interfaces ethernet eth0 firewall in ipv6-name WANv6_IN set interfaces ethernet eth0 firewall local ipv6-name WANv6_LOCAL
ここで、注意が必要なのはWANv6_LOCAL rule 40です。これはDHCPv6(IPv4のDHCPに相当するもの)を受け入れるルールになりますが、説明サイトによっては追加で以下のルールを入れているケースが見受けられます。
set firewall ipv6-name WANv6_LOCAL rule 40 source port 547
しかし、これを入れるとIPv6で繋がらないので注意が必要です。通常DHCPv6サーバーはUDPのポート547から情報を送信して来ますのでこのルールを追加したくなりますが、私の使っているHGW PR-500MIでは不可解なことに別のポート(例えば42815とか43431)からDHCPv6の情報を送信して来ます。このルールを入れてしまうと、IPv6のアドレス(prefix)を受け取ることが出来ません。
ちなみに、Basic SetupでDHCPv6 PDのチェックを入れて、IPv6のファイアウォールを自動生成した場合にはこのルールが入ってしまうので削除が必要です。
なお、DHCPv6の仕様はRFC3315に記載されていますが、ここではDHCPv6サーバーはUDPポート547でListenしてね、DHCPv6クライアントはUDPポート546でListenしてね、と記載されているだけで、送信元ポートの記載はないので、HGWがUDPポート547以外から情報を送信すること自体はこのルールに違反してないようです。
DHCPv6クライアントの設定
IPoE(IPv6)の設定自体は以下の5行を入れるだけです。
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 host-address '::1' set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 prefix-id ':0' set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 service slaac set interfaces ethernet eth0 dhcpv6-pd pd 0 prefix-length /60 set interfaces ethernet eth0 dhcpv6-pd prefix-only
これでcommitをすれば、
このように、すぐにIPv6のアドレスがswitch0に付与され、IPoE(IPv6)でのインターネット接続が、EdgeRouterおよび配下のLANから可能になります。なお、上記設定ではeth0にはIPv6のアドレスは付与されませんが、使用上は全く問題ありませんし、この形がIPv6ではスタンダードのようです(YAMAHA RTXルーターや、NEC IXルーターでも設定例通りにやるとこうなる)。
IPv4に慣れている方からすると、なんでWAN側にアドレスがないんだと、なんだか残尿感がありますが、慣れて下さい。このあたりの背景等も気がむいたら後日、解説を書いてみたいと思います。
DHCPv6クライアント関連の設定解説
IPv6が初めてだと、以下の設定は非常に難解です。私も初めは理解に苦労しました。
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 host-address '::1' set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 prefix-id ':0' set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 service slaac set interfaces ethernet eth0 dhcpv6-pd pd 0 prefix-length /60 set interfaces ethernet eth0 dhcpv6-pd prefix-only
・なんでswitch0にIPv6を付与するのにeth0が出てくるのか?
・pd 0って何?
・host-address、prefix-idって何?
・prefix-length /60って何?
といった疑問でしょうか?順番に説明して行きます。
DHCPv6での要求項目
set interfaces ethernet eth0 dhcpv6-pd pd 0 set interfaces ethernet eth0 dhcpv6-pd prefix-only
先ずこの部分です。この2行がDHCPv6サーバーに対して送信されるDHCPv6リクエスト(IPv6アドレスを要求)の中身となります。1行目は、eth0からDHCPv6のリクエストを上位ルーター(この場合HGW)に送信するという意味になります。具体的にはこのリクエストとは、IPv6のprefixを要求するものです。IPv6の場合にはIPv4と違って、アドレス空間が巨大なので、単に一つのグローバルアドレスをDHCPサーバーに要求するのではなく、アドレス空間、具体的にはprefixを要求します。
例えば、上位ルーター(この場合HGW)がprefixとして2001:xxxx:xxxx:xxxx::/64を配布してくれたとすると、このアドレス範囲のグローバルアドレス全てを配布してくれたということとなり、配布されたルーターのほうで、自身や配下のLANのPC等にこのアドレス範囲で自由にグローバルアドレスを付与できるようになります(Plefix Delegation=PDとはPrefixの委任、つまりPrefixの範囲内でアドレスの管理は任せるということ)。例えば、グローバルアドレス2001:xxxx:xxxx:xxxx:0:0:0:1はルーター自身で使って、配下のPC1に2001:xxxx:xxxx:xxxx:0:0:0:2、PC2に2001:xxxx:xxxx:xxxx:0:0:0:3を割り当てる、といったことが自由にできます。IPv4の場合には1つしかグローバルアドレスを貰えず、ルーターやLAN上のPCでNATでちまちま使いまわしていたのと比べると、大盤振る舞いですね。ビバ、IPv6。
ちょっと横道にそれましたが、1行目の「pd 0」というのは、「配布してくれるprefixをID 0番で管理しますのでよろしく」とDHCPv6サーバーに伝達することに使われます。DHCPv6サーバーから使用可能なprefixの伝達がある際に、このID毎にprefixが紐づく形で答えが返ってきます。
2行目の「prefix-only」は「prefixだけ下さい、その他のIPv6アドレスは要りません」という意味です。この行がないと、eth0に付与するIPv6アドレスもEdgeRouterは要求しますが、NTTのHGWはこれを無視するので、実質的にあってもなくても同じ結果となります(他のプロバイダではくれることもある、例えばシンガポールのStarhub)。「NTTのHGWは一つもくれないなんてケチって」感じなんですけどね。
結局、この2行で「prefixを一つ頂戴」って意味ですが、実際に配布されるprefixの長さはひかり電話ありのケースでは60bitとなります。具体的には2xxx:xxxx:xxxx:xxx0::/60という形です。なお、HGWには上位のルーターから56bitのprefixが付与されており、HGWはそれを切り出して配下のルーターに60bitのprefixを付与しています(HGW自身が使う部分を除くと2^(60-56)-1=15個のルーターを直下に配置できます)。
prefixの分割
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 prefix-id ':0'
次にこの部分です。「interface switch0」の部分は、付与されたprefixをswitch0配下のLANで使うという意味になります。なお、配布されたID 0の60bitのprefixをそのまま使うのではなく、一つのサブネットに付与するprefixは64bitとIPv6の仕様で決められているので、2xxx:xxxx:xxxx:xxx0::/60が配布されていたとすると、赤字の部分に0~fの数値を付与して、64bitの長さに調整しなければいけません。この赤字の部分に0を使いますという設定が「prefix-id ‘:0’」の意味となります。一つしかLAN(サブネット)がなければこの数値は0~fのどの数値を使ってもいいです。16通りの設定方法が可能なので、一つのルーターの下に最大16個のLAN(サブネット)を持つことが出来ます。
なお、prefix-id ‘:0’を指定しなければ自動的に0が設定されるので、実はこのconfig自体が不要です。ただし、分かりやすさの観点からはあったほうがいいでしょう。
ホストアドレス
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 host-address '::1'
サブネットにはprefixとして2xxx:xxxx:xxxx:xxx0::/64が与えられたので、この中から各ホスト(PC)はアドレスを選択しますが、先ずはルーター自身のアドレスを決める必要があります。64bitのprefixなので残りの64bitの範囲で自由に決めることが出来ます。具体的には2xxx:xxxx:xxxx:xxx0:yyyy:yyyy:yyyy:yyyyのyyyy:yyyy:yyyy:yyyyの部分のアドレスを決めることになります。
「host-address ‘::1’」はこのyyyy:yyyy:yyyy:yyyyとして::1、省略形で書かないと0000:0000:0000:0001を使うという意味ですので、結局switch0のアドレスとして2xxx:xxxx:xxxx:xxx0::1/64が設定されることになります。64bitのアドレス空間は膨大でありその中からどれを使ってもいいのですが、ルーターのアドレスとしては::1を使うのがわかりやすいでしょうか?
なお、このhost-addressの明示指定をしないと、switch0のMACアドレスから自動計算されたアドレス(EUI-64)が付与されます。どちらにするかはお好みですが、EUI-64にすると、MACアドレスがグローバルアドレスに埋め込まれるので、EUI-64はプライバシーの観点からは望ましくはありません。
LANの各PCアドレスの自動設定
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 service slaac
この設定は、switch0配下のPCのIPv6アドレス設定をクライアントの自動設定に任せるという意味です(ステートレスアドレスコンフィグレーション:SLAAC)。この設定を入れることで、switch0配下にRA(Router Advertisement=ルータ広告)のパケットが飛んで行くようになりますので、LANの各PCはこのRA情報で配布されるprefix情報を使ってIPv6のアドレスを設定できるようになります。switch0配下にRAで送信される情報は
RAでの送信情報 | パラメータ | 備考 |
Flag | Mフラグ=0,Oフラグ=0 | DHCPv6サーバーは稼働していないという意味 |
Prefix情報 | 2xxx:xxxx:xxxx:xxxx::/64 | Aフラグ=1(SLAACによる自動アドレス設定を許可) |
Recursive DNS Server | HGWのグローバルIPv6アドレス | このアドレスをIPv6のDNSサーバーとして利用可能 |
となります。WiresharkでのRAのキャプチャを参考までに添付しておきます。
/var/run/dhcp6c-eth0-pd.conf設定ファイル
DHCPv6クライアント関連のconfigは以下の設定ファイルに変換されます。この設定ファイルに従って/usr/sbin/dhcp6cがデーモンとして稼働することで、DHCPv6クライアントが動作している状況です。
$ cat /var/run/dhcp6c-eth0-pd.conf # This file was auto-generated by /opt/vyatta/sbin/dhcpv6-pd-client.pl # configuration sub-system. Do not edit it. interface eth0 { request domain-name-servers, domain-name; send rapid-commit; send ia-pd 0; script "/opt/vyatta/sbin/ubnt-dhcp6c-script"; }; id-assoc pd 0 { prefix ::/60 infinity; prefix-interface switch0 { sla-id 0; sla-len 4; ifid 1; }; };
EdgeRouterのDHCPv6クライアントの動きの詳細を知りたい方は、
・configをいじりながら、このファイルがどのように変更されるかチェック
・/opt/vyatta/sbin/dhcpv6-pd-client.plを読んでみる
・eth0をtcpdumpでキャプチャし、Wiresharkでパケットの中身とこの設定ファイルを見比べてみる
と良いでしょう。前述の解説も、私が実際これらの項目を調査して判明したことを纏めたものとなります。
/etc/radvd.conf設定ファイル
switch0でのRAの送信については設定ファイルが/etc/radvd.confにあります。この情報に従って/usr/sbin/radvdがswitch0にRAを広告しています。先に掲載のWiresharkのパケットキャプチャの内容と対応していることがわかるかと思います。
$ cat /etc/radvd.conf interface switch0 { # This section was automatically generated by the Vyatta # configuration sub-system. Do not edit it. # # service type [slaac] # IgnoreIfMissing on; AdvSendAdvert on; RDNSS 2409:xxxx:xxxx:xx00:xxxx:xxxx:xxx:4caa { }; AdvManagedFlag off; AdvOtherConfigFlag off; prefix ::/64 { AdvOnLink on; AdvAutonomous on; }; };