搭建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端口建立数据通道。

搭建FTP服务器详解程序员

 

2)被动模式工作原理:

  建立控制通道:客户端发起连接请求,包含用户名、密码、客户端随机开放的一个高位端口(1024以上)以及连接模式PASV命令等。服务器接收后响应客户端,服务器的21端口与提供的随机高位端口建立控制通道。

  建立数据通道:服务器会随机开放一个高位端口(1024以上)告知客户端用于建立数据通道,客户端开放一个随机高位端口(1024以上)与服务器随机开放的高位端口连接。

 搭建FTP服务器详解程序员

  底下这张是Windows下的FTP被动连接:

搭建FTP服务器详解程序员

(3).实验

1)服务器端安装vsftpd,客户端安装lftp

  服务器端

[[email protected] ~]# yum -y install vsftpd

  客户端

[[email protected] ~]# 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配置文件中与匿名用户有关的参数如下:

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,这样匿名用户才能操作目录下的文件:

[[email protected] pub]# chown ftp:ftp /var/ftp/pub 

  注意:vsftp是相对安全的FTP工具,所以并不允许/var/ftp/给予匿名用户写权限

  然后启动vsftpd服务,并开机自启:

[[email protected] pub]# systemctl start vsftpd 
[[email protected] pub]# systemctl enable vsftpd

  这时可以使用Window匿名登录,创建文件夹、上传文件

搭建FTP服务器详解程序员

  也可以在Linux上使用lftp匿名登录

[[email protected] ~]# 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上添加普通用户,但禁止登录系统,并赋予密码:

[[email protected] ~]# useradd -s /sbin/nologin ftp1 
[[email protected] ~]# useradd -s /sbin/nologin ftp2 
[[email protected] ~]# echo "ftp1:123456" | chpasswd 
[[email protected] ~]# echo "ftp2:123456" | chpasswd  

  在/etc/vsftpd/vsftpd.conf配置文件中与之相关的参数如下:

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/,以及被囚禁用户列表文件

[[email protected] ~]# mkdir -p /www/html 
[[email protected] ~]# vim /etc/vsftpd/chroot_list 
ftp1 
ftp2 

  修改被囚禁用户的主目录权限

[[email protected] ~]# chmod o+w /www/html/  //如果是已存在文件,需要使用-R选项递归 
[[email protected] ~]# ls -ld /www/html/ 
drwxr-xrwx 2 root root 6 5月  19 14:13 /www/html/ 

  重启vsftpd服务

[[email protected] ~]# systemctl restart vsftpd 

  到测试主机youxi2上测试

[[email protected] ~]# lftp 192.168.1.6 -u ftp1,123456 
lftp [email protected]:~> ls 
ls: 登录失败: 530 Login incorrect.  

  网上找了找相关问题,一个是/etc/vsftpd/vsftpd.conf配置文件参数应该如下:

pam_service_name=vsftpd  //这个我原本就是 

  还有一个是/etc/pam.d/vsftpd注释掉如下参数:

#auth       required    pam_shells.so 

  然后再重启vsftpd服务

[[email protected] ~]# systemctl restart vsftpd 

  这时候再到测试主机youxi2上

[[email protected] pam.d]# lftp 192.168.1.6 -u ftp1 
口令:  
lftp [email protected]:~> ls            
-rw-r--r--    1 0        0             968 May 19 06:21 passwd 

(4).OpenSSL加密FTP传输

   使用OpenSSL生成自签证书

//req是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令 
//-x509是X.509 证书数据管理 
//-days是定义证书有效时间 
//-keyout是设置密钥存储文件 
//-out是设置证书存储位置,注意证书与密钥保存在同一个文件 
[[email protected] ~]# 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 
[[email protected] ~]# 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 []:[email protected]//邮件地址 

  将文件保存到/etc/vsftpd/.sslkey/目录下,并设置400权限

[[email protected] ~]# mkdir /etc/vsftpd/.sslkey/ 
[[email protected] ~]# mv vsftpd.pem /etc/vsftpd/.sslkey/ 
[[email protected] ~]# chmod 400 /etc/vsftpd/.sslkey/vsftpd.pem 

  添加以下参数到配置文件/etc/vsftpd/vsftpd.conf,使其支持OpenSSL:(以下参数需要加在配置文件中间,否则会报错)

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服务

[[email protected] ~]# systemctl restart vsftpd 

  如果FTP客户端是CentOS的lftp,直接使用会报错。如下:

[[email protected] ~]# lftp 192.168.1.6 -u ftp1 
口令:  
lftp [email protected]:~> ls            
ls: 严重错误: Certificate verification: Not trusted 

  此时需要在客户端的lftp配置文件/etc/lftp.conf最后添加一行参数,不验证SSL(也不知道会不会出问题),如下:

set ssl:verify-certificate no  // 

  测试主机youxi2再次使用lftp连接就正常了

[[email protected] ~]# lftp 192.168.1.6 -u ftp1 
口令:  
lftp [email protected]:~> ls            
-rw-r--r--    1 0        0             968 May 19 06:21 passwd 

  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/2779.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论