问题描述:
系统是ubuntu20.04,使用filezilla,两个主机之间能够ping通,但是filezilla使用sftp连接的时候显示的是
FATAL ERROR: Connection refused
Could connect to the server
应该如何排查问题呢
这是一个非常典型的SFTP连接问题。“Connection refused” (连接被拒绝) 是一个非常明确的错误信息,它和“Connection timed out”(连接超时) 或 “Host unreachable”(主机不可达) 是完全不同的。
“Connection refused”的核心含义是:你的FileZilla客户端发出的连接请求已经成功到达了服务器的IP地址,但是服务器操作系统主动拒绝了这个连接。
既然ping
是通的,说明网络底层是连通的。问题出在应用层,也就是SSH服务本身。
请按照以下步骤,从最可能的原因开始逐一排查服务器(也就是你希望连接上的那台Ubuntu主机)。
排查步骤
第一步:检查服务器上的SSH服务是否已安装并正在运行
这是最常见的原因,尤其是在一个新安装的Ubuntu桌面系统上,SSH服务默认可能没有安装。
登录到你的Ubuntu服务器 (通过物理键盘、VNC、或者其他已经可以连接的方式)。
检查SSH服务的状态,在终端中输入以下命令:
sudo systemctl status sshd
或者有时候服务名叫
ssh
:sudo systemctl status ssh
分析命令输出:
正常情况(服务正在运行):你会看到绿色的
active (running)
字样。
如果服务正在运行,请直接跳到 第二步。异常情况1(服务未运行):你可能会看到
inactive (dead)
。
解决方法:启动SSH服务,并设置为开机自启。sudo systemctl start ssh sudo systemctl enable ssh
然后再试一次FileZilla连接。
异常情况2(服务未安装):你可能会看到
Unit ssh.service could not be found.
或类似的错误。
解决方法:安装openssh-server
。sudo apt update sudo apt install openssh-server
安装完成后,SSH服务通常会自动启动。你可以用第一条
systemctl status ssh
命令再次检查。
第二步:检查服务器防火墙设置
如果SSH服务正在运行,但连接依然被拒绝,第二大可能性就是防火墙。Ubuntu默认使用 ufw
(Uncomplicated Firewall)。
检查防火墙状态:
sudo ufw status
分析命令输出:
如果输出是
Status: inactive
:说明防火墙未开启,这不是问题的原因,请跳到 第三步。如果输出是
Status: active
:你需要检查规则列表,看看是否允许了SSH连接(默认端口22)。Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere <-- 需要看到类似这行 OpenSSH ALLOW Anywhere <-- 或者这行 22/tcp (v6) ALLOW Anywhere (v6) OpenSSH (v6) ALLOW Anywhere (v6)
解决方法:如果列表中没有允许
22/tcp
或OpenSSH
的规则,请添加它:sudo ufw allow ssh
或者,如果你知道SSH使用的是标准端口22:
sudo ufw allow 22/tcp
添加规则后,无需
reload
或restart
ufw。现在再试一次FileZilla连接。
第三步:确认SSH服务的监听端口
虽然不常见,但有些服务器为了安全会修改SSH的默认端口(从22修改为其他端口)。
检查SSH正在监听的端口:
sudo ss -tlpn | grep sshd
ss
是一个现代的网络套接字查看工具,比netstat
更快。
分析命令输出:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=4))
- 请注意
LISTEN
状态后面跟着的地址和端口。0.0.0.0:22
表示在所有IPv4地址的22端口上监听。 - 如果这里显示的端口不是22(例如是
2222
),那么你在FileZilla连接时,必须在“端口§”字段明确填写这个新的端口号。
- 请注意
如果需要修改端口:可以编辑SSH配置文件
sudo nano /etc/ssh/sshd_config
,找到Port 22
这一行,修改为你想要的端口,然后重启SSH服务sudo systemctl restart ssh
。同时别忘了在防火墙里允许新端口。
第四步:检查客户端(FileZilla)的设置
回到你自己的电脑上,检查FileZilla的设置是否正确。
- 协议(Protocol):确保主机名前缀是
sftp://
,例如sftp://192.168.1.100
。千万不要错选成ftp://
。SFTP (SSH File Transfer Protocol) 和 FTP 是完全不同的协议。 - 主机(Host):确认服务器的IP地址或域名输入正确。
- 端口(Port):
- 如果服务器使用标准端口22,此项可以留空。
- 如果服务器使用了非标准端口(如第三步中查到的),必须在此处填写正确的端口号。
- 用户名(Username)/密码(Password):确保你使用的是服务器上一个真实存在的用户的凭据。
第五步:使用命令行工具进行最终测试
为了排除是FileZilla本身的问题,可以在你的客户端电脑的终端(如果是Windows,可以使用CMD或PowerShell)上使用原生的sftp
命令进行测试。
打开你电脑的终端。
输入命令:
# 如果服务器是标准22端口 sftp your_username@server_ip_address # 如果服务器是自定义端口,例如2222 sftp -P 2222 your_username@server_ip_address
- 将
your_username
和server_ip_address
替换为你的实际信息。 - 注意:
sftp
命令用大写的-P
指定端口,而ssh
命令用小写的-p
。
- 将
观察结果:
- 如果命令行也返回
Connection refused
,那么问题100%在服务器端,请重新仔细检查第一、二、三步。 - 如果命令行能够成功连接(会提示你输入密码),但FileZilla不行,那问题就在FileZilla的配置上,请仔细检查第四步。
- 如果命令行也返回
总结排查流程
- 服务器:SSH服务装了吗?
sudo apt install openssh-server
- 服务器:SSH服务运行了吗?
sudo systemctl status ssh
-> 不行就sudo systemctl start ssh
- 服务器:防火墙挡了吗?
sudo ufw status
-> 如果active,就sudo ufw allow ssh
- 服务器:端口对吗?
sudo ss -tlpn | grep sshd
-> 确认端口号 - 客户端:FileZilla里协议、主机、端口、用户名填对了吗?特别是
sftp://
协议和端口号。
按照这个顺序排查,基本上都能解决“Connection refused”的问题。