18
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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は今後使わない?)

上記のサイトを参考にして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

参考にしたサイト

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

CentOS 7からデフォルトのFirewalldでハマった(iptablesは今後使わない?)
CentOS7.1 64bit firewalldによるアクセス制御
CentOS7 firewalldの設定

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
18
Help us understand the problem. What are the problem?