読者です 読者をやめる 読者になる 読者になる

cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

Vagrantのpublic_networkで嵌まる → forwarded_portを使って解決!

Vagrantで作ったVMにApacheをインストールして外部に公開しようとして嵌ったのでメモしておきます。

普段Vagrantを使わずにWebアプリを公開するときはVirtual Boxの設定でネットワークをブリッジアダプターにして、ルータのポートマッピング設定で直接VMのローカルIPを指定していました。
なのでVagrantを使った今回もforwarded_portではなくてBridgeに当たるpublic_networkを使おうとして嵌ってしまいました。

やりたいこと

Vagrantで作ったVirtual BoxのインスタンスApacheなどのWebサーバをインストールして外部に公開

手順

forwarded_port設定がされたVagrantfileを使ってノードを立ち上げApacheをインストール

mkdir sandbox
cd sandbox
wget https://gist.github.com/cloverrose/6547673/raw/Vagrantfile --no-check-certificate
vagrant up

vagrant ssh  # 以下VM上で実行
sudo apt-get update
sudo apt-get install -y apache2

ルータのポートマッピング設定をする

ブラウザからhttp://192.168.0.1/にアクセスして、ポートマッピング設定を行う。

確認

ルータの設定を行うとグローバルIPが変わるので、グローバルIP確認などでグローバルIPを調べる。
LAN外の端末(iPhoneとか)からhttp://[グローバルIPアドレス]:8080にアクセスする。
It works!のページが出ればOK!


(おまけ)eth0とeth1を入れ替えることでpublic_networkを使った方法でも一応できました

Vagrantfileで設定したpublic_networkはeth1に割る振られ、それとは別にeth0もある。
この状態でApacheをインストールしてeth1のローカルIPにポートマッピング設定をし、WANからアクセスしたが接続できなかった。

これはpublic_networkをeth0に割り振れればうまくいきそうだと思い調べて、eth0とeth1を入れ替え(debian系) - 墜落日誌を参考に/etc/udev/rules.d/70-persistent-net.rulesをいじってeth0とeth1を入れ替えることで上手く行きました。


ここで自分の環境だと/etc/udev/rules.d/70-persistent-net.rulesはファイルではなくディレクトリだった。
Linux - VMイメージ内でMACアドレスが固定化されるのを防ぐ - Qiita [キータ]を読むと70-persistent-net.rulesをファイルではなくディレクトリにするのは、MACアドレスの自動保存無効化のためらしい。


またググるとVagrantfileで次のようにすればpublic_networkをeth0に割り振れるという記事(Bridged interfaces with Vagrant « bits | andy smith's blog)を見つけたのですが、自分の環境だとダメでした。

config.vm.network :public_network, bridge: "eth0"

これでうまく行けば簡単なんだけどね。