
1. 能ping通却telnet不通先把问题定位到正确的层又遇到一台Linux机器ping得通telnet端口就是连不上。这个场景我在自己维护的测试机、云主机、虚拟机里都碰过尤其是刚装完系统、刚部署完服务、刚改过网络配置的时候最容易出现“看着网络是通的业务端口就是访问不了”的错觉。很多人第一反应是网络断了但ping能通恰恰说明IP层大概率没问题。真正要处理的是Linux开放指定端口这件事服务有没有监听、监听在哪个地址、防火墙有没有放行、云平台安全组有没有开口、中间链路有没有拦截。标题里说的端口无法访问、可以ping通、telnet不通本质上就是“ICMP能过TCP没通”的典型症状。这篇内容我按一线排障的顺序来写不堆理论重点放在可复现的命令、判断依据和踩坑经验上。不管你是刚接触Linux的新手还是已经能背出linux常用命令大全但遇到端口问题仍然容易绕弯的人都可以直接照着做。读完之后你至少能做到三件事第一知道ping通和telnet通分别代表什么第二会用firewalld、iptables、ufw这些工具开放指定端口第三遇到端口无法访问时能按层次快速定位而不是到处重启服务。1.1 ping和telnet测的根本不是一回事先把最核心的概念掰开。ping命令走的是ICMP协议它关心的是“目标IP能不能返回ICMP回包”。你ping一台Linux服务器看到64 bytes from 192.168.1.100: icmp_seq1 ttl64 time0.3 ms只能说明从你的机器到目标IP这一层路由可达、目标网卡有响应、中间没有完全把ICMP掐掉。它不代表目标机器的TCP 22、80、3306、8080任何一个端口是开放的。telnet命令在这里通常被当成“端口测试工具”来用比如telnet 192.168.1.100 8080。它实际做的是尝试与目标IP的TCP 8080端口建立三次握手。如果握手成功你会看到Connected to 192.168.1.100.这时哪怕服务返回一堆乱码或者什么都不返回也说明TCP端口是通的。如果握手失败可能出现几种情况Connection refused通常表示目标端口没有服务监听或者防火墙主动拒绝Connection timed out或一直卡在Trying 192.168.1.100...通常是防火墙丢弃了包或者中间网络设备没有回包No route to host则更偏向路由、ARP、网段问题。用生活里的场景类比ping像是你走到一栋楼下喊了一声楼里有人应了证明楼存在、有人。telnet像是你走到某个具体房门前拧门把手门能不能开取决于房间里有没有人、门锁有没有被管理员锁上、楼道门禁有没有放你进来。楼里有人应声不代表房间门一定开着。所以“可以ping通telnet不通”并不矛盾它只是说明你测的是不同层。1.2 端口无法访问最常见的六个卡点我把实际排障中遇到的端口无法访问问题归成六类前四类占了绝大多数。你可以先对照表格判断自己更像哪一种然后再往下看具体命令。卡点层次典型现象常见原因优先检查服务监听本机telnet 127.0.0.1通本机IP不通服务只绑定127.0.0.1ss -lntp看监听地址本机防火墙本机IP通远程不通firewalld、iptables、ufw未放行firewall-cmd --list-all等云平台安全组内网通公网不通入方向规则没有放行端口云控制台安全组中间网络同网段通跨网段不通路由器、NAT、公司防火墙限制分段测试SELinux/AppArmor防火墙已放行仍不通安全模块限制端口标签getenforce、aa-status应用配置端口通但业务异常协议不匹配、绑定IPv6、端口冲突curl -v、查看日志这张表不是让你一次性全查而是让你知道“不通”可能发生在哪一层。很多新手容易犯的错是一看到telnet不通就去关防火墙结果关了还是不通因为服务压根没监听。也有人服务监听正常防火墙也开了但云安全组没放行于是反复怀疑Linux系统有问题。分层排查的意义就是避免这种无效动作。1.3 一条从内到外的排查主线我自己的习惯是从目标机器内部往外查顺序是先看服务监听再从本机回环地址测再从本机真实IP测再从同网段另一台机器测最后从远程机器测同时检查本机防火墙和云安全组。这个顺序的好处是每一步只引入一个变量不会把“服务没起”和“防火墙没开”混在一起。具体动作可以简化成下面这条线# 1. 在目标Linux上查看端口监听 ss -lntp | grep 8080 # 2. 本机回环测试 telnet 127.0.0.1 8080 # 3. 本机真实IP测试 ip addr show telnet 192.168.1.100 8080 # 4. 同网段另一台机器测试 telnet 192.168.1.100 8080 # 5. 远程机器测试 telnet 公网IP或跨网段IP 8080如果第1步就看不到监听别急着碰防火墙先解决服务启动和绑定地址。如果第2步通、第3步不通八成是服务只监听了127.0.0.1。如果第3步通、第4步不通重点看本机防火墙。如果第4步通、第5步不通重点看云安全组、边界防火墙、NAT映射和中间网络策略。这条线跑一遍问题基本就圈定在一到两个点上。2. Linux开放指定端口的标准操作firewalld、iptables、ufw、nftables确认服务已经监听之后下一步才是Linux开放指定端口。这里最容易乱的地方是不同发行版、不同版本用的防火墙前端不一样有的机器上firewalld和iptables同时存在有的Ubuntu默认用ufw有的新系统底层已经是nftables。你如果只记住一条命令换一台机器就可能不生效。我下面按常见工具分别说清楚同时解释为什么这么操作。2.1 先确认服务监听地址0.0.0.0和127.0.0.1差别很大开放端口之前一定先看服务到底监听在哪个地址。命令首选ss老系统可以用netstat查进程可以用lsof。ss -lntp | grep 8080输出里重点看两列Local Address和Process。如果看到127.0.0.1:8080说明这个端口只允许本机访问外部机器即使防火墙全开也连不上。如果看到0.0.0.0:8080说明监听在所有IPv4网卡上。如果看到[::]:8080通常是IPv6监听很多程序会同时兼容IPv4。如果看到192.168.1.100:8080说明只监听指定网卡地址换一个网卡地址访问就不通。很多服务默认为了安全只监听本机比如MySQL的bind-address 127.0.0.1、Redis的bind 127.0.0.1、Nginx的listen 127.0.0.1:80、Tomcat的address127.0.0.1。你要对外开放就必须改配置文件把监听地址改成0.0.0.0或具体的内网IP然后重启服务。这里有个实操心得不要为了图省事直接把所有服务都改成0.0.0.0尤其是数据库和缓存服务。正确做法是绑定内网IP再配合防火墙只允许业务机器访问。2.2 firewalld开放端口CentOS、RHEL、Fedora系最常用CentOS 7以后、RHEL 7以后、Fedora默认用firewalld。它的核心概念是zone网卡会绑定到某个zone规则要加到对应zone才生效。很多人命令执行成功但端口还是不通就是因为规则加到了默认zone而网卡实际在另一个zone。先看状态和活动zonefirewall-cmd --state firewall-cmd --get-active-zones firewall-cmd --get-default-zone firewall-cmd --list-all如果--state返回running说明firewalld在跑。--get-active-zones会显示类似public interfaces: eth0这表示eth0在public zone。接下来开放8080端口# 临时开放重启firewalld后失效适合测试 firewall-cmd --add-port8080/tcp # 永久开放需要reload后生效 firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload # 查询是否放行 firewall-cmd --query-port8080/tcp firewall-cmd --list-ports如果你只想允许某个网段访问比如只允许192.168.1.0/24可以用rich rulefirewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.0/24 port protocoltcp port8080 accept firewall-cmd --reload firewall-cmd --list-rich-rules为什么推荐永久规则加reload因为临时规则只在当前运行时生效机器重启或firewalld重启就没了。测试阶段可以先用临时规则确认没问题后再换成永久规则。注意--permanent本身不会立即生效必须--reload或--complete-reload。这是新手最容易漏的一步。2.3 iptables开放端口老系统、容器和云镜像里仍然常见iptables虽然在新系统里逐渐被nftables替代但很多老机器、容器环境、定制镜像还在用它。iptables的规则是有顺序的匹配到第一条符合条件的规则就停止所以插入位置非常关键。先看现有规则iptables -L -n --line-numbers iptables -t nat -L -n --line-numbers如果INPUT链里已经有DROP或REJECT规则你后面追加ACCEPT可能不生效。正确做法是插到前面或者插到对应位置# 在INPUT链第1条位置插入允许8080/tcp的规则 iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT # 查看规则编号 iptables -L INPUT -n --line-numbers # 保存规则不同发行版保存方式不同 service iptables save # 或者 iptables-save /etc/iptables/rules.v4如果你用的是Ubuntu/Debian且安装了iptables-persistent保存命令通常是netfilter-persistent save。这里有一个非常重要的注意事项不要在SSH会话里直接执行iptables -F或者把INPUT默认策略改成DROP除非你已经确认允许了SSH端口并且有控制台兜底。我见过有人远程清空规则结果自己也被挡在外面只能去云控制台开VNC。规则顺序还可以用-A追加但如果前面有拒绝规则就必须用-I插入到前面。另外Docker会自己往iptables里写规则有时候你明明在INPUT放行了端口Docker发布的容器端口还是不通或者反过来宿主防火墙没放行但Docker映射端口却通了。原因是Docker在nat表和filter表的DOCKER链里做了转发。遇到Docker端口问题可以在DOCKER-USER链里加规则而不是只改INPUT。2.4 ufw开放端口Ubuntu、Debian上手快但别忽略默认策略Ubuntu和Debian上常见的是ufw它是iptables/nftables的前端命令简单但默认策略如果不看容易误判。先看状态ufw status verbose如果显示Status: inactive说明ufw没启用端口不通可能不是它造成的。启用之前一定先允许SSH否则可能断连ufw allow 22/tcp ufw enable开放8080端口ufw allow 8080/tcp ufw allow from 192.168.1.0/24 to any port 8080 proto tcp ufw status numbered删除规则可以按编号ufw delete allow 8080/tcp # 或者 ufw delete 编号 ufw reloadufw的好处是命令直观但要注意它和iptables规则可能混在一起。如果你同时手动改iptables又用ufw排查会很乱。我的建议是系统用哪个前端就尽量用哪个前端管理不要两套同时写。ufw的规则默认会持久化重启后仍然生效这一点比临时iptables命令省心。2.5 nftables和底层关系别只看前端命令新版Debian、Ubuntu、CentOS Stream、RHEL 9等系统底层已经是nftables。firewalld和ufw很多情况下只是前端真正生效的是nft规则。你可以用下面的命令查看底层规则nft list ruleset如果前端显示放行了但nft list ruleset里看不到对应规则或者有别的规则先拒绝就要考虑是不是规则没生效。一般不建议在firewalld或ufw正在运行时直接手写nft规则因为前端重载时可能覆盖你的规则。如果必须用nftables可以这样临时测试nft add rule inet filter input tcp dport 8080 accept nft list ruleset持久化nftables规则在不同发行版里配置文件不一样常见是/etc/nftables.conf。这里的原则和iptables一样先确认自己用的是哪套再操作。混用工具是端口排障里非常隐蔽的坑。2.6 SELinux和AppArmor防火墙放行了端口也可能被拦有些系统上防火墙已经放行服务也监听了0.0.0.0但外部访问还是不通尤其是HTTP、HTTPS相关端口换成非标准端口时。这时候要怀疑SELinux。CentOS/RHEL默认可能开启SELinux它会给端口打标签服务只能绑定允许的端口。getenforce semanage port -l | grep http_port_t如果8080不在允许列表里可以添加semanage port -a -t http_port_t -p tcp 8080 semanage port -l | grep 8080如果只是临时验证可以setenforce 0但这只能作为排障手段不能作为长期方案。长期关闭SELinux会降低系统安全基线。AppArmor在Ubuntu上常见可以用aa-status查看。虽然AppArmor更多限制文件访问但某些服务配置也可能受影响。遇到“防火墙明明开了还是不通”的情况把SELinux和AppArmor纳入检查清单能省很多时间。2.7 云平台安全组和网络ACLLinux之外的必查项如果是云主机Linux内部防火墙只是第一道门云平台安全组是第二道门。安全组通常作用于实例网卡控制入方向和出方向。很多人只检查了Linux里的firewalld却忘了安全组没有放行8080结果自然是telnet不通。检查安全组时重点看入方向是否允许TCP 8080源IP是0.0.0.0/0还是你的办公网IP协议类型是否选对端口范围是否写对规则是否绑定到了正确的实例。有些云平台还有网络ACL它是子网级别的无状态需要分别配置入站和出站。安全组通常有状态入方向放行后返回流量自动允许网络ACL则可能要显式放行出站。如果你用的是NAT网关或负载均衡还要确认后端端口和健康检查端口是否一致。公网IP如果是弹性IP映射不要在Linux里找这个公网IP它通常不在网卡上。3. 实操开放8080端口从本机到远程完整验证前面讲了工具和原理这一章用一个完整例子串起来。假设你有一台CentOS或Ubuntu虚拟机内网IP是192.168.1.100你要对外开放8080端口并用另一台机器192.168.1.200测试。这个例子可以直接复制到测试环境复现。3.1 准备一个测试服务为了避免依赖复杂应用先用Python起一个简单HTTP服务。大多数Linux自带Python3python3 -m http.server 8080 --bind 0.0.0.0这个命令会在所有网卡的8080端口启动一个HTTP文件服务当前目录作为根目录。它只适合测试不要用在生产环境。启动后不要关闭终端另开一个SSH窗口执行后续命令。如果你没有Python3可以用nc临时监听但nc版本差异大还是Python更直观。# 确认服务进程 ps -ef | grep http.server3.2 查看监听并做本机验证在目标机器上执行ss -lntp | grep 8080预期看到类似LISTEN 0 5 0.0.0.0:8080 0.0.0.0:* users:((python3,pid1234,fd3))。如果看到的是127.0.0.1:8080说明--bind 0.0.0.0没生效或者被其他配置覆盖。接着做本机验证curl -I http://127.0.0.1:8080 curl -I http://192.168.1.100:8080如果第一个通、第二个不通回到监听地址检查。如果两个都通说明服务和本机防火墙至少对lo和本机IP放行了。注意有些系统本机访问自己的真实IP不经过INPUT链所以本机IP通不代表远程一定通。还需要从另一台机器测。3.3 放行本机防火墙根据系统选择命令。CentOS/RHEL系firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload firewall-cmd --query-port8080/tcpUbuntu/Debian系ufw allow 8080/tcp ufw status verbose使用iptables的系统iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT iptables -L INPUT -n --line-numbers iptables-save /etc/iptables/rules.v4做完之后再在本机执行telnet 192.168.1.100 8080应该能看到Connected。如果仍不通先看防火墙规则是否真的加对了zone或链。firewalld用--list-allufw用status verboseiptables用-L -n --line-numbers。3.4 从另一台机器远程验证登录192.168.1.200执行telnet 192.168.1.100 8080如果显示Connected to 192.168.1.100.说明TCP层通了。按Ctrl]再输入quit退出。也可以用ncnc -vz 192.168.1.100 8080输出Connection to 192.168.1.100 8080 port [tcp/*] succeeded!就说明端口开放。HTTP服务还可以用curl验证curl -v http://192.168.1.100:8080如果curl返回目录列表或HTML说明应用层也正常。如果telnet不通看报错是Connection refused还是timed out。refused优先查服务监听和REJECT规则timed out优先查DROP规则、云安全组和中间网络。3.5 参数选择协议、来源、端口范围怎么定开放端口时不要无脑写0.0.0.0/0。先问三个问题这个服务给谁用走TCP还是UDP需要开放单个端口还是范围TCP和UDP要分清。Web、SSH、MySQL、Redis、Tomcat默认都是TCP。DNS、NTP、部分游戏和视频流可能用UDP。你如果只放行TCPUDP服务照样不通。firewalld里写8080/tcp和8080/udp是两条规则。iptables里要用-p tcp或-p udp。ufw里默认ufw allow 8080通常只放TCP要显式写ufw allow 8080/udp。来源限制能大幅降低风险。比如只允许办公网访问firewall-cmd --permanent --add-rich-rulerule familyipv4 source address203.0.113.0/24 port protocoltcp port8080 acceptiptables可以写成iptables -I INPUT 1 -p tcp -s 203.0.113.0/24 --dport 8080 -j ACCEPT端口范围适合批量服务firewall-cmd --permanent --add-port8000-8080/tcp但范围不要开太大比如1-65535/tcp等于把机器所有TCP端口都暴露出去。数据库端口3306、Redis 6379、Elasticsearch 9200这类服务尽量不要直接对公网开放。如果只是自己临时访问可以用SSH端口转发把远程端口映射到本地避免在防火墙上长期开口用完就关。3.6 持久化、验证和回滚规则改完要确认重启后还在。firewalld永久规则会保存在配置里reload后生效。iptables要保存到持久化文件或安装持久化工具。ufw规则自动保存。验证时不要只看命令返回要看实际连通性。回滚命令也要提前准备# firewalld删除端口 firewall-cmd --permanent --remove-port8080/tcp firewall-cmd --reload # ufw删除规则 ufw delete allow 8080/tcp ufw reload # iptables删除规则先查编号再删 iptables -L INPUT -n --line-numbers iptables -D INPUT 编号我自己的习惯是每次变更前先记录当前规则到文件比如iptables-save /tmp/iptables.bak.$(date %F)firewalld可以firewall-cmd --list-all /tmp/firewalld.bak。出问题时能快速对比。云安全组变更也要截图或记下规则ID避免忘了改过什么。4. 常见问题排查实录ping通但telnet不通的典型场景这一章按现象分类几乎覆盖我遇到过的所有“可以ping通telnet不通”的情况。你可以把它当成速查表根据报错和测试位置直接跳到对应小节。4.1 telnet命令没装或者用法错误先确认测试端有没有telnet。CentOS/RHELyum install telnet -yUbuntu/Debianapt install telnet -yWindows默认可能没启用Telnet客户端可以在“启用或关闭Windows功能”里勾选。用法是telnet IP 端口不是telnet IP:端口也不是telnet 端口 IP。很多人写成telnet 192.168.1.100:8080结果报错还以为是端口问题。PowerShell可以用Test-NetConnection 192.168.1.100 -Port 8080Linux上除了telnet还可以用nc -vz、curl -v、nmap -p 8080仅在自己有权限的机器上做测试。如果telnet后一直显示Trying 192.168.1.100...没有任何返回过很久才超时这通常是包被丢弃重点查防火墙DROP规则、云安全组和中间设备。如果立刻返回Connection refused说明包到达了目标机器但目标端口没有监听或者防火墙主动REJECT。这个区分非常重要能帮你少查一半方向。4.2 服务只监听127.0.0.1这是最常见的原因之一。现象很典型在目标机器上telnet 127.0.0.1 8080能连上telnet 192.168.1.100 8080连不上。很多应用默认只监听本机比如开发环境里的Web服务、数据库、缓存。解决方法就是改配置文件里的监听地址。Nginx可以检查/etc/nginx/nginx.conf和站点配置里的listen 127.0.0.1:80;。MySQL检查/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf里的bind-address 127.0.0.1。Redis检查redis.conf里的bind 127.0.0.1和protected-mode。Tomcat检查server.xml里的address127.0.0.1。Spring Boot可以用server.address0.0.0.0。改完一定重启服务再用ss -lntp确认监听地址变成了0.0.0.0或内网IP。4.3 防火墙规则顺序和zone问题firewalld的zone问题很隐蔽。比如你有eth0和eth1eth0在publiceth1在trusted你把规则加到public但业务走eth1结果就不生效。用firewall-cmd --get-active-zones看清接口和zone的对应关系。iptables的规则顺序问题更直接。如果INPUT链是这样的1 DROP all -- 0.0.0.0/0 0.0.0.0/0 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080那么第二条永远不会被匹配因为第一条已经DROP了。正确做法是把ACCEPT插到DROP前面或者调整编号。iptables -I INPUT 1就是插到最前面。改完用iptables -L INPUT -n --line-numbers确认顺序。4.4 云安全组、网络ACL和NAT映射云主机上“内网能通、公网不通”非常常见。内网机器访问走安全组内网规则公网访问还要看入方向规则是否允许你的公网IP。检查时候注意安全组规则的方向是入方向还是出方向协议是TCP还是全部端口范围是8080还是8080-8080源地址是你的公网IP还是0.0.0.0/0规则有没有绑定到目标实例实例是否有多块网卡规则绑到了哪块。网络ACL如果开启要同时看入站和出站。NAT映射也要确认外部端口、内部端口、内部IP是否写对。有些家用路由器也做端口映射外部端口和内部端口不一致时测试要用外部端口。如果你从公司网络访问公司出口防火墙可能只允许80、443等常用端口非标准端口会被拦。这种情况换一个网络环境测试比如用手机热点注意合规使用自己有权访问的资源就能快速判断。4.5 端口占用、服务启动失败和IPv6绑定有时候服务没起来但你以为它起来了。先看进程和日志systemctl status 服务名 journalctl -u 服务名 -n 100 ss -lntp | grep 8080如果日志里出现Address already in use说明端口被别的进程占用。用ss -lntp找到PID再决定是杀掉旧进程还是改端口。还有一种情况是服务绑定了IPv6地址IPv4客户端访问不到。ss -lntp看到[::]:8080时大多数系统默认也接受IPv4映射但某些程序设置IPV6_V6ONLY后只接受IPv6。遇到这种可以显式绑定0.0.0.0:8080或者同时监听两个地址。4.6 中间网络设备与链路限制跨网段访问时中间可能经过路由器、防火墙、负载均衡、NAT设备。ping通只说明ICMP被允许TCP 8080可能被单独拦截。排查方法是在路径上分段测试同网段机器互测、跨网段机器互测、经过边界防火墙后再测。如果同网段通、跨网段不通重点查路由和中间策略。如果一会儿通一会儿不通可能是负载均衡后端健康检查不一致或者多台后端只有一台开了端口。用traceroute看路径用mtr看丢包但不要对没有权限的目标做扫描。4.7 应用层协议不匹配导致误判最后一种不是端口不通而是你以为不通。telnet只负责建立TCP连接不负责理解应用协议。很多服务不是文本协议比如HTTPS、MySQL、Redis有认证、gRPCtelnet连上后可能没有任何输出或者返回乱码。这时候只要看到Connected就说明TCP端口是通的。要验证应用层应该用对应客户端HTTPS用curl -vk https://IP:端口MySQL用mysql -h IP -P 3306 -u用户 -pRedis用redis-cli -h IP -p 6379。不要因为telnet没有回显就判断端口不通。5. 避坑经验与常用命令速查排障到最后命令本身不难难的是顺序、判断和胆量。尤其是改防火墙手一抖就可能把自己关在门外。这一章我把自己踩过的坑和常用的命令整理出来方便你直接抄作业。5.1 改防火墙前先留下后路远程SSH会话里改防火墙永远先确保22端口是通的。firewalld可以先把SSH服务放行firewall-cmd --permanent --add-servicessh firewall-cmd --reloadufw先执行ufw allow 22/tcp再ufw enable。iptables不要直接iptables -F也不要把默认策略改成DROP而不加任何ACCEPT规则。我的做法是开启第二个SSH会话保持连接改完规则后在新会话里测试登录确认没问题再关旧会话。如果是云主机确认控制台VNC可用。如果必须批量改先在测试机验证再上生产。5.2 生产环境开放端口的最小权限原则能限定源IP就限定源IP能走内网就走内网能不用公网端口就别用。数据库、缓存、消息队列、管理后台尽量不要直接暴露到公网。如果必须临时开放用完立刻删除规则。端口范围能写单端口就不要写大范围。协议能写TCP就不要用ALL。定期用firewall-cmd --list-all、iptables -L -n、ufw status审计规则清理不再使用的放行项。这里再分享一个我常做的动作每次开放端口后先在本机curl或telnet 127.0.0.1再从同网段机器测最后从远程测。这样如果出问题一眼就能看出是服务层、系统防火墙层还是平台网络层。比如127.0.0.1通、本机IP不通直接看监听地址本机IP通、同网段不通直接看防火墙同网段通、远程不通直接看云安全组和中间设备。顺序对了排障时间至少省一半。5.3 常用命令速查表用途命令查看TCP监听ss -lntp查看所有监听ss -lntup查看端口占用lsof -i:8080查看firewalld规则firewall-cmd --list-all永久开放TCP端口firewall-cmd --permanent --add-port8080/tcp重载firewalldfirewall-cmd --reload查看iptables规则iptables -L -n --line-numbers插入ACCEPT规则iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT保存iptablesiptables-save /etc/iptables/rules.v4查看ufw状态ufw status verboseufw放行TCPufw allow 8080/tcptelnet测端口telnet IP 端口nc测端口nc -vz IP 端口curl测HTTPcurl -v http://IP:端口查看SELinuxgetenforce添加SELinux端口semanage port -a -t http_port_t -p tcp 80805.4 我的排查顺序和判断技巧最后把判断技巧压成几条经验。第一Connection refused优先查服务监听和REJECT规则timed out优先查DROP规则、安全组和中间网络。第二本机回环通、本机IP不通先查监听地址本机IP通、同网段不通先查本机防火墙同网段通、远程不通先查云安全组和边界网络。第三防火墙放行后一定reload或保存不要只看命令返回成功。第四Docker环境别忽略DOCKER-USER链和nat表。第五SELinux开启时非标准端口要打标签。第六telnet只测TCP不测应用协议连上后没回显不代表服务有问题。这几条不是理论是我一次次从“ping通但telnet不通”里磨出来的。你把顺序固定下来再遇到Linux开放指定端口的问题基本不会像无头苍蝇一样乱撞。