Azure环境中部分公网端口访问出现连接拒绝问题
排查CentOS虚拟机80端口无法从互联网访问的问题
碰到这种SSH能通但Web端口连不上的情况,大概率是某个环节的配置没跟上,咱们一步步来排查:
1. 先盯紧NSG入站规则的细节
NSG规则的优先级和匹配逻辑很关键,别小看这些细节:
- 优先级是否合理:NSG是按优先级数字从小到大执行的(数字越小越先生效)。你的Allow 80规则优先级得比默认的
DenyAllInbound(优先级65500)高,而且要确保没有其他优先级更高的Deny规则把80端口的流量拦了。比如把你的80端口规则设成100左右就很稳妥。 - 源/目标配置是否正确:源地址是不是设成了
0.0.0.0/0(允许所有互联网访问)?别不小心设成了特定IP段,导致你的本地机器不在范围内。目标端口要准确选80,协议选TCP,别选错成UDP了。 - 双NSG关联的冲突:你同时把NSG关联到了VNET和VM的NIC,这两个层级的NSG规则都会生效——流量得同时通过VNET NSG和NIC NSG的放行,只要其中一个有Deny 80的规则,就会被拦。所以两个NSG都要检查一遍。
2. 检查CentOS本地防火墙(最容易忽略的点)
CentOS默认会开firewalld,哪怕NSG放行了,本地防火墙没开80端口照样会拒绝连接:
- 先看firewalld状态:
sudo systemctl status firewalld,要是显示active,就得接着检查端口权限。 - 查看已开放的端口/服务:
sudo firewall-cmd --list-all,看看services里有没有http,或者ports里有没有80/tcp。 - 要是没开放,就加上规则:
sudo firewall-cmd --add-service=http --permanent(或者直接加端口sudo firewall-cmd --add-port=80/tcp --permanent),然后重启firewalld生效:sudo firewall-cmd --reload。 - 如果你用的是老版本的iptables,就用
sudo iptables -L -n检查规则,确保INPUT链里有允许80端口TCP流量的条目。没有的话加一条:sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT,然后用sudo service iptables save保存规则。
3. 确认Web服务本身是否正常运行并监听80端口
服务没起来或者只监听本地回环,那肯定连不上:
- 先查服务状态:比如Apache用
sudo systemctl status httpd,Nginx用sudo systemctl status nginx,看是不是显示active (running)。要是没启动,先启动服务:sudo systemctl start httpd/nginx,顺便设成开机自启:sudo systemctl enable httpd/nginx。 - 检查端口监听情况:
sudo ss -tulpn | grep :80,重点看是不是监听0.0.0.0:80(允许所有网卡访问),而不是只监听127.0.0.1:80(只能本地访问)。如果是后者,得改Web服务的配置文件:比如Apache的httpd.conf里把Listen改成Listen 0.0.0.0:80,Nginx的nginx.conf里把server块的listen改成listen 80;,改完重启服务。
4. 做个本地连通性测试,缩小问题范围
- 在VM本地用
curl http://localhost:80测试,要是能拿到Web页面内容,说明服务本身没问题,问题肯定出在网络层面(NSG、本地防火墙或者公网IP配置)。 - 从你的本地机器(能SSH到VM的那台)用
telnet <VM公网IP> 80或者nc -zv <VM公网IP> 80测试端口,要是显示连接拒绝,就回到前面的步骤排查NSG和本地防火墙。
5. 最后确认公网IP和路由配置
- 检查VM的公网IP是不是正确绑定到了对应的NIC,别不小心解绑了或者配错了IP。
- 看看VNET的路由表:有没有自定义路由规则把80端口的流量导去了别的地方(比如NAT网关),导致流量到不了VM。默认路由表是允许流量直接到公网IP对应的VM的,除非你加了自定义路由干扰。
按这个顺序排查下来,基本上就能找到问题所在啦~
内容的提问来源于stack exchange,提问作者Dieter Bauwens
相关产品推荐
相关产品推荐

