Vagrantでpingが通らない!ゆえにVagrantネットワークを学び直したよ ITかあさん

ITかあさん

Vagrantでpingが通らない!ゆえにVagrantネットワークを学び直したよ

Vagrantでpingが通らない発生

Vagrant
こんにちは、大変ご無沙汰しております。仕事忙しくて死んでましたが比較的元気です。
比較的元気めに死んでました。
Vagrant環境を構築したら事件に遭遇。

vagrantでWebサーバー立てたのにブラウザから全くアクセス出来ない

問題解決するまでに3連休使ってしまいましたよ。
結果として、ネットワーク失敗したvagrantを一度destroyしてもう一度upするとうまくいったのですが、vagrantはもとい、centos7のネットワーク関係を学ぶのによい機会となったので備考録として残しておきたいと思います。

Vagrantfileを今一度しっかり読もう

明らかにVagrantのネットワークに関する問題にぶつかって、初めてしっかりとVagrantfileに目を通しました。
(遅せーよ)
私が今回使ったVagrantfileはこちらです。まっさらな状態からvagrant環境を作る手順を記載してあります。

空っぽのCentOS7のboxを追加して、環境を作ります。

initしたVagrantfileの中身を確認

今回使ったvagrantfileをそのまま記載。vagrantfileのあるところでvagrant upをするとまっさらなCentOS7の環境が出来ます。

Vagrant network

お手軽に自分のマシンに仮想環境が作れると思っていたvagrantですが、Vagrantfileのネットワークについてちゃんと理解できていなかったので復習。

forwarded_port

vagrant_network

中からアクセスする時(localhost)はforward(転送)し、IPアドレスでアクセスする(guest)はguestに設定したポートでアクセスする

public_networkでもprivate_networkを設定していても設定することが出来る。
ゲストは80ポートへアクセスすると8080ポートへ転送されることになります。urlに
http://192.168.10:8080 とか、URLにポートが含まれるのが嫌な場合、forwarded_portの設定が必要。
firewall側ではゲスト向けの80ポートだけ開放すればよい。

http://192.168.10/でアクセスすると、http://192.168.10:8080/にアクセスしたことになる

特にURLにポートが含まれても別にどうって子とない場合、この設定はなくても大丈夫。

public_network

public_networkだと同じネットワーク回線に接続しているマシンに対して接続を許可する

他の端末からもアクセスする可能性がある,複数人で作業する場合はpublic_networkがよいですね。
vagrant upで起動する際、publicでよいか聞かれるので、「1」を入力するとpublic_networkで起動できます。

private_network

環境を構築したホストマシンからのみのアクセスを許可する

自分1人で作業するならprivate_networkで十分そうです。

vagrant upでサーバー起動したらまずすること

vagrant upでVMサーバー起動したら最初にすることはapacheやら必要なソフトのインストールではなくネットワークやfirewallの確認をします。

itKaasan-MacBook-Pro:root# vagrant up
itKaasan-MacBook-Pro:root# vagrant ssh
[vagrant@localhost ~]$ ifconfig
enp0s3: flags=4163 mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::a00:27ff:fede:e0e prefixlen 64 scopeid 0x20 ether 08:00:27:de:0e:0e txqueuelen 1000 (Ethernet)
RX packets 1831 bytes 151847 (148.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1356 bytes 161553 (157.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

enp0s8: flags=4163 mtu 1500
inet 192.168.33.12 netmask 255.255.255.0 broadcast 192.168.33.255
inet6 fe80::a00:27ff:fe9f:1d69 prefixlen 64 scopeid 0x20 ether 08:00:27:9f:1d:69 txqueuelen 1000 (Ethernet)
RX packets 5362 bytes 768787 (750.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5694 bytes 10079743 (9.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Lokale Schleife)
RX packets 76 bytes 10872 (10.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 76 bytes 10872 (10.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

vagrant upで起動したらサーバーログインをして、ifconfigでvagrant fileに記載したIPアドレスがちゃんと設定されているかを確認します。
なお、私はこれが何をやっても出ませんでした!(これで3日潰したのですが、腹がたってvagrant destroyして再度vagrant upしてifconfigでIPアドレス確認したら設定したIPアドレスが出現したんです!)
私はvagrantを再構築することで思った通りのIPアドレスを確認出来ましたが、centos7のネットワークマネージャー(nmtui)で固定IP設定出来ます。なければnmtuiでvagrantfileに記載のIPアドレスを追加設定するというやり方もあります。案外vagrant再構築すれば復活したのは私の例ですが。

config.vm.synced_folder

synced_folderはまんまフォルダの設定のこと。vagrantfileと同じ階層にappフォルダがあって、vagrant sshでサーバーログインすると、appフォルダという名称ではなくvagrantフォルダという名称にappフォルダが変わっています。
vagrantのサーバーの中からみたフォルダ名と、ホストマシンから見たフォルダの名称が違うという点に注意してください。

pingで外からのアクセスをチェック

一度vagrant sshをexitしてvagrantのサーバーから離脱するか、ターミナルをもうひとつ立ち上げてvagrantfileに記載のIPアドレスに接続できるかチェックしてみましょう。

# pingでvagrantの外からアクセスできるかチェック
itKaasan-MacBook-Pro:chihiro-matsuda$ ping 192.168.33.12
PING 192.168.0.1 (192.168.33.121) 56(84) bytes of data.
64 bytes from 192.168.33.12: icmp_seq=1 ttl=255 time=0.574 ms
64 bytes from 192.168.33.12: icmp_seq=2 ttl=255 time=0.536 ms

このとき、pingテストで「Request timed out.」が出たらこの後どんなにWebサーバーを立てようがブラウザアクセスも何も出来ません。
私はsshでログインは出来るのにpingがどうしても通らない問題が解決せず、destroyしてからvagrant upしたら普通につながりました。なんだったんだろうね。

firewallを空ける

Sequence Diagram

# ポート開放
firewall-cmd –add-port=22/tcp –zone=public –permanent
firewall-cmd –add-service=ssh –zone=public –permanent
# サービスの削除
firewall-cmd –remove-port=22/tcp –zone=public –permanent

# 利用可能なサービス一覧
firewall-cmd –get-services

# firewalldのリロード
firewall-cmd –reload

# firewallの無効化
systemctl stop firewalld

# OS起動時無効化
systemctl disable firewalld

仮想VMであってもポートはデフォルトでは全て閉じているので必要最低限だけ空けるか、
あるいは自分1人しか使わないprivate_networkならいっそfirewallを切ってもいいかなって思ってる。
(ただし本番のサーバーでやったらダメ、絶対)

vagrantのネットワーク関連まとめ

手順として、
・vagrant init
・vagrant up
・vagrant ssh
・ifconfig
・pingで確認

実は以前node.jsでスクレイピングでデータを自働取得するスクリプトをvagrantの中に立てたCentOSサーバーでやってたんです。
全てsshでログインしてlocalhost内でスクリプト実行していたのでguestからのアクセスはテストしていませんでした。
で、そこにwebサーバーをいざ立ててウェブブラウザからアクセスしても全くつながらず連休3日つぶした次第。。

結局なぜsshでログインできるのにprivate_networkでホストマシンからping叩いても通らなかったのはなぞですが
サーバー立てた直後にpingテストさえしておけば原因究明には時間がかかりませんでした。

おかげでvagrantのネットワーク設定の部分は勉強しなおすよいきっかけになったのでよかったと言えばよかったかも。

初夏のJavaScript祭 in サーキュレーションビル ForPro