Vagrant + rails + CentOS7の組み合わせでゲストOSのlocalhost:3000に接続できない場合


# 概要
VagrantとCentOS7の組み合わせでRuby on Railsの環境を構築したのですがWEBrick起動後ホストOSからゲストOSのlocalhost:3000に接続出来ませんでした。

色々と調べてみると同じような事例は見つかりましたが、CentOS6とCentOS7ではFirewallのサービスが異なるみたいでハマりました。

私と同様にVagrant + CentOS7 + Railsの組み合わせで、ホスト側からlocalhost:3000に接続出来ない場合の参考になればと思い投稿してみました。


# 環境
GuestOSにRailsをインストール
* Host OS:OS X El Capitan(version 10.11.4)
* Guest OS:CentOS Linux release 7.1.1503 (Core)
* ruby 2.1.8p440 (2015-12-16 revision 53160) [x86_64-linux]
* Rails 4.2.6


# 内容
ゲストOS側で、rails s -b 0.0.0.0でwebricを起動

ゲスト側でport3000がlisten状態になっていることは確認

```
[root@localhost zones]# netstat -ant4 -p | grep 3000
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      4620/ruby
```






ゲスト側でport3000が空いていないことを確認

```
[vagrant@localhost ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.2.2        0.0.0.0         UG    100    0        0 enp0s3
10.0.2.0        0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
```



iptablesサービスが起動しているか確認

```
[root@localhost sysconfig]# systemctl list-unit-files | grep "ip"
var-lib-nfs-rpc_pipefs.mount                static
iprdump.service                             disabled
iprinit.service                             disabled
iprupdate.service                           disabled
iprutils.target                             disabled
```

iptablesというサービスは起動していない模様

調べてみるとCentOSではiptablesの代わりにFirewalldというのが使われるようになったみたいです。


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

上記のサイトを参考にしてFirewalldの設定を行う。



修正前のFirewalldの確認

```
[root@localhost sysconfig]# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```

/etc/firewalld/zones/public.htmlにhtmlを追加
 
 
```修正前/etc/firewalld/zones/public.xml
 <?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
</zone>

```
 
```修正後/etc/firewalld/zones/public.xml
 <?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <service name="http"/>
</zone>
```




以下のコマンドを実行してport3000を開ける

```
[root@localhost zones]# firewall-cmd --permanent --add-port=3000/tcp
success
```

public.htmlの修正とport3000追加後に以下コマンドでサービスを再起動

```
systemctl restart firewalld
```

サービス再起動後にport3000とhttpが追加されたことを確認

```
[root@localhost zones]# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http ssh
  ports: 3000/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```

ホストOSからゲストOSのhttp://localhost:3000/ にアクセスするとやっと下の画面が表示されました！！

![スクリーンショット 2016-04-13 8.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/44053/558521a5-236f-b82e-0d79-68f266312c0e.png "スクリーンショット 2016-04-13 8.09.40.png")





# 参考にしたサイト
今回参考にさせて頂いたサイトです。大変役立ちました。ありがとうございました！

[CentOS 7からデフォルトのFirewalldでハマった(iptablesは今後使わない？)]
(http://urashita.com/archives/963)
[CentOS7.1 64bit firewalldによるアクセス制御](http://www.kakiro-web.com/linux/firewalld.html)
[CentOS7 firewalldの設定](http://www.unix-power.net/centos7/firewalld.html)