2015年3月24日火曜日

EdgeRouterLite-3をGentooで運用しはじめました+IPv6導入(本篇)

前提

  • これまでのネットワークは,BaffaoのBBR-4MGをブロードバンドルータにしてた
  • 100Mなネットワークで,IPv6未対応だったので,IPv6+GbEにしたい
  • 既存ネットワークのトポロジは下図の通り.
  • ただし,これからの記事でアドレスについてはxxxxで伏せさせていただきます
ファイアウォールはBBルーターとパーソナルファイアウォール任せな感じの,よくある一般的なネットワークっぽい.APは諸事情によりRaspberryPiにやらせてて,RaspberryPiにはUSB HDDが接続してありLAN内のファイルサーバとなっている.

これを,次のようにした.

いままで市販のBBルーター任せであんまり考えてなかったファイアウォールルールをイチから見直した事と, 外から自宅にアクセスするために外部にもBBルータの機能で静的ポートフォワードしていたRaspberryPiを, サブネットで分離してちゃんとDMZとして機能するようにさせたところがポイント.とはいえDMZは全部フォワードしてるわけじゃなくて,結局静的ポートフォワードでやってます.

図に書き忘れましたが,IPv4 PPPoEの出口がppp0,IPv6 PPPoEの出口がppp1になってます.

IPv6だと,NATが必要ないのでちょっと設定に戸惑いました.むしろNATとか頭から追い出してちゃんと考えればIPv6のほうがラクっぽいかも.

ネットワーク図がアレゲなのは勘弁してください……
あと,セキュリティの事を言うとまだまだ足りないとこが沢山ある気がしますね.
本当はルーターに色々やらせすぎなんだとおもいますが,ウチは負荷がかかるネットワークではないのでそこは良いかな.

なお,フレッツ系のプロバイダで,IPoEなIPv6が使えない環境だったので,
PPPoEを2セッション張る事にしています.

実際どのようにしたか,以下に記します.
参考: Home Router - Gentoo Wiki

設定(IPv4)

このように設定して,
# cd /etc/init.d && ln -s net.lo /etc/init.d/net.ppp0
# rc-update add net.ppp0
# rc-update start net.ppp0
これでIPv4のPPPoEは自動起動します.
ユーザーネーム,パスワード,dnsサーバーはISPから通知されたものを記入しておきます.

次にこれはdnsmasqの設定です.DHCPサーバーと,簡易DNSキャッシュサーバーをやってくれます.他にも色々機能はありますが……
とりあえずこのようにeth1とeth2にDHCPを振っておきました.
他にもDMZのRaspberryPiと内部ネットワークのPS3にもMACアドレスに対して固定IPを振ってます.

最後に,iptables.

これでNATが有効になり,パケットがフォワーディングされます.
ここで,RaspberryPiに接続したHDDに録画データを溜めてるのですが,
これをDLNAでPS3から再生したかったので,minidlnaを導入してます.
そしてサブネット越えのため,igmpproxyも導入しました.

参考にしたGentoo WikiはLAN側のサブネットは1つである前提であるため,2つのサブネットのルーターの設定に最初悩みました.特に,dnsmasqのタグ機能に最初気がつかなかったところと,iptablesのフォワードのルール.

設定(IPv6)

まず最初に,IPv6の場合のPPPoEについて調べました.

図はNTT東日本の次世代ネットワークに関する方法のページより,NGN IPv6 ISP接続<トンネル方式> UNI仕様書から拝借.

フレッツ系のISPでIPv6 PPPoE接続の場合,対向サーバーとPPPoEクライアントはリンクローカルアドレスで通信が確立されますが,グローバルアドレスがまだ払われません.
IPv4ではIPCPでアドレスが払われますが,IPv6CPではプレフィクスが払われる直前まででシーケンスが終わってるためです.

なので,ここでDHCPv6-PDにより,プレフィクスを上位より払い出してもらう必要があります.フレッツの場合,/56のプレフィクスが払い出されます.下位64bitは自分で決めて,PPPのインターフェイスにそれを設定する必要があります.

まず,PPPoEの設定について.IPv4の時のコンフィグファイルに次を追記.
更に
# cd /etc/init.d && ln -s net.lo /etc/init.d/net.ppp1
# rc-update add net.ppp1
# rc-update start net.ppp1
次にDHCPv6クライアント.

私は,Gentooのportage treeにあったのでdibblerをつかいました.
dhcpcdISC dhcpだとpppのインターフェイスに対しては使えないので,別の物を使う必要があります.KAMEプロジェクトのWIDE DHCPv6でも良いとおもいます.

dibblerの場合,デーモン起動すると/var/lib/dibbler/以下にxmlでプレフィクス情報等が吐き出されるので,それを使って自分で設定します.
24xx:xxxx:xxxx:xxxx/56が払われたとして,ppp1の下位64bitは0000:0000:0000:0001を割り振るとします.
# ip -6 addr add 24xx:xxxx:xxxx:xxxx::1 dev ppp1
# ip -6 route add dev ppp1

これでルーターからはping6コマンド等で外との疎通を確認できるはずです.

さて,LANのノードにもプレフィクスを教えてやらねばなりません.
そのためには,DHCPv6でステートフルに設定するか,SLAACでステートレスに設定するかの二通りがありますが,私は後者を使いました.

SLAACはRA(Router Advertisation,ルーター広告)を使います.
LAN側にルーターがRAを流せば,LAN側のノードは受け取ったプレフィクスと,自分のイーサネットインターフェイスのMACアドレスを組み合わせて,自動にグローバルアドレスを生成するので楽です.

また,SLAACでグローバルアドレスを設定すると,デフォルトゲートウェイは自動的にRAを流したノードに設定されます.

DNS情報だけは別の手段で(たとえばdnsmasq)教えなければならない……という過去があったようですが,今はRAでDNSも通知できるそうです.

RA通知にはradvdを使いました.radvdのコンフィグは以下です.
これでLANに向けてプレフィクスが広告されます.
よって,IPv4とちがい特にiptablesを設定したりしなくても,個々のノードにIPv6のグローバルアドレスが振られるため通信が可能となります.
しかし,フィルタリングをしないとIPv4+NATよりも脆弱な状況です.

なので最後にIPv6のiptablesを設定しました.

ICMPv6はICMPと違い,ARPの代わりに近隣探索等も熟すので,許可してあります.
が,もうちょっと本当は絞れる気がするので今は試行錯誤しています.

補足

本来,起動スクリプトで,IPv6 PPPoE → dibbler → dibblerが/var/lib/dibblerに出力したxmlをパースしてpppインターフェイスへグローバルアドレス割り当て,ルーティング設定 → さらにそのプレフィクス情報を使ってradvd.confを自動生成 → radvd起動
という風にすべきだとおもいます.
しかし,ISPから払い出されるプレフィクスは半固定で,滅多な事がないと変化がないようなので,プレフィクス部分を決め打ちにするコンフィグファイルで対応してしまいました.

また,上記設定について,説明を端折りましたが,rc-updateコマンドでそれぞれのデーモンは登録する必要がありますね.