そろそろ 13.0-R のサポートが切れてしまうので、しれっとアップデートしました。
さて。そういうことなので pf
の NAT に map-e-portset
対応が増えているのです。
という訳で試してみました。
まずは前回のおさらい
前回の記事を見ながら gif0
を設定。
うーん??どうしてパケットが流れないんだ……
tcpdump
を眺めたり netstat -rn
を眺めたり ipfw show
してみたり。
小一時間ほど散々調べた結果が、
- NIC に CE アドレス振ってないな??
- どうやら EUI-64 アドレスを見間違えたようだ……目が節穴になってるや
- しかも
ipfw
あけてないじゃん- 前回の記事に書いてあったよね?どこ見てるの?
- というかそもそも IPv6 の default ルートがないんだが???
- どうして……
ケアレスミスが多いですね。おまえ仕事もそんな感じでやってるのか???
そんな訳で、えらく時間はかかったけれども前回と同じことが 13.1-R でもできることを確認。
ezjail
で管理してる仮想マシンから MAP-E 経由で外に出てみよう
ステップバイステップで実験。
まずはホスト側で MAP-E 経由で外にでる宛先 IP アドレスを決める。
今回は ifconfig.io
の A レコードを使うことにしたのでこれを。
つまり、仮想的なルータの方で、 ifconfig.io
向けのパケットを gif0
に向けるわけ。
# route add 172.67.134.3 -iface gif0
で、仮想 LAN 的な感じで NIC に IP アドレスを 2 つ設定。 プレフィックスは既存の LAN とぶつからないように。こんなときプログラマは 64 とか使いがち。
# ifconfig em0 inet 192.168.64.1/32 alias # ifconfig em0 inet 192.168.64.2/32 alias
さらに、FIB 1 番を増設して実験用の ezjail
に渡すことにする。
デフォルトルーティングを仮想のルータ向けにしたテーブルを仮想マシンに使わせるわけ。
# sysctl net.fibs=2 # setfib 1 route add default 192.168.64.1 -iface
あれ、ていうかイマドキは FIB って sysctl
で増やせるんだ……
諦めてカーネルビルドする決心したところで気づいたよ。
そして本命。 pf
を有効にして NAT の設定。
nat log on gif0 from 192.168.64.0/24 to any -> 106.73.212.224 map-e-portset 4/8/32 pass all
こんな pf.conf
を作って読み込ませる。変換先の IP アドレスは外向きのやつ。
map-e-portset
の引数は man pf.conf
参照。
# pfctl -f pf.conf # pfctl -e # pfctl -sn nat log on gif0 inet from 192.168.64.0/24 to any -> 106.73.212.224 map-e-portset 4/8/32
最後に /usr/local/etc/ezjail/temp
の該当行を編集。
export jail_temp_ip="192.168.64.2" export jail_temp_fib="1"
あ、ファイアウォール空けるの忘れてた。前回のにこれを追加。
# ipfw add 40 pass all from 192.168.64.0/24 to any keep-state
この状態で jail 内部から以下のコマンドでこちらの IP アドレスを取得。
# printf "GET /ip HTTP/1.0\r\nHost: ifconfig.io\r\n\r\n" | nc 172.67.134.3 80 <snip> 106.73.212.224
無事に MAP-E での IP アドレスが取得できました。今回は nc
に -p
をつけてないのがポイント。
ちなみに jail 自体を setfib
して立ち上げてることになるので、中からはいちいち setfib
要らないのは好感。
いじわるして MAP-E で受信アドレスになれないポートを指定してみる。
temp_vm# printf "GET /ip HTTP/1.0\r\nHost: ifconfig.io\r\n\r\n" | nc -p 1025 172.67.134.3 80 <snip> 106.73.212.224 host# pfctl -ss | grep 192.168.64 all tcp 106.73.212.224:21004 (192.168.64.2:1025) -> 172.67.134.3:80 FIN_WAIT_2:FIN_WAIT_2
ちゃんとアドレスとポートを差し替えてくれている様子。素晴らしいですね。
今回はここまで。