見出し画像

Edgerouter Xとの戦い〜ONUはいつもクソ〜後編

ND Proxy

あぁ・・・・クソ,もといHG8045Dは,1120:1234:5678:5600::/64のアドレスを下流のデバイスに割り当てる機能を持っていることは間違いないようです.つまり,NURO光から割り振られた1120:1234:5678:5600::/56のアドレスの中から,特定のデバイスに,プレフィックス/64のアドレスであれば,割り振ることができそうです.繰り返しになりますが,しかし,それでは,HG8045Dの下にハブをぶらさげることはできてもルータをぶらさげることができない・・・・.そこで,これを解決するべく,調べていくと,ND Proxyという仕組みがあることを知りました.

ND Proxyとは,あるルータがそれの上流にあるルータの代理として,DHCPv6などの仕組みをそのまま下流に提供するものようです(間違ったり,細部がおかしかったらごめんなさい).これは・・・なんか,私の環境に適合しそうです・・・.しかし・・・・.

EdgeMaxは,ndppd(つまりND Proxyのデーモン)を搭載しておらず,自分でインストールしなければならない.さらに,debianのパッケージでインストールしてもライブラリのバージョン問題で動かず,自前でビルドして動かさないといけないが,EdgeMaxは,MIPSなので・・・ビルドはクロスコンパイルしないといけない・・・あ・・・・たすけ・・・て・・・

というわけで,ND Proxy法案は先送りにされました.

Bridge

そうだよ.ルーティングできないなら,そのままブリッジしちゃえばいいじゃん.・・・でも,そうすると,IPv4のNATが使えない・・・・・.はい,消えた.とりあえず,やっては見ましたが,ちゃんと割り当てはできましたね.でも,ER-Xでブリッジはハードウェアオフロードも動かないので,推奨されないそうです.

さらに,参考文献によると,IPv4とIPv6をONUから別々に引いて,ONUからルータに二系統のネットワークを接続することで,IPv4はNAT,IPv6はbridgeというのも実現できるようです.私も,実はこのアイデアを思いついたのですが,IPv4とIPv6のフィルタの取り回しをうまく構築できませんでした・・・.調べていたら,同じようなことをやっている人を発見したのです.これをやるとポートも少なくなってしまうし・・・・.おもしろいですが,なしということにしました.

IPv6なのにNAT

アドレスがたくさんあるのに・・・・結局・・・NATなのか・・・先駆者はちゃんといらっしゃいました.参考文献の方は,JCOMの回線で,IPv6を割り当てたいというモチベーションのようです.下の参考文献では,EdgeMaxがv2.0.6時には,IPv6 NAT6がdisableになっているため,古いバージョンで運用されているようですが,私が使っているv2.0.8では使える様です.私は,ER-XでEdgeMax v2.0.8を使っています.

下の参考文献は,すごく丁寧に説明されているので,この通りにやればできるのですが,私の備忘録も兼ねて,再現手順を書いていきます.

まず,上の参考文献に従って,IPv6のファイアーウォール を設定し,eth0にDHCPv6でIPv6のアドレスを取得するように設定します.IPv6に関する設定は,ほとんどブラウザからはできないので,sshでログインし,cliから設定します.

configure
set interfaces ethernet eth0 address dhcpv6
set firewall ipv6-name WAN6_IN default-action drop
set firewall ipv6-name WAN6_IN description 'WAN6 to internal'
set firewall ipv6-name WAN6_IN rule 10 action accept
set firewall ipv6-name WAN6_IN rule 10 description 'Allow established/related'
set firewall ipv6-name WAN6_IN rule 10 state established enable
set firewall ipv6-name WAN6_IN rule 10 state related enable
set firewall ipv6-name WAN6_IN rule 20 action drop
set firewall ipv6-name WAN6_IN rule 20 description 'Drop invalid state'
set firewall ipv6-name WAN6_IN rule 20 state invalid enable
set firewall ipv6-name WAN6_IN rule 30 action accept
set firewall ipv6-name WAN6_IN rule 30 description 'Allow ICMPv6'
set firewall ipv6-name WAN6_IN rule 30 protocol icmpv6
set firewall ipv6-name WAN6_LOCAL default-action drop
set firewall ipv6-name WAN6_LOCAL description 'WAN6 to router'
set firewall ipv6-name WAN6_LOCAL rule 10 action accept
set firewall ipv6-name WAN6_LOCAL rule 10 description 'Allow established/related'
set firewall ipv6-name WAN6_LOCAL rule 10 state established enable
set firewall ipv6-name WAN6_LOCAL rule 10 state related enable
set firewall ipv6-name WAN6_LOCAL rule 20 action drop
set firewall ipv6-name WAN6_LOCAL rule 20 description 'Drop invalid state'
set firewall ipv6-name WAN6_LOCAL rule 20 state invalid enable
set firewall ipv6-name WAN6_LOCAL rule 30 action accept
set firewall ipv6-name WAN6_LOCAL rule 30 description 'Allow ICMPv6'
set firewall ipv6-name WAN6_LOCAL rule 30 protocol icmpv6
set firewall ipv6-name WAN6_LOCAL rule 40 action accept
set firewall ipv6-name WAN6_LOCAL rule 40 description 'Allow DHCPv6'
set firewall ipv6-name WAN6_LOCAL rule 40 protocol udp
set firewall ipv6-name WAN6_LOCAL rule 40 destination port 546
set firewall ipv6-name WAN6_LOCAL rule 40 source port 547
set interfaces ethernet eth0 firewall in ipv6-name WAN6_IN
set interfaces ethernet eth0 firewall local ipv6-name WAN6_LOCAL

