/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

EdgeRouterLiteでPPPoE IPv6接続ができない件(未解決)

以下の様な設定をEdgeRouterに行ったが,DHCPv6-pdが失敗してIPが降ってこない.

set interfaces ethernet eth0 pppoe 1 user-id imhXXXXXXX@bnf6.iij.ad.jp
set interfaces ethernet eth0 pppoe 1 password mypass
set interfaces ethernet eth0 pppoe 1 mtu 1454
set interfaces ethernet eth0 pppoe 1 firewall out modify pppoe-out

set interfaces ethernet eth0 pppoe 1 dhcpv6-pd rapid-commit enable
set interfaces ethernet eth0 pppoe 1 dhcpv6-pd pd 0 interface eth2 service slaac
set interfaces ethernet eth2 ipv6 dup-addr-detect-transmits 1
set interfaces ethernet eth2 ipv6 address

set system offload ipv6 forwarding enable
set system offload ipv6 pppoe enable

set interfaces ethernet eth0 pppoe 1 ipv6 enable

この原因について出来る限り調べてみたので,忘れないうちにメモしておく.

※ 私もよくわかっていない部分が多いので,間違っている部分があれば指摘をお願いします.

原因は何?

原因は多分,pppデバイス名のミスマッチ.

EdgeOS(vyatta/vyOSも多分同じ)ではpppoeを設定してpppデバイスを作ると,そのデバイス名はpppoeX(Xはid)で登録される.

実際にPPPoE IPv4 接続を行っているpppoe0は,デバイス名もpppoe0として登録されている.

pppoe0    Link encap:Point-to-Point Protocol
          inet addr:xxx.xxx.xxx  P-t-P:xxx.xxx.xxx.xxx  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1454  Metric:1
          RX packets:58433 errors:0 dropped:0 overruns:0 frame:0
          TX packets:57537 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:25005546 (23.8 MiB)  TX bytes:8970832 (8.5 MiB)

しかし,PPPoE IPv6 接続を行っているpppoe1は,なぜかデバイス名がppp0で登録される.

ppp0    Link encap:Point-to-Point Protocol
          inet6 addr:
          ~省略~

これが原因で,pppoeX形式でデバイス名を欲しがっているスクリプトが軒並みエラーを起こしている.

例えば /var/log/vyatta/vyatta-commit.log を見てみると次のようなエラーが出ている.

# cat /var/log/vyatta/vyatta-commit.log

~ 省略 ~

[ interfaces ethernet eth0 pppoe 1 ipv6 dup-addr-detect-transmits 1 ]
Will set dup_addr_detect_transmits when pppoe1 comes up

~ 省略 ~

[ interfaces ethernet eth0 pppoe 1 dhcpv6-pd ]
sysctl: cannot stat /proc/sys/net/ipv6/conf/pppoe1/accept_ra: No such file or directory
Starting new daemon...

前者の

Will set dup_addr_detect_transmits when pppoe1 comes up

このエラーは,dup_addr_detect_transmitsのスクリプトによると /proc/sys/net/ipv6/conf/pppoeX/dad_transmits がない場合に出る.

github.com

私の環境ではpppoe1のpppデバイス名はppp0として登録されてしまっているので, /proc/sys/net/ipv6/conf/pppoe1/dad_transmits が見つからずにエラーとなる. (代わりに, /proc/sys/net/ipv6/conf/ppp0/dad_transmits)はある.

DHCPv6-PDのエラーも同様.

pppoeデバイスの名前はどこで決めている?

そもそも,pppデバイスのデバイス名はどこで決められるのかがわからないので調べてみた.

まず,一般的なLinuxマシンでpppoeの接続等を行っているのは,pppd というコマンド. manページは以下.

Man page of PPPD

EdgeOSではこのpppdコマンドを以下のように呼んでpppoeの接続を行わせている.

/usr/sbin/pppd call pppoe0

pppdは pppd call NAME と呼び出すと,ファイル /etc/ppp/peers/NAME からオプションを読み込んで設定する.

/etc/ppp/peers/NAME に書かれたオプションのうち,pppデバイス名を左右しそうなのはipparam というオプション.pppoe0の設定では次のように設定されている.

ipparam "pppoe0 "

このオプションについてpppdのmanページには次のように書かれている.

ipparam string
ip-up と ip-down スクリプト用に余分のパラメータを指定します。 このオプションが与えられた場合、 string が 6 番目のパラメータと して、これらのスクリプトに与えられます。

ip-up/ip-down スクリプトというのは,IPパケットが送受信可能になった際に使用される初期設定スクリプト. 加えてEdgeRouterには /etc/ppp/ip-pre-up という前段階のスクリプトが用意されており,その辺りを調べてみると /etc/ppp/ip-pre-up.d/0002rename-pppoe という怪しいスクリプトを見つけた.

このスクリプトを読んでみると

OLD_IFNAME=$1
NEW_IFNAME=$6

というように,ipparamで設定される6番目の引数がNEW_IFNAMEに設定され,

LINKADDR=$(ip addr show dev $OLD_IFNAME | grep inet6 | cut -c11-)
if [ ! -z "$LINKADDR" ]; then
  ip link set $OLD_IFNAME down
fi

で古いpppデバイス(未確認だが,多分pppoeXになる前はpppXという名前で登録されている)を停止させ,

if [ ! -z "$LINKADDR" ]; then
  ip addr add $LINKADDR dev $NEW_IFNAME
fi

このように新しい名前(pppoeX)に設定しなおしている. PPPoE接続のPPPデバイス名をpppoeXに設定しているのはこのスクリプトで間違いないだろう.

なぜPPPoE IPv6ではデバイス名変更スクリプトが動かない?

たぶん,PPPoE IPv6 では 読み込むスクリプトファイルが,IPv4の場合と異なるのが原因.

おるみんちゃんのブログに書いてあったように,NTT西/東日本でのPPPoE IPv6はPPPoe IPv4と違い,PPPoE接続が確立しただけではIPv6が降ってこない.

技術者見習いの独り言: EdgeRouterLite-3をGentooで運用しはじめました+IPv6導入(本篇)

IPv6を得るためには,PPP接続が確立したあと,DHCPv6-PDなどを使ってIPv6を取ってくる必要がある. つまり,IPv4の時と手順が異なるので,IPv4のip-up/ip-down スクリプトが使いまわせないのだと思う.

IPv6用のip-up/ip-down スクリプトは同じく /etc/ppp/ 以下に ipv6-up/ipv6-down という名前で存在している.しかし,中身は空っぽなので,機能しない.

ここにpppデバイスのリネームスクリプトを放り込んだらうまくいくような気がしているが,まだうまく動かせていない.

今日はここまで

大学のレポート書かないとダメなので,一旦中断.

2015/05/11 01:30追記

見えてきた気がする.

EdgeOSでは,PPPoEでPPPを張ると必ずIPv4が降ってくる前提でシステムが組まれている気がする.

/etc/ppp/ip-pre-up.d/0002rename-pppoe も,よく見るとinet6の値を見たりしている.IPv6を意識している.

私の使っているISPでは,IPv6のPPPoEサーバーにつなぐとIPv4は降ってこない. IPv4が降ってこないので,/etc/ppp/ 以下のIPv4用configを通らず,空っぽのIPv6の設定のみを行おうとする. で,各所でエラーが発生する.多分,そういうことが起きている.

もう少し色々試してみて,ダメだったらフォーラムに質問を投げることにする.