Posted on Fri Jul 17 01:00:34 +0900 2009 by nabeken
2009/07/13 より、tsuntsun.net, meganekkomoe.org, tknetworks.org を収容しているネットワーク(AS 64529)におきまして、 IHANet とのピアリングを開始しました。
http://www.ihanet.info/Home より
The Internetを,各自宅サーバ(NOC)内IPv6ネットワークを相互接続するためのインフラであると見なし,相互にGREトンネル張ってeBGPピア張って何かトラヒック流してみてInternet 2.0を作ろうぜ,みたいな感じ.
本来の目的としては,eBGPとか広域ルーティング技術って遊んでなんぼだけど遊び場ないよねーじゃ作ってみようかーIPv6だったらアドレス重複とか面倒くさい事考えなくてすむし遊びがいがありそうだよねーくらいな感じだと思う.多分.
ピアリング交渉は IRC 上で行なわれております。交渉といっても、AS同士は対等(なはず)なので御互いに GRE トンネルを作るだけです。ひとりでやっていたときは気がつかなかったのですが、相互接続時に使うアドレスはどちらか一方のネットワークのものを使用するので、どちらがアドレスを払い出すかという交渉が必要になるでしょう。
IHAnetでは、既存インターネットを相互接続のための広域ネットワークと見做し、各自宅NOC同士を IPv4 の GRE で接続します。GREと似たようなプロトコルとして、IP-in-IPなどがありますが、GREではマルチキャストなども送れるためやや高機能と言えます[1]。
IHAnetのサイト Linux で GRE トンネルを掘る方法を記しました。 http://www.ihanet.info/grelinux
AS番号一覧は http://www.ihanet.info/ASsAndPrefixes にあります。私のAS番号は 64529 ですので、これを読んでいるあなたはぜひ私とピアリングしましょう :-)
BGPdには Quagga を使用します。設定例は http://www.ihanet.info/bgpdconf にあります。私とピアリングする最低限の設定は以下の通りです。自分のAS番号を AS_NUMBER とします。広告するprefixを PREFIX とします。
router bgp AS_NUMBER bgp router-id LOCAL_IPV4_ADDR ! nabeken neighbor REMOTE_IPV6_ADDR remote-as 64529 bgp log-neighbor-changes no bgp default ipv4-unicast bgp graceful-restart neighbor peer peer-group address-family ipv6 network PREFIX neighbor peer activate ! nabeken neighbor REMOTE_IPV6_ADDR peer-group peer neighbor peer soft-reconfiguration inbound neighbor peer distribute-list peer-in in neighbor peer distribute-list peer-out out exit-address-family access-list restrict-vty permit 127.0.0.1/32 ipv6 access-list peer-in deny ::/0 exact-match ipv6 access-list peer-in deny 2001:380:e07:2::/64 ipv6 access-list peer-in permit any ipv6 access-list peer-out deny ::/0 exact-match ipv6 access-list peer-out permit 2001:380:e07:2::/64 ipv6 access-list restrict-vty permit ::1/128 line vty access-class restrict-vty ipv6 access-class restrict-vty
以上で AS 64529 (私) とのピアリングが上がります。ピアを追加する場合は、
# vtysh # router bgp AS_NUMBER # neighbor REMOTE_IPV6_ADDR remote-as AS_NUMBER # neighbor REMOTE_IPV6_ADDR peer-group peer
で追加できます。
手作業で行うと、再起動後に残念な感じになるので、自動化しましょう。私は Puppet を使い、マニフェストに基づいてスクリプトを生成するようにしています。あえて、ディストリビューションの設定に従っていません。
$ cat ihanet_gre.sh #!/bin/sh COMMAND=$1 IFNAME="<%= name %>" REMOTE_ADDR="<%= remote_addr %>" LOCAL_ADDR="<%= local_addr %>" IF_ADDR="<%= if_addr %>" case "$COMMAND" in "create") ip tunnel add "$IFNAME" mode gre remote "$REMOTE_ADDR" local "$LOCAL_ADDR" ip addr add "$IF_ADDR" dev "$IFNAME" ip link set "$IFNAME" up ;; "destroy") ip tunnel del "$IFNAME" ;; esac
このテンプレートに対応して
define gre($local_addr = '60.56.118.148', $remote_addr, $if_addr) { file { "/usr/local/bin/ihanet_gre_${name}.sh": content => template("default/usr/local/bin/ihanet_gre.sh"), mode => 0744 } }
を用意します。以上で、マニフェストには
gre { "winry0": remote_addr => "66.160.197.197", if_addr => "2001:380:e07:2::abc:c1/126"; }
な感じで記述できるようになります。あとは生成されたスクリプトで制御できます。
# /usr/local/bin/ihanet_gre_winry0.sh create // または # /usr/local/bin/ihanet_gre_winry0.sh destroy