Ubuntu22.04 vsftpd
Ubuntu22.04 LTS上搭建FTP服务
一、安装vsftpd软件包
sudo apt install vsftpd -y
sudo systemctl enable vsftpd
sudo systemctl start vsftpd
查看版本,验证是否安装成功
vsftpd -v
二、配置FTP参数
1、ftp工作目录
sudo mkdir -p /home/ftp/uftp
2、ftp工作用户
sudo useradd -d /home/ftp/uftp -m uftp \\创建FTP用户名
sudo passwd uftp \\设置密码
chmod -R 777 /home/ftp \\设置ftp权限
3、修改vsftpd.conf
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig \\备份vsftpd.conf文件
sudo vim /etc/vsftpd.conf \\编辑vsftpd.conf
修改和新增内容
修改
listen=YES
listen_ipv6=NO
chroot_local_user=YES \\去注释
增加
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/allowed_users
local_enable=YES
write_enable=YES
pasv_promiscuous=YES
anonymous_enable=NO
allow_writeable_chroot=YES
在/etc目录下创建文件allowed_users,用于存储允许登录ftp服务器的本地用户,可以在root下面直接用命令:
echo uftp >> /etc/allowed_users
vsftpd.conf翻译
1 # 示例配置文件,地址: /etc/vsftpd.conf 2 # 3 # vsftpd的默认编译设置比较谨慎,这个示例文件会放宽一些限制,使ftp服务更加易用。 4 # 同时建议查看vsftpd.conf.5文件以了解所有编译默认值。 5 # 6 # 特别提醒:这个示例文件并不包含vsftpd选项的所有内容,建议阅读vsftpd.conf.5手册页以充分了解vsftpd的功能。 7 # 8 # 9 # 10 # 用来设置vsftpd是否以独立守护进程运行。 11 # 如果设置为"listen=YES",则表示vsftpd将作为独立守护进程运行; 12 # 如果设置为"listen=NO",则表示vsftpd将不会以独立守护进程运行,而是通过inetd或者initscript启动。 13 listen=NO 14 # 15 # 设置vsftpd是否启用IPv6监听。 16 # 如果设置为"listen_ipv6=YES",则表示vsftpd将启用IPv6监听; 17 # 如果设置为"listen_ipv6=NO",则表示vsftpd将不会启用IPv6监听。 18 # 默认情况下,IPv6监听地址为"::",同时可以接受IPv6和IPv4客户端的连接。 19 # 如果你只需要监听IPv4或IPv6地址,则不需要同时启用两种监听,如果你需要同时监听特定的IPv4和IPv6地址,则需要运行两个vsftpd实例,并使用两个不同的配置文件来进行配置。 20 listen_ipv6=YES 21 # 22 # 设置是否允许匿名FTP登录。 23 anonymous_enable=NO 24 # 25 # 设置是否允许本地用户登录FTP服务器。 26 local_enable=YES 27 # 28 # 设置是否允许FTP用户执行写入操作。 29 # write_enable=YES 30 # 31 # 设置本地用户的默认umask值。 32 # umask是一个三位八进制数,用来控制新建文件或目录的访问权限。 33 # 在FTP服务器中,local_umask选项用来设置本地用户上传文件或创建目录时的默认权限。 34 # 默认情况下,local_umask的值为077,表示新建的文件或目录权限为只有所有者可读、可写、可执行,其他用户无权访问。 35 # 如果你的用户希望默认权限为所有者可读、可写、可执行,其他用户可读、可执行,则可以将local_umask的值设置为022。 36 local_umask=022 37 # 38 # 设置是否允许匿名FTP用户上传文件。 39 # 如果将该选项的注释去掉(即将“#”删去),并将其值设置为YES,则表示允许匿名FTP用户上传文件。 40 # 但是,这个选项只有在全局写入权限被激活时才会生效。此外,你还需要创建一个由FTP用户可写的目录,以便匿名FTP用户可以上传文件。 41 # 需要注意的是,开启匿名FTP用户上传文件功能可能存在一定的安全风险,因此需要谨慎使用。 42 # anon_upload_enable=YES 43 # 44 # 设置是否允许匿名FTP用户创建新目录。 45 # 如果将该选项的注释去掉(即将“#”删去),并将其值设置为YES,则表示允许匿名FTP用户创建新目录。 46 # 需要注意的是,开启匿名FTP用户创建新目录功能可能存在一定的安全风险,因此需要谨慎使用。 47 # anon_mkdir_write_enable=YES 48 # 49 # 这段配置文件是用来设置是否启用目录消息功能。 50 # 如果设置为YES,则表示启用目录消息功能。当远程用户进入某个目录时,会显示该目录的消息。 51 dirmessage_enable=YES 52 # 53 # 设置是否启用本地时间功能。 54 # 启用本地时间功能后,vsftpd将会在目录列表中显示本地时间而非GMT时间。 55 use_localtime=YES 56 # 57 # 启用上传和下载日志记录功能。 58 # 启用该功能后,vsftpd会记录每个用户的上传和下载操作,并将其记录到指定的日志文件中。 59 xferlog_enable=YES 60 # 61 # 设置数据传输的端口号。 62 # 将其值设置为YES,则表示数据传输使用的端口号为20。 63 connect_from_port_20=YES 64 # 65 # 设置匿名用户上传的文件的所有者。 66 # 设置为YES,则表示上传的文件将会被转换为指定用户的所有权。 67 # chown_uploads=YES 68 # 设置为指定的用户名。 69 # chown_username=whoever 70 # 71 # 设置vsftpd日志文件的路径。该路径必须具有可写权限,并且对于vsftpd进程来说,必须具有可访问权限。 72 # xferlog_file=/var/log/vsftpd.log 73 # 74 # 设置vsftpd日志文件的格式。设备为YES则存储为标准ftpd xferlog格式。 75 # xferlog_std_format=YES 76 # 77 # 设置vsftpd空闲会话超时的时间(以秒为单位)。 78 # idle_session_timeout=600 79 # 80 # 设置vsftpd数据连接超时的时间(以秒为单位)。 81 # data_connection_timeout=120 82 # 83 # vsftpd建议在系统中定义一个唯一的用户,供FTP服务器使用,作为完全隔离和无特权的用户。 84 # nopriv_user选项可以用来指定该用户的用户名。 85 # nopriv_user=ftpsecure 86 # 87 # 用于启用异步ABOR请求的识别。 88 # 异步ABOR请求是一种FTP客户端请求,用于取消当前正在进行的数据传输操作。 89 # 启用该选项可以提高FTP服务器的性能,但也会增加安全风险。因为异步ABOR请求的代码比较复杂,可能会被黑客利用进行恶意攻击。 90 # 所以,如果安全性是首要考虑因素,则不建议启用该选项。 91 # async_abor_enable=YES 92 # 93 # 用于控制FTP服务器是否启用ASCII模式下的文件转换功能。 94 # 默认情况下,FTP服务器会假装允许ASCII模式,但实际上会忽略该请求。 95 # 如果需要启用ASCII模式下的文件转换功能,则可以将ascii_upload_enable和ascii_download_enable选项的注释去掉,并将它们的值设置为YES。 96 # 在ASCII模式下,FTP服务器会将文本文件中的换行符和回车符进行转换,以便在不同操作系统之间进行传输。 97 # 但是,需要注意的是,ASCII模式下可能存在一些安全风险。例如,攻击者可以利用SIZE命令在ASCII模式下发送一个超大文件名,导致FTP服务器崩溃。 98 # 因此,建议谨慎使用ASCII模式,并确保FTP服务器已经做好了相应的安全措施。 99 # ascii_upload_enable=YES 100 # ascii_download_enable=YES 101 # 102 # vsftpd的登录横幅的设置,你可以理解为登录成功后的欢迎词。 103 # ftpd_banner=Welcome to blah FTP service. 104 # 105 # 设备是否拒绝匿名电子邮件地址 106 # 有助于减轻利用匿名访问FTP服务器进行的拒绝服务(DoS)攻击。如果检测到被禁止的电子邮件地址,服务器将拒绝该用户的访问。 107 # deny_email_enable=YES 108 # 如果启用了拒绝匿名电子邮件地址的选项,则通过从指定的文件“/etc/vsftpd.banned_emails”读取被禁止的电子邮件地址列表。 109 # banned_email_file=/etc/vsftpd.banned_emails 110 # 111 # 设备限制本地用户仅访问其home目录。 112 # 如果启用,则本地用户将仅访问其home目录和其子目录,无法访问其他目录。 113 # chroot_local_user=YES 114 # 115 # 是否允许本地用户,是否将本地用户限制在其主目录中,如果设置为YES,则不会将列在chroot_list_file中的用户限制在其主目录中。 116 # chroot_local_user=YES 117 # 是否启用chroot_list_file列表,用于指定哪些用户不应该被限制在主目录中。 118 # chroot_list_enable=YES 119 # 指定了chroot_list_file列表的路径和名称。一行一个用户名。 120 # chroot_list_file=/etc/vsftpd.chroot_list 121 # 122 # 否启用ls命令的递归选项“-R”,该选项可以在列出目录内容时递归地列出子目录。 123 # 默认情况下,该选项被禁用以避免远程用户在大型站点上引起过多的I/O。 124 # ls_recurse_enable=YES 125 # 126 # 自定义配置: 127 # 128 # 指定了一个空目录作为安全chroot() jail。 129 # 在某些情况下,vsftpd不需要访问文件系统,因此可以将FTP用户限制在这个空目录中,以增强安全性。该目录应该为空,并且不应该被FTP用户写入。 130 secure_chroot_dir=/var/run/vsftpd/empty 131 # 132 # 指定vsftpd将使用的PAM服务的名称。 133 # 默认情况下,pam_service_name的值为“vsftpd”,这意味着vsftpd将使用名为“vsftpd”的PAM服务来进行认证。 134 # 如果需要使用其他的PAM服务,可以修改该选项的值。 135 pam_service_name=vsftpd 136 # 137 # 用于指定在SSL加密连接中使用的RSA证书的位置。 138 # 通过设置rsa_cert_file和rsa_private_key_file选项来指定RSA证书和私钥的位置。 139 # 其中,rsa_cert_file选项用于指定证书文件的位置,而rsa_private_key_file选项用于指定私钥文件的位置。 140 rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem 141 rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key 142 # 是否启用SSL加密连接。 143 ssl_enable=NO 144 # 145 # 指定是否在vsftpd中使用UTF-8编码的文件系统。 146 # utf8_filesystem=YES
4、重启FTP服务使配置生效
sudo systemctl restart vsftpd
三、验证
1、本机验证
输入命令:ftp 127.0.0.1,输入用户名、密码,显示登入成功说明就OK啦!
2、ftp工具验证
3、python代码上传文件验证
from ftplib import FTP
def ftpconnect(host, username, password):
ftp = FTP()
ftp.set_debuglevel(2)
ftp.connect(host, 21)
ftp.login(username, password)
return ftp
def downloadfile(ftp, remotepath, localpath):
# 从ftp下载文件
bufsize = 1024
with open(localpath, 'wb') as fp:
ftp.retrbinary('RETR ' + remotepath, fp.write,bufsize)
ftp.set_debuglevel(0)
fp.close()
def uploadfile(ftp, localpath, remotepath):
# 从本地上传文件到ftp
bufsize = 1024
with open(localpath, 'rb') as fp:
ftp.storbinary('STOR ' + remotepath, fp,bufsize)
ftp.set_debuglevel(0)
fp.close()
if __name__ == "__main__":
ftp = ftpconnect("10.111.112.92", "uftp", "123456")
uploadfile(ftp, "test.py", "test.py")
ftp.quit()