前回までで FreeBSD の pf で MAP-E ルータとしてかろうじて動く設定になりました。 でもなんかいろいろおかしくて、ちゃんと通信できなかったので今度こそ。
一番の問題。Google が開けない。
tcpdump
をいろいろ眺めた結果、おかしな部分は分かった。
gif0
と外との通信がパケット分割されてるようで、再構成できていないせいで
NAT のルールが上手く動かなかったりしてたみたい。
という訳で、 pf.conf
に以下の設定を追加。
scrub on gif0 all fragment reassemble scrub on gif0 all reassemble tcp
何が違うのかはよくわからないけど、みんなおまじない的につけてるみたい。
gif0 の MTU が小さい…?
上記の問題を調べてた時に気づいた。 gif0
のデフォルトの MTU が 1280 しかない。
これのせいで MTU の自動調整が上手くきかなかったのか?と思って 1500 にしたりした。
でも別に戻しても動いたのであんま関係ないかも。 単にフラグメントが起きなくなっただけの話なので、こっちで直すのは本質じゃないよね。
で、値をどうしようか。IPv6 でカプセル化しちゃうし、1500 よりちょっと小さい方がいいのかもしれない。 まぁイマドキなら別に、ちゃんと計算しなくてもとりあえず 1500 にしておけば いい感じに TCP が mss を調整してくれる気がする。
LAN 内のおうちサーバにアクセスできない
常用するならこれはちょっと困る。
まぁ、192.168.64.0/24 からのパケットは全部強制的に NAT して gif0 に流してしまうからなんだけど。 なのでルールをもうちょっとちゃんと設定して、おうちサーバは直通ルートにすれば済む話。
と、思ったんだけれども、別にこのままでも要するに自宅 LAN の外の扱いになっているわけで、 一旦 MAP-E から外に出て、ルータの NAT から入ってきておうちサーバに届くんだよなぁ?
ということは。 この MAP-E の IPv4 アドレスは他の v6 プラスユーザと共有しているので、IPv4 アドレス共有になってるところからは 同様にアクセスできないのかもしれない?のでちゃんと直さないといけないな?
という訳で調べてみたところ、どうやら SYN+ACK が MAP-E の IPv4 アドレス宛になる (SYN の差出人は外からそう見えるので当然) ので、そこで pf の NAT ルールに引っかかって gif0 から投げていて、 ファイアウォールの動的ルールに引っかからないで落とされているみたい。
これに対する特効薬はルーティングでの reply-to
っぽい。つまりこう。
pass out log route-to gif0 from 106.73.212.224 pass in log reply-to (em0 XXX.XXX.XXX.XXX) from 106.73.212.224
同じ MAP-E の IPv4 アドレスが差出人のパケットでも、
- pf の NAT ルールで差出人を差し替えた後の(外向きのパケット)は
gif0
から投稿する - 一方、同じ IPv4 アドレスから来た SYN パケットへの応答 SYN+ACK は、物理ルータから物理 NIC の em0 から来てるので、本来のデフォルトルートに返す
これでちゃんと動くようになった。 ローカル IP でもグローバル IP でも、ちゃんとおうちサーバへの接続ができたのでよし。 ping もちゃんと導通してた。ID もポートと同じ割り当てになるっぽいのね。
ipfw の整理
っていうか pf に統合すればいいのに。
…と思いながら最小の構成。
allow ipencap from 240b:11:d4e0:2000:6a:49d4:e000:2000 to 2404:9200:225:100::64 via em0 allow ipencap from 2404:9200:225:100::64 to 240b:11:d4e0:2000:6a:49d4:e000:2000 via em0
トンネルの出入り口の IPv6 アドレスの間を通せばいいみたい。
ipencap
はプロトコル ID 4 番のこと。
他は普段のルールに元々あると思う。中から外にでるルールとか、ICMP を通すルールとか。
ここから先は今後の要検討事項
iPhone の IPv4 アドレスを手動設定しても接続できない
これは……物理ルータの(クソ)仕様なのだろうか?バッキャロー!とつい江戸っ子になってしまいそう。 でも ARP は飛んできてるっぽいんだよなぁ?謎である。
ルータ的なパケットフィルタはどうしようか
一般的なブロードバンドルータにあるようなフィルタの設定、どうしようか? でもイマドキの Windows はパブリックネットワーク設定にしておけば それなりなファイアウォールかかってる気もする。
てかぶっちゃけ、市販のルータだと IPv6 はファイアウォールかからないものが多いし、 FreeBSD ルータはすべてパススルーでも特に困らない疑惑?そのうち考えよう。