在Linux系统中,21端口是FTP(File Transfer Protocol,文件传输协议)服务的默认端口,开启21端口通常意味着需要安装并配置FTP服务,同时确保防火墙允许该端口的流量访问,本文将以主流的FTP服务器软件vsftpd(Very Secure FTP Daemon)为例,详细说明在Linux系统中开启21端口的完整步骤,包括安装服务、配置防火墙、修改参数设置及测试连接等关键环节,同时针对不同Linux发行版(如CentOS/RHEL和Ubuntu/Debian)的差异提供对应操作。
安装FTP服务软件vsftpd
vsftpd是一款轻量级、安全的FTP服务程序,广泛应用于Linux系统,是开启21端口的基础,不同Linux发行版的包管理器不同,安装命令略有差异。
CentOS/RHEL系统
使用yum
或dnf
包管理器安装(CentOS 7及以下版本使用yum
,CentOS 8及以上版本使用dnf
):
# 更新软件包缓存 sudo yum update -y # CentOS 7及以下 sudo dnf update -y # CentOS 8及以上 # 安装vsftpd sudo yum install vsftpd -y # CentOS 7及以下 sudo dnf install vsftpd -y # CentOS 8及以上
Ubuntu/Debian系统
使用apt
包管理器安装:
# 更新软件包列表 sudo apt update # 安装vsftpd sudo apt install vsftpd -y
安装完成后,可通过以下命令检查vsftpd服务状态:
sudo systemctl status vsftpd
若显示“active (running)”,则表示服务已启动;若未启动,可使用sudo systemctl start vsftpd
手动启动。
配置防火墙开放21端口
Linux系统默认启用防火墙(如CentOS 7+的firewalld、Ubuntu的ufw),需手动开放21端口及FTP被动模式所需的端口范围(避免主动/被动模式连接问题)。
CentOS/RHEL(firewalld)
# 开放21端口(TCP协议) sudo firewall-cmd --permanent --add-port=21/tcp # 开放FTP被动模式端口范围(示例:50000-50100,可根据需求修改) sudo firewall-cmd --permanent --add-port=50000-50100/tcp # 重新加载防火墙配置使规则生效 sudo firewall-cmd --reload # 查查已开放的端口确认 sudo firewall-cmd --list-ports
Ubuntu/Debian(ufw)
# 开放21端口 sudo ufw allow 21/tcp # 开放FTP被动模式端口范围(示例:50000-50100) sudo ufw allow 50000:50100/tcp # 启用ufw(若未启用) sudo ufw enable # 查看防火墙规则 sudo ufw status
注意:FTP协议的主动模式(Active Mode)和被动模式(Passive Mode)对端口需求不同,主动模式需客户端连接服务器的21端口(命令端口)和20端口(数据端口),但现代防火墙通常限制主动模式;被动模式下,服务器动态分配数据端口(如上述50000-50100),客户端主动连接这些端口,更适合NAT环境,因此建议开启被动模式并配置端口范围。
修改vsftpd配置文件
vsftpd的核心配置文件为/etc/vsftpd/vsftpd.conf
,需根据需求修改关键参数,确保21端口可正常访问且符合安全策略。
备份原始配置文件
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
编辑配置文件
使用vi
或nano
编辑器打开文件:
sudo vi /etc/vsftpd/vsftpd.conf
关键参数说明及修改建议
以下为vsftpd.conf中与21端口开启及功能相关的核心参数,可根据需求调整:
参数名 | 默认值 | 说明 | 建议值 |
---|---|---|---|
listen |
YES | 是否监听IPv4端口 | 保持YES(若需IPv6支持,添加listen_ipv6=YES ) |
anonymous_enable |
YES | 是否允许匿名用户登录 | NO(禁止匿名,提升安全性) |
local_enable |
YES | 是否允许本地用户登录 | YES(允许系统用户通过FTP访问) |
write_enable |
YES | 是否允许文件写入(上传/删除等) | 根据需求设置(如仅上传则保持YES) |
chroot_local_user |
NO | 是否限制本地用户仅能访问家目录 | YES(防止用户越权访问系统目录) |
allow_writeable_chroot |
NO | 是否允许chroot目录可写(需配合chroot_local_user=YES ) |
YES(若用户需上传文件) |
pasv_enable |
NO | 是否开启被动模式 | YES(推荐开启,解决防火墙兼容问题) |
pasv_min_port |
0 | 被动模式最小端口 | 50000(与防火墙开放的端口范围一致) |
pasv_max_port |
0 | 被动模式最大端口 | 50100(与防火墙开放的端口范围一致) |
userlist_enable |
YES | 是否启用用户列表文件 | YES(结合userlist_file 限制登录用户) |
tcp_wrappers |
YES | 是否使用TCP Wrappers主机访问控制 | YES(可限制特定IP访问) |
示例配置片段
# 监听IPv4端口 listen=YES # 禁止匿名登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许文件写入 write_enable=YES # 限制用户仅访问家目录 chroot_local_user=YES allow_writeable_chroot=YES # 开启被动模式并设置端口范围 pasv_enable=YES pasv_min_port=50000 pasv_max_port=50100 # 启用用户列表(仅允许列表中的用户登录,需创建/etc/vsftpd/user_list文件) userlist_enable=YES userlist_file=/etc/vsftpd/user_list userlist_deny=NO(NO表示仅允许列表中的用户,YES表示禁止列表中的用户)
创建用户列表文件(若启用用户列表限制)
# 编辑用户列表,每行一个用户名(如允许用户ftpuser登录) sudo vi /etc/vsftpd/user_listftpuser
重启vsftpd服务使配置生效
sudo systemctl restart vsftpd
创建FTP用户并配置权限
为提升安全性,建议创建专用FTP用户,而非直接使用系统root用户。
创建用户并设置密码
# 创建用户ftpuser,家目录为/home/ftpuser(可根据需求修改) sudo useradd -m -d /home/ftpuser -s /sbin/nologin ftpuser # 设置用户密码 sudo passwd ftpuser
参数说明:-m
表示创建家目录;-d
指定家目录;-s /sbin/nologin
限制用户仅能通过FTP登录,无法直接SSH登录系统。
设置家目录权限
确保FTP用户对家目录有读写权限:
sudo chmod 755 /home/ftpuser # 所有者可读写执行,组用户和其他用户可读执行 sudo chown ftpuser:ftpuser /home/ftpuser # 设置所有者为ftpuser用户
处理SELinux(仅CentOS/RHEL系统)
CentOS系统默认启用SELinux,可能会阻止FTP服务访问文件系统,需配置SELinux规则。
检查SELinux状态
sestatus
若显示“enabled”,则需执行以下操作。
设置SELinux允许FTP访问
# 设置布尔值,允许FTP用户访问家目录 sudo setsebool -P ftpd_full_access on # 或使用更严格的规则(推荐) sudo setsebool -P ftp_home_dir on sudo setsebool -P allow_ftpd_full_access on
检查vsftpd进程的SELinux上下文
ps auxZ | grep vsftpd
确保上下文为system_u:system_r:ftpd_t:s0
,若不符,可通过restorecon -R /home/ftpuser
修复。
测试FTP连接
命令行测试(Linux/macOS)
ftp localhost # 或指定IP:ftp 192.168.1.100
输入用户名(ftpuser)和密码,若成功登录,显示“ftp>”提示符,可通过put
(上传)、get
(下载)等命令测试文件传输。
图形化工具测试(Windows/Linux/macOS)
使用FileZilla、WinSCP等FTP客户端,输入服务器IP、用户名、密码及端口(21),连接后测试文件上传下载功能。
常见问题排查
- 连接被拒绝:检查vsftpd服务状态(
systemctl status vsftpd
)、防火墙规则(firewall-cmd --list-ports
或ufw status
)、SELinux设置(sealert -l /var/log/audit/audit.log
查看日志)。 - 无法上传文件:检查
write_enable=YES
、allow_writeable_chroot=YES
、目录权限(chmod 755
)及SELinux布尔值(ftpd_full_access
)。 - 被动模式连接失败:确认防火墙开放了
pasv_min_port
和pasv_max_port
指定的端口范围,并在客户端启用被动模式(FileZilla默认开启)。
相关问答FAQs
Q1:为什么开启了21端口并配置了vsftpd,但FTP客户端仍提示“连接被拒绝”?
A:可能原因包括:
- vsftpd服务未启动:执行
sudo systemctl start vsftpd
并设置开机自启(sudo systemctl enable vsftpd
); - 防火墙未开放21端口:检查
firewall-cmd --list-ports
(CentOS)或ufw status
(Ubuntu),确认21端口及被动模式端口范围已添加; - SELinux阻止:CentOS系统下执行
sudo setsebool -P ftpd_full_access on
,或查看/var/log/audit/audit.log
定位SELinux告警; - 客户端网络问题:确认客户端可ping通服务器IP,且本地防火墙未阻止访问。
Q2:如何限制FTP用户仅能访问指定目录(如/var/ftp/share),而不能访问其他系统目录?
A:可通过以下步骤实现:
- 创建共享目录并设置权限:
sudo mkdir -p /var/ftp/share sudo chmod 755 /var/ftp/share sudo chown ftpuser:ftpuser /var/ftp/share # 设置FTP用户为所有者
- 修改vsftpd配置文件,禁用用户家目录限制,并设置本地用户根目录:
sudo vi /etc/vsftpd/vsftpd.conf # 修改或添加以下参数: chroot_local_user=YES allow_writeable_chroot=YES local_root=/var/ftp/share # 指定所有本地用户的FTP根目录
- 重启vsftpd服务:
sudo systemctl restart vsftpd
用户登录后将仅能访问/var/ftp/share
目录及其子目录,无法跳出该目录范围。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/35675.html