5/17/2009

JANOG@May 16, 2009

date Sat, May 16, 2009 at 1:41 AM
subject [janog:08906] IPv6 Firewall

許です。

この間、IPv6のFirewallを書いててちょっと気がついたので、ここにも
書いておきます。
# きっかけは、某所のWebサービスが見られない場所があると言う話を
# 某所で聞いたことですが。
IPv6は、IPv4と違ってパケットをFragmentしません。その代わり、
Path-MTU Discoveryを行ってpacket sizeを決める(表現は微妙ですが)
わけですが、このPATH-MTU DiscoveryってICMPなんですよね。
というわけで、以下悲しいシナリオ。
1) IPv4では、今時、ICMPを全部たたき落とす設定がしばしば行われる
2) IPv4では、DF bitを立てていない限り、それでも問題なく通信できる。
一応、ICMP type UNREACH code NeedFragmentが帰ってくるので
Path-MTU Discoveryと同等の処理は出来るが、そこまでのFilterはあ
まり書かれていないと思う。
3) IPv6でもIPv4と同じようなPacket Filter Ruleを書いてしまう
4) 従って、Path-MTU Discoveryをたたき落としてしまう
5) そのせいで見られないWeb Pageが発生することがある

で、僕自身はipfwとかiptablesの実装を知らないので、それらの
filter ruleは書けませんが、OpenBSDに(NetBSD/FreeBSDにも)実装されて
いるpfのRuleは判った(つもりな)ので、一応メモ代わりに。
(NetBSD 5.0で試したつもり。転記ミスがあったらごめん)
pass in quick inet6 proto ipv6-icmp from $from to $to icmp6-type toobig

# これが問題になるって事は、下手をしたらNeighbor Discoveryも問題に
# なるってことかしらん?ってことで、Neighbor DiscoveryとRouter Solicitation
# さらに、Who-Are-Youに関する部分も一応。
# pass in quick inet6 proto ipv6-icmp from $from to $to icmp6-type {routersol, routeradv}
# pass in quick inet6 proto ipv6-icmp from $from to $to icmp6-type {neighbrsol, neighbradv}
# pass in quick inet6 proto ipv6-icmp from $from to $to icmp6-type {wrureq, wrurep}
# 但し、これは、Externalには返さない方がいいと思います。
# Who-Are-Youは、返してくれると凄く嬉しいけど。

というわけで、tcpとかudpはIPv4と同じ考え方でいいと思うんだけど、ICMP
は気をつけた方がいいかもしれません。

# 常識だったらごめんなさい。

追伸: 一応。proto ipv6-icmpの部分は、/etc/protocolsを見て下さ
い。もしかして、表現が違う可能性があるので。
二伸: Path-MTU Discoveryの正確な挙動は、ここには書いていません。
そう言うICMPがあるわけではなくpacket too bigを利用して、
途中経路のMTUを知る術がある(と言っていいのかしらん?)と
言うことに過ぎないはず。
(自信がないので、識者のコメントが欲しいです。呑んでいる
のでRFC当たる気合いは今は無い…)


JANOGで話題のIPv6ICMPフィルタ話。
こういう情報ってほかの国であまり大々的に議論されているのを見たことがない・・・

0 件のコメント:

コメントを投稿