ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

使い物になる NAT with pf を作る

前回までで 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 を通すルールとか。

ここから先は今後の要検討事項

iPhoneIPv4 アドレスを手動設定しても接続できない

これは……物理ルータの(クソ)仕様なのだろうか?バッキャロー!とつい江戸っ子になってしまいそう。 でも ARP は飛んできてるっぽいんだよなぁ?謎である。

ルータ的なパケットフィルタはどうしようか

一般的なブロードバンドルータにあるようなフィルタの設定、どうしようか? でもイマドキの Windows はパブリックネットワーク設定にしておけば それなりなファイアウォールかかってる気もする。

てかぶっちゃけ、市販のルータだと IPv6ファイアウォールかからないものが多いし、 FreeBSD ルータはすべてパススルーでも特に困らない疑惑?そのうち考えよう。