VagrantでCentOS7を立てたが、httpアクセスが繋がらない時にやったこと

自分のMac上にVagrantでCentOS7を構築した時にはまったこと。

## vagrant環境構築

以下ページを参考にさせていただきました。
詳細は割愛します。

[Ansible使ってVagrantのゲストOSの構成管理する【Playbook: jenkins, node.js】](http://yutapon.hatenablog.com/entry/2014/04/08/102836)

## Webサーバ起動

node.jsのプロジェクトを構築したかったので、諸々をインストールし、Webサーバを立ち上げました。

```app.js
app = require('express')();
app.get('/', function(req, res){
        res.send('hello world');
    });
app.listen(80);
```

Macのブラウザからアクセスしたところ、
ページが見つかりません。とのエラーが表示されました。

## Vagrantfile

Vagrantfile上の設定は特に問題なさそうでした。

```Vagrantfileの確認
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "private_network", ip: "192.168.33.10", id:"http"
```

プライベートIPとポートの設定も問題ないので、
`localhost:8080`か`192.168.33.10`で繋がるはず。

## telnetアクセス&IPアドレスの確認

`telnet`で80ポートにアクセスしてみたものの、はじかれました。
VM上から`curl`で確認したところ、問題なく`hello world`が返ってきたので、
VMサーバのネットワークの設定関連を確認しました。

VM上のIPアドレスを確認したところ、問題なくVagrantfileに記載されているIPが振られていました。

## SELinux設定変更

訳もわからず、ググっていたところ、SELinuxを無効にするといいんじゃないかみたいな記事があったので、とりあえず確認してみました。

`getenforce`をたたいたところ、`Enforcing`と表示されたため、有効になっていました。
configファイルを編集し、無効に設定。その後サーバを再起動させました。

そもそもSELinuxってなんなのかというと、ウィキペディアを参考にしてください。
[SELinux](http://ja.wikipedia.org/wiki/SELinux)

で、再度確認したところ、やっぱりだめでした。
SELinuxは関係ない可能性が高いです。

## firewalld設定変更 

再度途方にくれて、ググったところ、iptablesが怪しいのではないかという記事を見つけたので、確認してみました。

iptablesを無効にすべく、`/etc/init.d`配下を確認したところ、起動スクリプトがありませんでした。

そんなことはありえない、とさらにググったところ、CentOS7からは、`iptables`ではなく、`firewalld`という新しいものができたらしいことを知りました。

`firewalld`とは、今までの`iptables`と同じ役割を果たす、外部からのアクセスを制御するもので、内部的には、`iptables`を使って制御している？らしいです。

基本的に`iptables`を無効にしていたたちなので、とりあえず、無効にしました。

`systemctl stop firewalld`

参考：
[CentOS 7からデフォルトのFirewalldでハマった(iptablesは今後使わない？)](http://urashita.com/archives/963)

で、再度確認したところ、無事`hello world`が表示されました。

CentOS7から変わっている部分が多々あるそうなので、勉強しないとまたハマりそうです。

後、SELinuxとかfirewalld(iptables)とか久しくやっていないので、設定方法とか完全に忘れていました。

今度からはちょくちょく触るように心がけたいと思います。

## Tips

### centOS7上でifconfig

CentOS7を最小構成で構築するとネットワーク系のコマンドが最初から入っていないらしいです。

そんな時は、yumで`net-tools`を入れてやればいいらしいです。

[RHEL7/CentOS7でipコマンドをマスター](http://d.hatena.ne.jp/enakai00/20140712/1405139841)

### Failed to mount folders in Linux guest

`vagrant up`したときにこんなエラーが出た時は、

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant
The error output from the last command was:
/sbin/mount.vboxsf: mounting failed with the error: No such device
```

[vagrantでmountエラーの解決方法](http://qiita.com/osamu1203/items/10e19c74c912d303ca0b)

このページを参考にして、

```
vagrant ssh

[vagrant@localhost ~]$ sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]

[vagrant@localhost ~]$ exit

vagrant halt
vagrant up
```

ログインして、`VirtualBox Guest Additions`などなどを再構築して、サーバを落として、再度あげると解決します。
ちなみにこのコマンドで何をやっているかというと、`VirtualBox Guest Additions`という、Vagrant上のOSとホストマシンとのやりとりをスムーズにするための機能の設定をしているみたいです。

参考：
[vagrant upでsynced_folderが失敗した時の対処](http://blog.hifumi.info/2014/03/03/troubleshoot-for-synced_folder/)
[Guest Additionsのインストール](http://vboxmania.net/content/guest-additions%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)