[linux]主机访问虚拟机web服务(CentOS)
目的为了实现主机和虚拟机的通信,访问虚拟机中架设的web服务。
按理说通过虚拟机ip + web服务端口,即可在浏览器访问虚拟机的web服务。
但是由于CentOS的防火墙问题,对应web端口无法访问。通过配置CentOS防火墙来解决。
CentOS 7使用firewalld来管理防火墙,firewalld的配置不了解,切换为比较通用的iptables配置。
关闭firewalld并启用iptables服务:
systemctl mask firewalld
systemctl stop firewalld
yum install iptables-services
systemctl enable iptables
systemctl start iptables
通过systemctl status firewalld.service可以查看firewalld处于dead状态。此时防火墙由iptables接管。
iptables的配置详情参考这里:
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
• 查看iptables端口列表:
iptables -L -n
• iptables开放80端口:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
之前碰到过在命令行添加端口开放,但查看iptables -L -n却发现没有生效的问题。于是直接修改配置文件/etc/sysconfig/iptables。文件中有开放ssh 22端口的配置,复制相关命令行,将端口部分变更为80.
修改之后重启iptables: service iptables restart
通过主机telnet虚拟机,验证端口是否开放。
我的vmware虚拟机网络配置为NAT。
首先查看虚拟机分配到的ip地址:ifconfig
此处虚拟机的地址为192.168.151.131.
首先确认主机ping虚拟机能ping通: ping 192.168.151.131.
如果ping不通,说明地址或网络有问题。导致不通的原因很多,请自行搜索解决。
然后在主机telnet 虚拟机端口: telnet 192.168.151.131 80
如果有提示telnet命令不存在的情况,表示主机没有开启telnet服务。
在控制面板->程序->启用或关闭Window功能,找到telnet客户端,勾选之后提示重启生效。保存相关环境,然后重启。
现在win10的控制面板入口十分隐蔽,我一般通过资源管理器左侧,[此电脑]图标右键,选择属性,在弹出的窗口中找到控制面板。
如果telnet成功,则cmd会进入一个空白的界面,按ESC键退出会显示一些错误信息。表示虚拟主机是可连接的,配置成功。通过浏览器访问ip+端口,应该可以进入web服务。
如果telnet不成功,原因依然很多。
有一种说法是selinux本身也有防火墙, 通过setenforce 0命令关闭。个人实测selinux的开启/关闭并不影响端口接通。
另一种说法是主机防火墙问题,可以自行开关主机防火墙确认。在我的案例中,问题也与主机防火墙无关。
我的问题在于没有启动监听80端口的web服务。
这里我的疑问是,如果端口没有服务监听,为什么是拒绝连接,而不是操作系统返回信息提示端口背后无服务?
我配置的是nginx+uwsgi的Flask web,通过nginx启动服务。
如果配置正确,通过netstat -ntpl可以查看到端口80和nginx服务的相关信息。
再次在主机telnet 虚拟机地址端口, 进入空白终端,esc退出有HTTP 400提示。表示端口服务OK。
尽管我并没有使用uwsgi app.py来运行虚拟机的app, web服务依然OK。所以推测在启动nginx服务后,nginx已经通过配置,调用uwsgi启动了对应的app服务,无需手动开启。
通过浏览器访问ip+端口,返回我配置好的Hello World。大功告成。