LoginSignup
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-12

概要

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の設定

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18