搭建FTP服务器
(1).实验环境
FTP服务器:youxi1 192.168.1.6
测试主机:youxi2 192.168.1.7
VSFTP是C/S模式,默认端口21传输指令,20传输数据
(2).工作原理
FTP会话包含了两个通道,数据通道和命令通道。FTP的工作模式有两种,主动模式(PORT模式)和被动模式(PASV模式),均以FTP服务器作为参照物。FTP服务器主动连接客户端为主动模式,FTP服务器等待客户端连接为被动模式。
1)主动模式工作原理:
建立控制通道:客户端发起连接请求,包含用户名、密码、客户端随机开放的一个高位端口(1024以上)以及连接模式PORT命令等。服务器接收后响应客户端,服务器的21端口与提供的随机高位端口建立控制通道。
建立数据通道:服务器发送连接请求,包含服务器的20端口。客户端接收后响应请求,随机开放一个高位端口(1024以上),客户端的随机高位端口与服务器的20端口建立数据通道。
2)被动模式工作原理:
建立控制通道:客户端发起连接请求,包含用户名、密码、客户端随机开放的一个高位端口(1024以上)以及连接模式PASV命令等。服务器接收后响应客户端,服务器的21端口与提供的随机高位端口建立控制通道。
建立数据通道:服务器会随机开放一个高位端口(1024以上)告知客户端用于建立数据通道,客户端开放一个随机高位端口(1024以上)与服务器随机开放的高位端口连接。
底下这张是Windows下的FTP被动连接:
(3).实验
1)服务器端安装vsftpd,客户端安装lftp
服务器端
1 | [root@youxi1 ~]# yum -y install vsftpd |
客户端
1 | [root@youxi2 ~]# yum -y install lftp |
2)服务器端相关文件
/etc/vsftpd/vsftpd.conf 核心配置文件
/etc/vsftpd/ftpusers 指定不能访问FTP服务器的用户,即黑名单
/etc/vsftpd/user_list 当/etc/vsftpd/vsftpd.conf配置文件中userlist_deny= YES,那么该文件是黑名单;反之userlist_deny= NO,那么只允许该文件的用户登录
/etc/vsftpd/vsftpd_conf_migrate.sh vsftpd操作的一些变量和设置脚本
/var/ftp/ 默认情况下匿名用户的根目录
3)匿名用户访问
在/etc/vsftpd/vsftpd.conf配置文件中与匿名用户有关的参数如下:
1 2 3 4 | anonymous_enable=YES //允许匿名用户登录FTP,默认为YES anon_upload_enable=YES //允许匿名用户上传,默认为NO anon_mkdir_write_enable=YES //允许匿名用户创建目录,默认为NO anon_other_write_enable=YES //给予匿名用户写权限,默认为NO |
根据相关需求将参数修改成指定要求。
接着将FTP服务器youxi1上的匿名用户的根目录/etc/ftp/属主和属组改为ftp,这样匿名用户才能操作目录下的文件:
1 | [root@youxi1 pub]# chown ftp:ftp / var /ftp/pub |
注意:vsftp是相对安全的FTP工具,所以并不允许/var/ftp/给予匿名用户写权限
然后启动vsftpd服务,并开机自启:
1 2 | [root@youxi1 pub]# systemctl start vsftpd [root@youxi1 pub]# systemctl enable vsftpd |
这时可以使用Window匿名登录,创建文件夹、上传文件
也可以在Linux上使用lftp匿名登录
1 2 3 4 5 | [root@youxi2 ~]# lftp 192.168.1.6 lftp 192.168.1.6:~> ls drwxr-xr-x 2 14 50 28 May 18 14:52 pub lftp 192.168.1.6:/> cd pub/ lftp 192.168.1.6:/pub> |
当然并不建议开启匿名登录。
4)使用指定的系统用户只能访问指定的目录
在FTP服务器youxi1上添加普通用户,但禁止登录系统,并赋予密码:
1 2 3 4 | [root@youxi1 ~]# useradd -s /sbin/nologin ftp1 [root@youxi1 ~]# useradd -s /sbin/nologin ftp2 [root@youxi1 ~]# echo "ftp1:123456" | chpasswd [root@youxi1 ~]# echo "ftp2:123456" | chpasswd |
在/etc/vsftpd/vsftpd.conf配置文件中与之相关的参数如下:
1 2 3 4 5 6 | local_enable=YES //允许本地用户登录 #chroot_local_user=YES //设置是否将所有本地用户囚禁在主目录,默认为NO local_root=/www/html //设置本地用户访问的根目录 chroot_list_enable=YES //激活chroot功能(激活囚禁用户列表功能),默认为NO chroot_list_file=/etc/vsftpd/chroot_list //设置被囚禁的用户列表存放的文件 allow_writeable_chroot=YES //允许被囚禁的用户具有写权限,默认为NO |
将匿名用户相关参数取消,修改或添加相关参数。
创建被囚禁用户的主目录/www/html/,以及被囚禁用户列表文件
1 2 3 4 | [root@youxi1 ~]# mkdir -p /www/html [root@youxi1 ~]# vim /etc/vsftpd/chroot_list ftp1 ftp2 |
修改被囚禁用户的主目录权限
1 2 3 | [root@youxi1 ~]# chmod o+w /www/html/ //如果是已存在文件,需要使用-R选项递归 [root@youxi1 ~]# ls -ld /www/html/ drwxr-xrwx 2 root root 6 5月 19 14:13 /www/html/ |
重启vsftpd服务
1 | [root@youxi1 ~]# systemctl restart vsftpd |
到测试主机youxi2上测试
1 2 3 | [root@youxi2 ~]# lftp 192.168.1.6 -u ftp1,123456 lftp ftp1@192.168.1.6:~> ls ls: 登录失败: 530 Login incorrect. |
网上找了找相关问题,一个是/etc/vsftpd/vsftpd.conf配置文件参数应该如下:
1 | pam_service_name=vsftpd //这个我原本就是 |
还有一个是/etc/pam.d/vsftpd注释掉如下参数:
1 | #auth required pam_shells.so |
然后再重启vsftpd服务
1 | [root@youxi1 ~]# systemctl restart vsftpd |
这时候再到测试主机youxi2上
1 2 3 4 | [root@youxi2 pam.d]# lftp 192.168.1.6 -u ftp1 口令: lftp ftp1@192.168.1.6:~> ls -rw-r--r-- 1 0 0 968 May 19 06:21 passwd |
(4).OpenSSL加密FTP传输
使用OpenSSL生成自签证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | //req是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令 //-x509是X.509 证书数据管理 //-days是定义证书有效时间 //-keyout是设置密钥存储文件 //-out是设置证书存储位置,注意证书与密钥保存在同一个文件 [root@youxi1 ~]# openssl req - new -x509 -nodes - out vsftpd.pem -keyout vsftpd.pem -days 3650 Generating a 2048 bit RSA private key ..........................................................................+++ .................................+++ writing new private key to 'vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.' , the field will be left blank. ----- Country Name (2 letter code) [XX]:ZH^H^H^H^H^H^C [root@youxi1 ~]# openssl req - new -x509 -nodes - out vsftpd.pem -keyout vsftpd.pem -days 3650 Generating a 2048 bit RSA private key ..............................................................................................................+++ .......................................................................................................................................+++ writing new private key to 'vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.' , the field will be left blank. ----- Country Name (2 letter code) [XX]:CN //输入国家名称(2个字母代码) State or Province Name (full name) []:BeiJing //州或省的全称 Locality Name (eg, city) [Default City]:Beijing //地点名称(例如城市) Organization Name (eg, company) [Default Company Ltd]:TengXun //组织名称(例如公司) Organizational Unit Name (eg, section) []:IT //组织单位名称(例如部门) Common Name (eg, your name or your server's hostname) []:youxi1 //公用名(例如你的或你的服务器的主机名) Email Address []:youxi1@qq.com //邮件地址 |
将文件保存到/etc/vsftpd/.sslkey/目录下,并设置400权限
1 2 3 | [root@youxi1 ~]# mkdir /etc/vsftpd/.sslkey/ [root@youxi1 ~]# mv vsftpd.pem /etc/vsftpd/.sslkey/ [root@youxi1 ~]# chmod 400 /etc/vsftpd/.sslkey/vsftpd.pem |
添加以下参数到配置文件/etc/vsftpd/vsftpd.conf,使其支持OpenSSL:(以下参数需要加在配置文件中间,否则会报错)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ssl_enable=YES //开启SSL支持 allow_anon_ssl=NO //下面四行表示强制匿名用户使用加密登录和数据传输 force_local_data_ssl=YES force_local_logins_ssl=YES force_anon_logins_ssl=YES force_anon_data_ssl=YES ssl_tlsv1=YES //指定vsftpd支持TLS v1 ssl_sslv2=YES //指定vsftpd支持SSL v2 ssl_sslv3=YES //指定vsftpd支持SSL v3 require_ssl_reuse=NO //不重用SSL会话,安全配置项 ssl_ciphers=HIGH //允许用于加密SSL连接的SSL算法 rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem //证书位置 rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem //密钥位置 |
重启vsftpd服务
1 | [root@youxi1 ~]# systemctl restart vsftpd |
如果FTP客户端是CentOS的lftp,直接使用会报错。如下:
1 2 3 4 | [root@youxi2 ~]# lftp 192.168.1.6 -u ftp1 口令: lftp ftp1@192.168.1.6:~> ls ls: 严重错误: Certificate verification: Not trusted |
此时需要在客户端的lftp配置文件/etc/lftp.conf最后添加一行参数,不验证SSL(也不知道会不会出问题),如下:
1 | set ssl:verify-certificate no // |
测试主机youxi2再次使用lftp连接就正常了
1 2 3 4 | [root@youxi2 ~]# lftp 192.168.1.6 -u ftp1 口令: lftp ftp1@192.168.1.6:~> ls -rw-r--r-- 1 0 0 968 May 19 06:21 passwd |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性