在 CentOS 7 的使用和维护过程中,网络连接问题是系统管理员和开发者经常遇到的挑战之一,一个令人困惑的错误代码便是“10065”,虽然在 Windows 系统中这个错误代码(WSAECONNREFUSED)更为人熟知,但在跨平台应用或特定网络环境下,在 CentOS 7 上也可能遇到类似或直接报告的错误,这个错误的核心含义是“连接被拒绝”,它表明客户端成功地将请求发送到了服务器,但服务器主动拒绝了该连接请求,这与“连接超时”或“主机不可达”有着本质的区别,后者通常指向网络路径问题或服务器宕机,理解这一点是排查问题的关键。

错误 10065 的核心含义
当您看到与 10065 相关的错误信息时,首先要明确:网络本身是通的,您的客户端能够找到服务器的 IP 地址,并且数据包能够到达服务器,问题出在服务器端,它有一个“守门员”在门口,明确地对您说“不行,你不能进来”,这个“守门人”可能是防火墙,也可能是服务本身的配置,甚至是更深层次的安全策略,排查的重点应始终放在服务器端,而非客户端或中间网络设备。
常见原因与排查思路
要解决“连接被拒绝”的问题,我们需要系统化地检查服务器端的几个关键层面,以下是从最常见到相对少见的排查顺序。
防火墙阻拦
这是导致连接被拒绝的首要原因,CentOS 7 默认使用 firewalld 作为防火墙管理工具,如果目标端口没有在防火墙中开放,外部连接请求就会被直接丢弃,客户端收到的就是“连接被拒绝”的信号。
排查步骤:
- 检查防火墙状态: 使用命令 
systemctl status firewalld查看firewalld是否正在运行,如果显示active (running),则防火墙已启用。 - 查看已开放的端口: 使用 
firewall-cmd --list-all命令,查看当前区域(通常是public)已开放的端口和服务,确认您要连接的端口(如 80, 443, 3306, 22 等)是否在列表中。 - 临时开放端口进行测试: 如果端口未开放,可以临时添加一个端口来验证是否是防火墙问题,临时开放 TCP 8080 端口:
firewall-cmd --add-port=8080/tcp,如果测试成功,记得永久添加并重新加载配置:firewall-cmd --add-port=8080/tcp --permanent和firewall-cmd --reload。 
目标服务未运行或未监听
如果防火墙配置正确,下一个要检查的就是目标服务本身,如果服务没有启动,或者没有监听在任何网络接口上,那么连接请求自然无法被处理。
排查步骤:

- 检查服务状态: 使用 
systemctl status <service_name>(systemctl status httpd或systemctl status nginx)来确认服务是否处于active (running)状态。 - 检查端口监听情况: 这是至关重要的一步,使用 
ss -tulnp或netstat -tulnp命令可以查看系统当前所有监听的端口。t表示 TCP,u表示 UDP,l表示监听状态,n表示以数字形式显示地址和端口,p显示进程名。- 在输出中找到您要连接的端口,重点关注它监听的地址,如果地址是 
0.0.1或:1,表示服务只监听本地回环地址,仅允许本机访问,外部客户端无法连接,您需要修改服务的配置文件(如 Nginx 的nginx.conf或 MySQL 的my.cnf),将监听地址改为0.0.0(表示监听所有可用的网络接口)或具体的服务器 IP 地址,然后重启服务。 
 