これで,eth0がIPv4だけではなく,IPv6のアドレスをONUから引っ張ってきます.次に,ER-XのIPv6のルーティングを設定します.私は本に書いてあったデフォルトゲートウェイのアドレスとして使えばよいとあったfe80::1を設定しました.

set protocols static route6 '::/0' next-hop 'fe80::1' interface eth0

ここでcommitすると,上のコマンドが反映されます.これで,ER-Xは,IPv6を使って,通信できるようになります.試しに,ER-Xから,それを確認してみます.

ping6 google.com
PING google.com (XXXX:XXXX) 56 data bytes
64 bytes from XXXX:X:XXXX:XXXX: icmp_seq=1 ttl=50 time=24.9 ms

google.comとIPv6で通信できるようになりました・・・なったはずです.しかし,これでは,ER-Xの下にぶら下がったデバイスにIPv6が割り当てられません.switch0の下のデバイスにアドレスを割り振ることにし,以下の設定をかまします.switch0でアドレスとして,fcde:6600:89fa::1/64を割り振っていくことにします.

configure
set interfaces switch switch0 address fcde:6600:89fa::1/64
set interfaces switch switch0 ipv6 router-advert prefix ::/64
set interfaces switch switch0 ipv6 router-advert managed-flag true
set interfaces switch switch0 ipv6 router-advert other-config-flag false

これを反映させると,おそらく繋がったデバイスにIPv6のアドレスが割り振られているはずです.これで,よいかと思いますが,今度は,IPv6のNATの設定をしないといけません.残念ながら,EdgeMaxがIPv6の設定をやってくれないので,これは,手作業で設定することになります.

sudo -s
ip6tables -t raw -D OUTPUT -j NOTRACK
ip6tables -t raw -D PREROUTING -j NOTRACK
ip6tables -t nat -A POSTROUTING -o eth0 -s fcde:6600:89fa::1/64 -j MASQUERADE

しかしながら,この設定は,次回再起動時に失われてしまいます.ER-Xが再起動したときにこれが実行されるようにしなければなりません.

/config/scripts/post-config.d

このフォルダに配置されたスクリプトは,起動時に自動実行されるようです.ここに上のルーティングを設定するスクリプトを置けば完了です.ファイルには,実行権限を追加することをお忘れなく.

これで,fcde:6600:89fa::1/64のアドレスからきた要求がeth0にNATでルーティングされることになります.早速,https://test-ipv6.comにアクセスし,確認してみましょう!・・・・・・え・・・・・しかし・・・・これで設定しても,IPv6が優先されませんでした・・・・.確認サイトで試しても・・・常に下の画像の様な結果になってしまいます.・・・つらい・・・.つらい・・・・.

画像1

https://www.downtown.jp/~soukaku/archives/2015/0719_130900.html より

IPv6が・・・使われない・・・・.Happy Eyeballsというアルゴリズム?でIPv4,IPv6のどちらを使うかを多くのブラウザ等は決めるらしい.・・・こんだけがんばって・・・・IPv6が使われないなんて・・・・・.NATで二重NATみたいになっているのが原因なのでしょうか.IPv4は,二重NATになっていますが,そもそもIPv6は,ルータのeth0側は,グローバルのIPv6アドレスになっているわけで・・・・IPv4よりも遅いなんて考えにくい・・・.名前解決とか,ルーティングだけの問題ではないのでしょうが・・・・・.せっかく,勉強までして,ネットワークを構築して,IPv6がデフォルトで使われないなんて・・・なんたる屈辱・・・・・.

仕方がない・・・・・ndppdをビルドするしかない・・・・.

次回へ続く.


この記事が気に入ったらサポートをしてみませんか?