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

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

13.1-R で MAP-E を試してみる

そろそろ 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

ちゃんとアドレスとポートを差し替えてくれている様子。素晴らしいですね。

今回はここまで。