为什么虚拟机里面dvwa登录不了外面的网址

作者:探索 来源:知识 浏览: 【大 中 小】 发布时间:2026-10-17 06:23:05 评论数:

你在VMware里装好DVWA,为什外面浏览器打开http://192.168.1.100/dvwa一切正常。虚拟但DVWA里那个"Allow URL include"的机里功能,填个http://www.baidu.com,登的网页面直接报错或者空白。为什外面你以为是虚拟DVWA的bug,重装了三遍,机里还是登的网不行。

问题不在DVWA。为什外面DVWA的虚拟PHP进程在虚拟机里跑,它的机里file_get_contents()或curl要去访问外网,走的登的网是虚拟机的网络栈。虚拟机的为什外面网络能不能通外网,取决于你选了哪种网络模式。虚拟

NAT模式下,机里出得去,但有个坑

VMware默认用NAT。虚拟机通过宿主机的IP做地址转换,访问外网没问题。你在虚拟机里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,问题解决。

这个坑很隐蔽。你在命令行测试一切正常,但PHP有自己的配置,跟系统网络是两回事。

Host-Only模式:物理隔离,想都别想

如果你选了Host-Only,虚拟机只能跟宿主机通信,连路由器都碰不到。这种模式下,DVWA访问外网URL必然失败。ping 8.8.8.8直接返回"Destination Host Unreachable"。

有人会问:那我加个NAT网卡不就行了?可以,但要注意路由优先级。虚拟机里有两块网卡时,默认路由指向哪块,流量就走哪块。route -n看一眼,如果默认网关是Host-Only那块网卡的网段,外网流量出不去。手动调整路由表或者把Host-Only网卡的网关删掉。

桥接模式:看似最直接,实则最容易出问题

桥接模式下,虚拟机相当于局域网里一台独立机器,直接找路由器要IP。理论上访问外网最顺畅。但实际环境中,公司网络或者校园网经常做MAC地址过滤,虚拟机的虚拟网卡MAC不在白名单里,DHCP拿不到IP,或者拿到了但网关不给你转发。

我见过一个案例:桥接模式下虚拟机拿到了192.168.1.x的IP,网关192.168.1.1,但ping 192.168.1.1通,ping 8.8.8.8不通。原因是路由器做了IP-MAC绑定,虚拟机的MAC没注册,路由器不转发它的数据包。换成NAT模式立刻正常。

DNS问题经常被忽略

DVWA里填的是域名而不是IP,比如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

CentOS或RHEL系虚拟机,SELinux默认开启。Apache发起的外网HTTP请求可能被SELinux拦掉。getenforce看一下,如果是Enforcing,临时设成Permissive测试。如果问题消失,说明是SELinux策略问题,需要针对性放行,而不是直接关掉。

iptables或firewalld也可能挡。不过出站流量默认通常是放行的,除非有人手动加了OUTPUT链的DROP规则。

代理设置

宿主机挂了代理软件,虚拟机不一定自动继承。NAT模式下,虚拟机流量走宿主机网络栈,但代理是应用层的东西,不会自动生效。如果宿主机靠代理上网,虚拟机里得单独配代理,或者把代理软件设成TUN模式(透明代理),让虚拟机的流量也被接管。

DVWA的PHP代码里如果没走代理,file_get_contents直连外网,在需要代理的环境里必然超时。

怎么快速定位

别急着改DVWA代码。先在虚拟机终端里执行:

curl -v http://www.baidu.com

看输出。如果卡在"Trying xxx.xxx.xxx.xxx...",是网络层不通。如果返回301或200,网络没问题,问题在PHP配置。如果提示"Could not resolve host",是DNS问题。

然后写个test.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",回到网络层排查。

这套流程走下来,基本十分钟内能定位到具体原因。虚拟机网络就那几种模式,DVWA的URL包含功能也就依赖那几个PHP配置,交叉排查,没有玄学。