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

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

13.1-R で MAP-E ルータを作ってみる

前回は pfmap-e-portset で NAT した場合のこちら側ポートをいい感じに設定してもらいました。

今回はもっとちゃんとルータっぽくするために、宛先のルーティングをいい感じにします。 MAP-E 経由の宛先だけルーティングテーブルに書くのはしんどいからね。 pf の機能を使うと、宛先ではなく差出人のアドレスを使ってルーティングを切り替えられます。

まず結論

ググってもサンプルがなかったので man pf.conf に書いてある呪文と ソースコードを読み解きながら試行錯誤した結果、動くようになった pf の設定がこれ。

nat log on em0 from 192.168.64.0/24 to any -> 106.73.212.224 map-e-portset 4/8/32
pass all
pass out log route-to gif0 from 106.73.212.224

log は別になくても困らないかも。実験の時はあると便利。ポイントはこの2点。

  • まず先に NAT ルールが効くので、192.168.64.2 から普通のルーティングルールで外に出るパケットはデフォルトルートの em0 から(物理的に存在しているルータに向けて)出てくわけで、 on em0 from 192.168.64.0/24 to any でマッチングしたものを、MAP-E のアドレスに変換します
  • で、NAT ルールで差出人アドレスが差し替えられた状態( from が MAP-E アドレス )のパケットに対してルーティングを切り替えます。

後は環境によるかもだけれども以下は必要なことも。

# sysctl net.inet.ip.forwarding=1
# sudo route delete 172.67.134.3

前者はまぁ FreeBSD でルータを作るときの定型文。後者は前回の記事で追加したルールが今回邪魔になるので。 というのも、先に routegif0 送りにしてしまうと pf でのマッチングが取れなくなってしまうみたい?

接続テスト

まぁそんな訳で、 /usr/local/etc/ezjail/temp の設定から FIB の設定を空欄に戻してやると、

temp_vm# 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

うぇいうぇい。完璧ですね。

ていうか、差出人アドレスの設定をすればいいだけなので、 nc を使ってこれでもよかったみたい。

$ printf "GET /ip HTTP/1.0\r\nHost: ifconfig.io\r\n\r\n" | nc -4 -s 192.168.64.1 ifconfig.io 80
<snip>

106.73.212.224

やったぜ。

物理 NIC を介しているので、適当な Windows マシンがあるなら ネットワークアダプタの設定で IPv6 を無効にしてから IPv4DHCP ではなく手動設定にして、 192.168.64.5/24 とかにしてデフォルトゲートウェイ192.168.64.1 に向ければ MAP-E 経由になります。 ブラウザで https://ifconfig.io にアクセスすればバッチリ、そこには光り輝く(当社比)MAP-E の IPv4 アドレスが!!

速度はどうだろうか

今回はアップロードも測定してみました。

Download/Upload
MAP-E 140Mbps/110Mbps
PPPoE 160Mbps/170Mbps
IPv6 150Mbps/210Mbps

下り速度はまぁ誤差の範囲な気もするけど……上り遅くない??なんで??

まとめ

という訳で、ここまで順番に読むのが面倒な人(特に私)のためのまとめ。これを適当に mape.sh とかにして sudo でたたき込む。

ifconfig em0 inet6 240b:11:d4e0:2000:6a:49d4:e000:2000/128 alias
ifconfig gif0 create up
ifconfig gif0 inet 106.73.212.224/15 106.73.212.224
ifconfig gif0 inet6 tunnel 240b:11:d4e0:2000:6a:49d4:e000:2000 2404:9200:225:100::64

sysctl net.inet.ip.forwarding=1

ifconfig em0 inet 192.168.64.1/24 alias
ifconfig em0 inet 192.168.64.2/32 alias

kldload pf
pfctl -F all
pfctl -f /dev/stdin << PFRULE
nat log on em0 from 192.168.64.0/24 to any -> 106.73.212.224 map-e-portset 4/8/32
pass all
pass out log route-to gif0 from 106.73.212.224
PFRULE
pfctl -e

ipfw add 10 allow ip6 from 240b:11:d4e0:2000:6a:49d4:e000:2000 to 2404:9200:225:100::64
ipfw add 20 allow ip6 from 2404:9200:225:100::64 to 240b:11:d4e0:2000:6a:49d4:e000:2000
ipfw add 30 allow ip from any to any via gif0
ipfw add 40 pass all from 192.168.64.0/24 to any keep-state

ただまだ微妙なところがあって。

  • TCP で大きいパケットを投げるとおかしくなる=MTU の調整とかの関係がなんかおかしい?
  • バッキャローと叫びたくなるルータの仕様なのか、iPhone からパケットが届かない
  • LAN 内にあるおうちサーバに接続できない

もう少し調整しないと実用は難しいのかも。