首页 Linux正文

FTP服务原理与基本配置

王昊 Linux 2019-08-02 319 0
ftp是一种文件传输协议,FTP会话包含了两个通道,数据通道和命令通道。FTP的工作模式有两种,主动模式(PORT模式)和被动模式(PASV模式),均以FTP服务器作为参照物。FTP服务器主动连接客户端为主动模式,FTP服务器等待客户端连接为被动模式。

主动模式工作原理:

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

  建立数据通道:服务器发送连接请求,包含服务器的20端口。客户端接收后响应请求,随机开放一个高位端口(1024以上),客户端的随机高位端口与服务器的20端口建立数据通道。

被动模式工作原理:

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

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

实验环境:

FTP服务器:192.168.17.195

测试主机:192.168.17.196

VSFTP是C/S模式,默认端口21传输指令,20传输数据

相关配置

服务器端

yum -y install vsftpd

客户端

yum -y install lftp

服务器端相关文件

/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/  默认情况下匿名用户的根目录

1、匿名用户访问

vim /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服务器上匿名用户的根目录 /var/ftp/pub/属主和属组改为ftp,这样匿名用户才能操作目录下的文件

chown ftp:ftp /var/ftp/pub

chmod o+w /var/ftp/pub

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

启动vsftpd服务,并加入开机自启

systemctl start vsftpd

systemctl enable vsftpd

解决方法是

匿名登陆的用户名为:anonymous,密码为空,当时匿名登陆时候,必须确保pub目录对匿名用户开放:

chmod o+w /var/ftp/pub

同时更改SELinux设置:

setsebool -P ftpd_full_access=on

此时再对共享目录做修改就不会报550的错误了

也可以去测试主机上使用 lftp 匿名登陆

[root@localhost ~]# lftp 192.168.17.195
lftp 192.168.17.195:~> ls              
drwxr-xrwx    3 14       50             25 Jul 22 08:32 pub
lftp 192.168.17.195:/> cd pub/

注意:这里并不建议开启匿名登录

2、使用指定的系统用户只能访问指定的目录

在服务器端添加普通用户,并赋予密码,但是禁止登陆系统

useradd -s /sbin/nologin ftp1
useradd -s /sbin/nologin ftp2
echo "ftp1:123456" | chpasswd
echo "ftp2:123456" | chpasswd

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

mkdir -p /www/html

vim /etc/vsftpd/chroot_list

ftp1 
ftp2

创建测试文件

touch /www/html/195.txt

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

chmod -R o+w /www/html/

ls -ld /www/html/

drwxr-xrwx. 2 root root 6 Jul 22 16:51 /www/html/

重启vsftpd服务

systemctl restart vsftpd

测试主机上测试

lftp 192.168.17.195 u ftp1,123456
lftp 192.168.17.195:~> ls
`ls' at 0 [Delaying before reconnect: 37] 

登陆失败

解决方法:

回服务器端修改

vim /etc/pam.d/vsftpd

将以下内容注释掉

auth       required    pam_shells.so

再重启vsftpd服务

systemctl restart vsftpd

再到测试主机上测试

lftp 192.168.17.195 -u ftp1
Password: 
lftp ftp1@192.168.17.195:~> ls         
-rw-r--r--    1 0        0               0 Jul 22 09:06 195.txt

3、使用OpenSSL生成自签证书加密FTP传输

服务器端

openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 365

new:生成新证书签署请求; -x509:生成自签格式证书; -out:生成的请求文件路径,自签操作直接生成签署过的证书; -days:证书的有效时长,单位是day

Country Name (2 letter code) [XX]: # 两个字符表示的国家代码,CN为中国

State or Province Name (full name) []: # 省或洲的完整名称

Locality Name (eg, city) [Default City]: # 所在位置的名称(默认为城市)

Organization Name (eg, company) [Default Company Ltd]: # 组织机构名称(默认为公司)

Organizational Unit Name (eg, section) []: # 组织机构单元名称(eg.部门)

Common Name (eg, your name or your server’s hostname) []: # 持有者名或者所在服务器主机名(即域名)

Email Address []: # 管理员邮件地址,可以省略

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

mkdir /etc/vsftpd/.sslkey/

mv vsftpd.pem /etc/vsftpd/.sslkey/

chmod 400 /etc/vsftpd/.sslkey/vsftpd.pem

将以下参数添加到配置文件/etc/vsftpd/vsftpd.conf,使其支持OpenSSL:(以下参数需要加在配置文件中间,否则会报错,这里我也不知道为啥…)

vim /etc/vsftpd/vsftpd.conf

ssl_enable=YES
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
ssl_sslv2=YES
ssl_sslv3=YES
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem

重启vsftpd服务

systemctl restart vsftpd

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

测试主机:

lftp 192.168.17.195 -u ftp1
Password: 
lftp ftp1@192.168.17.195:~> ls
ls: Fatal error: Certificate verification: Not trusted

解决方法是:

vim /etc/lftp.conf

set ssl:verify-certificate no

再次使用 lftp 进行测试

lftp 192.168.17.195 -u ftp1
Password: 
lftp ftp1@192.168.17.195:~> ls         
-rw-r--r--    1 0        0               0 Jul 22 09:06 195.txt

lftp相关命令

下载:

mget -c *.txt    #把所有的txt文件以允许断点续传的方式下载。
mirror www/      #将aaa目录整个的下载下来,子目录也会自动复制。
pget -c -n 10 file.dat   #以最多10个线程以允许断点续传的方式下载file.dat,可以通过设置pget:default-n的值而使用默认值。

上传:

mirror -R 本地目录名
将本地目录以迭代(包括子目录)的方式反向上传到ftp目录中
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论