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;
    };
};

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です