~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

IHANet との接続を開始しました

Posted on Fri Jul 17 01:00:34 +0900 2009 by nabeken

2009/07/13 より、tsuntsun.net, meganekkomoe.org, tknetworks.org を収容しているネットワーク(AS 64529)におきまして、 IHANet とのピアリングを開始しました。

IHANet とは

http://www.ihanet.info/Home より

The Internetを,各自宅サーバ(NOC)内IPv6ネットワークを相互接続するためのインフラであると見なし,相互にGREトンネル張ってeBGPピア張って何かトラヒック流してみてInternet 2.0を作ろうぜ,みたいな感じ.

本来の目的としては,eBGPとか広域ルーティング技術って遊んでなんぼだけど遊び場ないよねーじゃ作ってみようかーIPv6だったらアドレス重複とか面倒くさい事考えなくてすむし遊びがいがありそうだよねーくらいな感じだと思う.多分.

ピアリング交渉は IRC 上で行なわれております。交渉といっても、AS同士は対等(なはず)なので御互いに GRE トンネルを作るだけです。ひとりでやっていたときは気がつかなかったのですが、相互接続時に使うアドレスはどちらか一方のネットワークのものを使用するので、どちらがアドレスを払い出すかという交渉が必要になるでしょう。

Linux で IHANet へ接続する

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

参考文献