在Linux系统中,21端口是FTP(File Transfer Protocol,文件传输协议)的默认端口,主要用于文件传输服务,要开启21端口,通常需要安装并配置FTP服务,同时确保防火墙允许该端口的访问,本文将详细讲解在不同Linux发行版中开启21端口的完整步骤,包括服务安装、配置、防火墙设置及验证方法。
检查当前端口状态
在开启21端口前,首先需要确认当前系统中该端口是否已被占用或开放,可以使用以下命令检查:
- 使用ss命令(推荐,netstat的替代工具):
ss -tulnp | grep 21
如果返回结果中包含“21”端口且状态为“LISTEN”,说明端口已被服务监听;若无输出,则端口未开放。
- 使用netstat命令(较旧系统):
netstat -tulnp | grep 21
安装FTP服务
Linux系统中常用的FTP服务器软件有vsftpd(Very Secure FTP Daemon)、proftpd等,其中vsftpd因安全性高、配置简单而被广泛使用,以下以vsftpd为例,分不同发行版介绍安装方法。
基于RHEL/CentOS的系统(如CentOS 7/8、Rocky Linux)
使用yum
或dnf
包管理器安装:
# 更新软件包缓存 sudo yum update -y # 安装vsftpd sudo yum install vsftpd -y
基于Debian/Ubuntu的系统(如Ubuntu 20.04/22.04、Debian 11)
使用apt
包管理器安装:
# 更新软件包列表 sudo apt update # 安装vsftpd sudo apt install vsftpd -y
安装完成后,可通过以下命令检查服务状态:
sudo systemctl status vsftpd
若显示“active (running)”,说明服务已启动;若未启动,可手动启动:
sudo systemctl start vsftpd
配置vsftpd服务
vsftpd的配置文件位于/etc/vsftpd/vsftpd.conf
,需根据需求修改关键参数,建议先备份原配置文件:
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
以下是常用配置参数及说明(可通过vim
或nano
编辑器修改配置文件):
参数 | 说明 | 示例值 |
---|---|---|
anonymous_enable |
是否允许匿名用户登录 | NO (禁止匿名,更安全) |
local_enable |
是否允许本地系统用户登录 | YES |
write_enable |
是否允许FTP用户上传/修改文件 | YES |
local_umask |
本地用户上传文件的默认权限掩码 | 022 (上传后文件权限为644) |
chroot_local_user |
是否将用户限制在其家目录 | YES (防止用户访问系统其他目录) |
allow_writeable_chroot |
是否允许被限制在家目录的用户写入 | YES (需配合chroot_local_user=YES 使用) |
pasv_enable |
是否启用被动模式(推荐,避免客户端防火墙问题) | YES |
pasv_min_port |
被动模式使用的最小端口 | 10000 |
pasv_max_port |
被动模式使用的最大端口 | 10100 |
userlist_enable |
是否启用用户列表文件(仅允许列表中的用户登录) | YES |
userlist_file |
用户列表文件路径 | /etc/vsftpd/user_list |
示例配置(允许本地用户登录,限制在家目录,启用被动模式):
# 禁止匿名登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许写入 write_enable=YES # 本地用户上传文件权限掩码 local_umask=022 # 将用户限制在家目录 chroot_local_user=YES # 允许被限制用户写入 allow_writeable_chroot=YES # 启用被动模式 pasv_enable=YES # 被动模式端口范围 pasv_min_port=10000 pasv_max_port=10100 # 启用用户列表(仅允许user_list中的用户登录) userlist_enable=YES userlist_file=/etc/vsftpd/user_list
配置防火墙规则
Linux系统默认会启用防火墙(如CentOS的firewalld、Ubuntu的ufw),需手动开放21端口及被动模式端口(若启用)。
CentOS/RHEL系统(使用firewalld)
# 开放21端口(FTP控制端口) sudo firewall-cmd --permanent --add-port=21/tcp # 开放被动模式端口范围(10000-10100) sudo firewall-cmd --permanent --add-port=10000-10100/tcp # 重新加载防火墙规则 sudo firewall-cmd --reload # 查看已开放的端口 sudo firewall-cmd --list-ports
Ubuntu/Debian系统(使用ufw)
# 开放21端口 sudo ufw allow 21/tcp # 开放被动模式端口范围 sudo ufw allow 10000:10100/tcp # 启用ufw(若未启用) sudo ufw enable # 查看防火墙规则 sudo ufw status
创建FTP用户(可选)
如果需要本地系统用户通过FTP登录,可创建专用用户并设置密码,创建用户ftpuser
:
# 创建用户 sudo useradd -m -s /bin/bash ftpuser # 设置密码 sudo passwd ftpuser
若启用了userlist_enable=YES
,需将用户名添加到/etc/vsftpd/user_list
文件中(每行一个用户):
echo "ftpuser" | sudo tee -a /etc/vsftpd/user_list
启动并设置开机自启
配置完成后,启动vsftpd服务并设置开机自启:
# 启动服务 sudo systemctl start vsftpd # 设置开机自启 sudo systemctl enable vsftpd
验证21端口是否开放
检查端口监听状态
ss -tulnp | grep 21
若输出包含“LISTEN”且进程为vsftpd
,说明21端口已开放。
使用FTP客户端测试
- 命令行测试(本地测试):
ftp localhost
输入用户名和密码,若成功登录并显示
ftp>
提示符,说明服务正常。 - 工具测试(如FileZilla):
输入服务器IP、用户名、密码,端口选择21,若连接成功,说明配置正确。
常见问题处理
无法连接21端口,提示“Connection refused”
- 检查vsftpd服务是否启动:
sudo systemctl status vsftpd
。 - 检查防火墙是否开放21端口:
sudo firewall-cmd --list-ports
(CentOS)或sudo ufw status
(Ubuntu)。 - 检查SELinux状态(CentOS):若SELinux为 enforcing 模式,可能需执行:
sudo setsebool -P ftpd_full_access on
用户登录后无法切换目录,提示“500 OOPS: vsftpd: refusing to run with writable root inside chroot”
这是由于chroot_local_user=YES
时,默认不允许用户家目录可写,解决方法是在配置文件中添加:
allow_writeable_chroot=YES
FAQs
Q: 开启21端口后,如何限制FTP用户只能访问特定目录,而不能访问系统其他文件?
A: 可以通过配置chroot_local_user=YES
将用户限制在其家目录,若需限制到特定目录(如/var/ftp/share
),可按以下步骤操作:
- 创建目标目录并设置权限:
sudo mkdir -p /var/ftp/share sudo chown -R ftpuser:ftpuser /var/ftp/share sudo chmod -R 755 /var/ftp/share
- 修改
/etc/passwd
,将用户的家目录指向目标目录(例如将ftpuser
的家目录从/home/ftpuser
改为/var/ftp/share
):sudo usermod -d /var/ftp/share ftpuser
- 重启vsftpd服务:
sudo systemctl restart vsftpd
。
Q: 如何关闭匿名FTP访问,仅允许本地用户登录?
A: 编辑/etc/vsftpd/vsftpd.conf
文件,确保以下参数配置正确:
anonymous_enable=NO # 禁止匿名登录 local_enable=YES # 允许本地用户登录
保存后重启vsftpd服务:sudo systemctl restart vsftpd
,确保/etc/vsftpd/user_list
文件中包含允许登录的用户名(若启用了用户列表功能)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/20206.html