SELinux 安全策略
CentOS 7 默认启用了 SELinux(Security-Enhanced Linux),它是一个强制访问控制(MAC)系统,提供了比传统权限更严格的安全策略,有时,即使防火墙和服务配置都正确,SELinux 也可能阻止服务监听非标准端口或进行网络连接。
排查步骤:
- 检查 SELinux 状态: 使用 
getenforce命令,如果返回Enforcing,表示 SELinux 正在强制执行策略。 - 查看 SELinux 审计日志: 连接被拒时,SELinux 可能会记录拒绝事件,可以使用 
ausearch -m avc -ts recent或journalctl -t audit查看最近的审计日志,如果发现与您的服务或端口相关的denied记录,就说明是 SELinux 的问题。 - 修改 SELinux 策略: 解决方案是告诉 SELinux 允许该行为,允许 HTTP 服务(Apache/Nginx)连接到网络:
setsebool -P httpd_can_network_connect 1,或者,允许服务绑定到非标准端口:semanage port -a -t http_port_t -p tcp 8080,操作前请确保已安装policycoreutils-python包。 
TCP Wrappers
这是一个相对古老的访问控制机制,但某些服务可能仍在使用它,它通过 /etc/hosts.allow 和 /etc/hosts.deny 两个文件来控制基于主机名的访问。
排查步骤:
- 检查 
/etc/hosts.deny文件,看是否有ALL: ALL或针对特定服务的拒绝规则。 - 检查 
/etc/hosts.allow文件,确保客户端的 IP 地址或所在网段被明确允许访问该服务。hosts.allow的规则优先于hosts.deny。 
排查流程汇总
为了更清晰地展示排查过程,可以参考以下流程表:
| 步骤 | 检查项 | 常用命令 | 可能的解决方案 | 
|---|---|---|---|
| 1 | 客户端测试 | telnet <server_ip> <port> | 
确认错误是“连接被拒绝”,而非其他网络问题。 | 
| 2 | 服务器防火墙 | firewall-cmd --list-all | 
firewall-cmd --add-port=... --permanent | 
| 3 | 服务运行状态 | systemctl status <service> | 
systemctl start <service> | 
| 4 | 服务监听地址 | ss -tulnp \| grep <port> | 
修改配置文件,将监听地址改为 0.0.0,重启服务。 | 
| 5 | SELinux 策略 | getenforce, ausearch -m avc | 
setsebool -P ..., semanage port -a ... | 
| 6 | TCP Wrappers | cat /etc/hosts.{allow,deny} | 
修改 /etc/hosts.allow 添加允许规则。 | 
在 CentOS 7 上遇到类似 10065 的“连接被拒绝”错误时,不必惊慌,这通常不是一个复杂的网络故障,而是一个服务器配置问题,遵循“防火墙 -> 服务 -> SELinux”这一排查主线,利用 ss、firewall-cmd 和 journalctl 等强大工具,绝大多数问题都能被快速定位和解决,关键在于理解错误的本质——服务器端主动拒绝了连接——然后有条不紊地检查每一道可能拒绝连接的“门”。

相关问答 FAQs
问题1:我已经确认防火墙是关闭的,服务也正在运行,并且监听在 0.0.0.0,为什么还是无法连接?
解答: 这种情况下,问题最可能出在 SELinux 上,即使防火墙关闭,SELinux 处于 Enforcing 模式,它仍然会根据其内部策略阻止某些行为,一个 Web 服务默认被 SELinux 限制只能监听 80/443 端口,如果你让它监听 8080 端口,SELinux 就会拒绝,你应该首先检查 SELinux 的审计日志(journalctl -t audit 或 ausearch -m avc -ts recent),寻找与你的服务或端口相关的 denied 关键字,找到后,使用 setsebool 或 semanage 命令来调整策略,允许该操作,作为临时测试,你也可以将 SELinux 模式设置为 Permissive(setenforce 0),此模式下 SELinux 只会记录违规行为而不阻止,如果此时连接成功,即可确认是 SELinux 的问题。
问题2:firewall-cmd 和 iptables 在 CentOS 7 中有什么区别?我应该使用哪个?
解答: iptables 是 Linux 内核中 Netfilter 过滤系统的传统用户空间管理工具,它直接操作规则链,配置是静态的,修改后需要重新加载才能生效,而 firewall-cmd 是 CentOS 7 及后续版本中引入的 firewalld 服务的管理工具。firewalld 提供了动态管理功能,支持区域(zones)概念,允许在不中断现有连接的情况下实时添加、删除和修改规则,配置更加灵活和用户友好,对于 CentOS 7 及更高版本,强烈推荐使用 firewall-cmd 来管理防火墙,它与系统服务(如 systemctl)集成得更好,并且是系统默认的防火墙管理方式,直接使用 iptables 可能会与 firewalld 的管理机制产生冲突,导致配置混乱或丢失,除非你有非常特殊的需求且对 iptables 规则链有深入的理解,否则请坚持使用 firewall-cmd。