OS X Yosemite環境のVagrantをポート80で運用する方法

ちょっと困ったので調べてみました。

自分のローカル環境ではMac上にMAMPなどは置いておらず、開発用のローカルサーバは Vagrant上のApacheやMySQLを使用しています。

Vagrant(VirtualBox)では通常の方法ではホストマシン→ゲストマシンに対して 標準ポート(HTTPの場合は80)でポートフォワードを行うことができません。 (Windowsの場合は可能ですが警告が出ます、Macは起動すらしません)

警告が出る理由も分かりますし、ポート8080などで運用することが正しいとは思いつつも Windows環境と揃えたいなどの理由でこれまでipfwを使用して無理やりホストマシン上で 80→8080のポートフォワードを行っていました。

これまではipfwがあったので以下のような設定で良かったのですが、 Yosemiteに変わってipfwが削除されてしまいました。(正確にはMountainLionの時から非推奨だったようです)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to me 80

代替手段を探してみたところYosemiteからはPFを使用するようです。
Vagrantの起動時にPFの設定を行いたため、まず最初にvagrant-triggersのインストールを行います。

vagrant plugin install vagrant-triggers

次にVagrantfileに以下の記述を追加します。

config.trigger.after [:provision, :up, :reload] do
    system('echo "
    rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
    " | sudo pfctl -ef - > /dev/null 2>&1; echo "==> Fowarding Ports: 80 -> 8080 & Enabling pf"')
end

config.trigger.after [:halt, :destroy] do
    system("sudo pfctl -df /etc/pf.conf > /dev/null 2>&1; echo '==> Removing Port Forwarding & Disabling pf'")
end

ここまで設定が完了した状態でVagrantを起動すると起動時に PFの設定が行われホストマシン上で80->8080のポートフォワードが設定されます。

参考サイト

OSX Yosemite Port Forwarding for Vagrant