前回は pf
の map-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 でルータを作るときの定型文。後者は前回の記事で追加したルールが今回邪魔になるので。
というのも、先に route
で gif0
送りにしてしまうと 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 を無効にしてから IPv4 を DHCP ではなく手動設定にして、
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 内にあるおうちサーバに接続できない
もう少し調整しないと実用は難しいのかも。