私的メモ:NetBSDなPPPoEルータ環境下でiChat AVを使う

とゆーか、iChatAVを使えるようにするipfilter(含むNAT)の設定メモとゆーか。
そんな対したモンじゃないですし、私的メモなんで思いっきり無責任ですし、あんまり参考にしない方が(汗。
逆に何かダメだったら叩いて下さいとゆーか...


さて、表題に反するようですが、フツーに個人(じゃなくてもいーですが)でxDSLやら(じゃなくてもいーですが)でルータ環境下でiChatAVを使いたかったらUPnP対応ブロードバンドルータを使うのが一番簡単で楽みたいです。
「みたい」ってのは自分では検証してないですが、id:magisystemさんと話しててそんな結論に落ち着いた次第。
iChat AVのポートは...」とか悩む前に、数千円でUPnP対応ルータ買ってくるのが吉。
ついでに「ステートフルパケットインスペクション」で「高セキュリティ」とかウタってるのだと尚良し、なのかな?
でまぁ、ルータを自作する方にとってUPnPと言えば linuxigd(Linux UPnP Internet Gateway Device)だと思うのですが、LinuxFreeBSD用しかないのでNetBSDなんて使おうとするクセにナンパな私的には(略 なので、別の方法で対処することに。
# まぁ、Floppy-1_CF版 を使うのが楽なんではないかとか思ったりもしますが。


次に楽で簡単なのは、ブロードバンドルータのナンチャッテDMZを使うとか。
「あーもぉ、ポートとか考えるのマンドクセぇ。」とサクっとネットゲー用DMZ機能とかゆー「それってDMZってゆーのかよ...」なDMZポートを使っちゃうのが楽。
でも実は、ナンチャッテDMZを安全に使おうとすると余計マンドクサくなるので要注意。


お次に楽なのは、iChat AVで使うポート全てをポートフォワードしちゃうとか、か。


ま、そーゆーブロードバンドルータでどうこうする訳でもなく、Linux or FreeBSDでlinuxigdを使うでもなく、特にこだわりがある訳でもないのにNetBSDでPPPoEなルータ作ってしまい、後から他の人に「iChat AV使いたいんだけどどうにかして」と言われた場合どうするかっつーか、どーしたかとゆー話。


さて、まずは一応iChat AVで使うポートは押さえておきましょう、と。

辺りがこの場合引き合いに出されますが、頭の弱い私的には

1. All iChat AV traffic is UDP except for ports 5190 and 5298, which need to be open for both TCP and UDP.

もしくは

1. すべての iChat AV 通信は、ポート 5190 と 5298 以外は UDP で、TCPUDP の両方をオープンする必要があります。

という文章により激しくワケワカメにさせられて読む気が失せるので、

の表を見て、iChatiChat AVで使うポートを追っかけた方が解りやすいです*1
# なんてのはオレだけですかね...。
#「5190と5298はTCPUDPの両方。それ以外はUDPのみ。」って書けばいーじゃんよぉ(泣


次なるポイントはNAT。
あー、この場合の「NAT」は広義のとゆーか、要は「一対多の変換」で。
とゆーか、NetBSDでPPPoEルータを作ろうってぇ日本人は、フツー『NetBSD ドキュメンテーション: PPPoE (DSL) 経由の接続手順』を一回は読むと思うんです。
この中の『MSS の調節を伴う NAT の設定』では、/etc/ipnat.confの例として

map pppoe0 192.168.1.0/24 -> 0/32 portmap tcp/udp 44000:49999 mssclamp 1440
map pppoe0 192.168.1.0/24 -> 0/32 mssclamp 1440

と書かれていて、より詳しくは『NetBSD ドキュメンテーション: NetBSD ネットワーキングの基礎』の『簡単な NAT ("IP Masquerading") の設定』を参照することになってます。こちらの/etc/ipnat.confの例では、

map ppp0 10.0.0.0/24 -> 0/32 proxy port ftp ftp/tcp
map ppp0 10.0.0.0/24 -> 0/32 portmap tcp/udp 40000:60000
map ppp0 10.0.0.0/24 -> 0/32

ですね。
さて、実際にはmssclampオプションは与えるとして、どちらもportmapを使ってますね。
他に/etc/ipnat.confの例をググってみても、大抵は portmap tcp/udp xxxx:xxxxx となっているか、portmap tcp/udp auto などとなっています。
これだと、iChat AVは上手く行きません。
ヒントは、void GraphicWizardsLair( void ); //さんの該当分 経由 の macosxhints - Make iChat AV work with both sides using NAT にアリ。
書いてあるのはOpenBSDのpfでのことで、pfでのNATでは「static-port」って指定するだけで済むのですがipfilterではそんな指定はできません。が、要はNATされる際に送信元ポートを一致させたままにすれば良い訳ですな。
そんな訳で、本来は先に読むべき(汗 であろう ipnat(5) の man を見てみたり(滝汗。


えーと。要は、portmap を使わない、と。そうすれば、pfでのstatic-portの様にNATがかかる、と。
まぁ、全部使わないようにするか、とか、iChat AVでつかうポートだけ選択して変換するようにするか、とかはお好みで。楽なのは、

map pppoe0 192.168.1.0/24 -> 0/32 mssclamp 1414

一行だけ、とか。


最後にフィルタルール。
まぁこれは、先のiChat AVで使うポートを参考に。要は、

ポート番号TCP/UDP
5060UDP
5190両方
5678UDP
16384-16403UDP

が開いてりゃいー訳です。
これをどう絞るか(相手とかクライアント端末とかとかとかとか)はもうそれぞれお任せで。


という訳で、別にNetBSDでPPPoEなルータに限った話ではないですが。
上の表のポートが開いてて、“pfのstatic-portオプション”の様にNATすれば、iChat AVは問題なく使えるよ、という私的メモでした。


でもやっぱり、フツーはUPnP対応ルータを買った方が楽です。多分。いや、きっと。


# 嗚呼、OpenBSDでin-kernelなPPPoEがサポートされるのは何時になるかなぁ...
# でも要はpfを使いたいんであって、FreeBSDNetBSDでのpfって今はどーなんだろーなぁ、とか...。
# とゆーか、statc-portなNATって...さっさとIPv6に移行しろとかそーゆー気配が...。

*1:これの日本語訳に当たる アップルソフトウェア製品で使われる「一般的な」 TCP および UDP ポート は少々古いようでiChat関連の記述は無い。