为什么虚拟机里面dvwa登录不了外面的网址
你在VMware里装好DVWA,为什外面浏览器打开 问题不在DVWA。为什外面DVWA的虚拟PHP进程在虚拟机里跑,它的机里 VMware默认用NAT。虚拟机通过宿主机的IP做地址转换,访问外网没问题。你在虚拟机里 但我遇到过一种情况:虚拟机里 这个坑很隐蔽。你在命令行测试一切正常,但PHP有自己的配置,跟系统网络是两回事。 如果你选了Host-Only,虚拟机只能跟宿主机通信,连路由器都碰不到。这种模式下,DVWA访问外网URL必然失败。 有人会问:那我加个NAT网卡不就行了?可以,但要注意路由优先级。虚拟机里有两块网卡时,默认路由指向哪块,流量就走哪块。 桥接模式下,虚拟机相当于局域网里一台独立机器,直接找路由器要IP。理论上访问外网最顺畅。但实际环境中,公司网络或者校园网经常做MAC地址过滤,虚拟机的虚拟网卡MAC不在白名单里,DHCP拿不到IP,或者拿到了但网关不给你转发。 我见过一个案例:桥接模式下虚拟机拿到了 DVWA里填的是域名而不是IP,比如 手动加一个 CentOS或RHEL系虚拟机,SELinux默认开启。Apache发起的外网HTTP请求可能被SELinux拦掉。 iptables或firewalld也可能挡。不过出站流量默认通常是放行的,除非有人手动加了OUTPUT链的DROP规则。 宿主机挂了代理软件,虚拟机不一定自动继承。NAT模式下,虚拟机流量走宿主机网络栈,但代理是应用层的东西,不会自动生效。如果宿主机靠代理上网,虚拟机里得单独配代理,或者把代理软件设成TUN模式(透明代理),让虚拟机的流量也被接管。 DVWA的PHP代码里如果没走代理, 别急着改DVWA代码。先在虚拟机终端里执行: 看输出。如果卡在"Trying xxx.xxx.xxx.xxx...",是网络层不通。如果返回301或200,网络没问题,问题在PHP配置。如果提示"Could not resolve host",是DNS问题。 然后写个 浏览器访问这个文件,看输出。 这套流程走下来,基本十分钟内能定位到具体原因。虚拟机网络就那几种模式,DVWA的URL包含功能也就依赖那几个PHP配置,交叉排查,没有玄学。http://192.168.1.100/dvwa一切正常。虚拟但DVWA里那个"Allow URL include"的机里功能,填个http://www.baidu.com,登的网页面直接报错或者空白。为什外面你以为是虚拟DVWA的bug,重装了三遍,机里还是登的网不行。file_get_contents()或curl要去访问外网,走的登的网是虚拟机的网络栈。虚拟机的为什外面网络能不能通外网,取决于你选了哪种网络模式。虚拟NAT模式下,机里出得去,但有个坑
ping baidu.com能通,curl http://www.baidu.com也能拿到HTML。按理说DVWA应该也能访问。ping通,curl通,DVWA就是不行。查了半天,发现是PHP的allow_url_fopen被关了。php.ini里默认allow_url_fopen = Off,DVWA的URL包含功能直接失效。改成On,重启Apache,问题解决。Host-Only模式:物理隔离,想都别想
ping 8.8.8.8直接返回"Destination Host Unreachable"。route -n看一眼,如果默认网关是Host-Only那块网卡的网段,外网流量出不去。手动调整路由表或者把Host-Only网卡的网关删掉。桥接模式:看似最直接,实则最容易出问题
192.168.1.x的IP,网关192.168.1.1,但ping 192.168.1.1通,ping 8.8.8.8不通。原因是路由器做了IP-MAC绑定,虚拟机的MAC没注册,路由器不转发它的数据包。换成NAT模式立刻正常。DNS问题经常被忽略
http://www.example.com。虚拟机ping 8.8.8.8通,但ping www.example.com失败。这是DNS没配好。检查/etc/resolv.conf,看看有没有nameserver条目。NAT模式下VMware会自动注入DNS,但有时候会抽风。nameserver 8.8.8.8,再试。如果还不行,检查/etc/nsswitch.conf里hosts那一行有没有dns。防火墙和SELinux
getenforce看一下,如果是Enforcing,临时设成Permissive测试。如果问题消失,说明是SELinux策略问题,需要针对性放行,而不是直接关掉。代理设置
file_get_contents直连外网,在需要代理的环境里必然超时。怎么快速定位
curl -v http://www.baidu.comtest.php放到DVWA目录下:<?php var_dump(ini_get('allow_url_fopen')); var_dump(file_get_contents('http://www.baidu.com')); ?>allow_url_fopen是空字符串或者0,就是PHP配置问题。如果报"Connection refused"或"Network unreachable",回到网络层排查。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-