文件共享 - FTP
- 1 FTP
- 1.1 传输方式
- 1. ASCII传输方式
- 2. 二进制传输模式
- 3. 两种传输方式的区别
- 1.2 支持的模式
- 1. 主动模式(PORT)
- 2. 被动模式(PASV)
- 3. 如何选择
- 4. 为什么绝大部分互联网应用都是被动模式?
- 1.3 搭建FTP服务器(使用vsftpd)
- 1. 安装软件
- 2. 关闭防火墙
- 3. 启动vsftpd服务
- 4. 查看端口
- 5. 主配置文件
- 6. 默认目录
- 7. 登录ftp
- 8. 基本指令
- 9. 示例
- 2 FTPS
- 2.1 两种模式
- 1. FTPS 隐式 SSL
- 2. FTPS 显式 SSL
- 2.2 搭建FTPS服务器
- 1. 编辑openssl配置文件
- 2. 生成相关文件
- 3. 搭建本地CA服务器
- 4. 给自己发证
- 5. 修改vsftpd配置文件/etc/vsftpd/vsftpd.conf
- 6.重启服务,进行测试
- 3 SFTP
- 3.1 SFTP数据传输过程
- 3.2 搭建sftp
- 1. 关闭防火墙和selinux
- 2. 安装SSH服务
- 3. 新建用户和SFTP目录
- 4. 配置SSH和SFTP服务器
- 5. 重启并配置防火墙
- 6. 访问测试
- 7. SFTP常用命令
- 4 SFTP 和FTPS的区别
- 5 常见连接错误
本文将介绍FTP/SFTP/FTPS使用方法
1 FTP
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
与大多数Internet服务一样,FTP也是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。
1.1 传输方式
FTP的传输有两种方式:ASCII、二进制。
1. ASCII传输方式
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。
2. 二进制传输模式
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)
3. 两种传输方式的区别
ASCII模式和Binary模式的区别是回车换行的处理,Binary模式不对数据进行任何处理,ASCII模式将回车换行转换为本机的回车字符,比如:UNIX下是\n
,Windows下是\r\n
,Mac下是\r
。
ASCII模式下会转换文件,不能说是不同系统对回车换行解释不同,而是不同的系统有不同的行结束符。UNIX系统下行结束符是一个字节,即十六进制的0A,而Windows的系统是两个字节,即十六进制的0D0A,所以当你用ASCII方式从UNIX的FTP Server下载文件到Windows系统上时(不管是二进制或者文本文件),每检测到一个字节是0A,就会自动插入一个0D,所以如果你的文件是二进制文件,比如可执行文件、压缩包什么的,就肯定不能用了。如果你的文件就是UNIX下的文本文件,你用ASCII模式是正确的,要是误用了Binary模式,你在Windows上看这个文件是没有换行的,里面是一个个的黑方块。
一般来说,我们最好都用Binary方式,这样可以保证不出错。如果有文本格式转换的问题,即UNIX格式的文本和DOS格式的文本之间的转换,有很多工具可以做的,不要在ftp传输的时候冒险,尤其是你如果对这些东西不是非常清楚的话。
1.2 支持的模式
1. 主动模式(PORT)
主动模式的工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据。
2. 被动模式(PASV)
被动模式的工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV(PASV是Passive的缩写)命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输。原理如下图:
3. 如何选择
如果工作中一定要使用FTP服务器,在今天的互联网环境里面,使用FTP被动模式进行连接传输就可以了。如果只是想知道答案的朋友,看到这里就可以了。对技术和原理感兴趣的朋友,请继续往下看。
从上面的运行原理可以看到,主动模式和被动模式区别简单概述为:
- a. 主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。
- b.主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难;被动模式只需要服务器端开放端口给客户端连接就行了。
需要注意的是,被动模式和主动模式的登录过程,都是FTP客户端去连接FTP服务器。
4. 为什么绝大部分互联网应用都是被动模式?
因为大部分客户端都是在路由器后面,没有独立的公网IP地址,服务器想要主动连接客户端,难度太大,在现在真实的互联网环境里面几乎是不可能完成的任务。在FTP服务器部署的时候,其默认采用的是主动操作模式。如果企业FTP服务器的用户都是在内部网络中的,即不用像外部网络的用户提供FTP连接的需求,那么采用这个默认操作方式就可以了。但是如果一些出差在外的员工或者员工在家庭办公时也需要访问企业内部的FTP服务器,而此时出于安全的考虑或者公网IP 地址数量的限制,企业往往会把FTP服务器部署在防火墙或者NAT服务器的后面,此时这个主动操作模式就不行了。
总之,在FTP服务器部署的时候考虑是要采用主动操作模式还是被动操作模式,只需要记住一个原则,即如果把FTP服务器部署在防火墙或者NAT服务器的背后,则采用主动操作模式的客户端只能够建立命令连接而无法进行文件传输。如果部署完FTP服务器后,系统管理员发现用户可以连接上FTP服务器,可以查看目录下的文件,但是却无法下载或者上传文件,如果排除权限方面的限制外,那么很有可能就是这个操作模式选择错误。系统管理员告诉用户选择合适的操作模式, 基本上就可以解决文件传输的问题了。
1.3 搭建FTP服务器(使用vsftpd)
1. 安装软件
yum -y install vsftpd
2. 关闭防火墙
firewall-cmd --state
systemctl stop firewalld
3. 启动vsftpd服务
systemctl start vsftpd
systemctl enable vsftpd
4. 查看端口
[root@node1 ~]# netstat -antup | grep ftp
tcp6 0 0 :::21 :::* LISTEN 87368/vsftpd
5. 主配置文件
主配置文件/etc/vsftpd/vsftpd.conf
#修改下列参数的值:
anonymous_enable=NO #禁止匿名登录FTP服务器。
local_enable=YES #允许本地用户登录FTP服务器。
listen=YES #监听IPv4 sockets。
#=========================================================================================
#在行首添加#注释掉以下参数:
#listen_ipv6=YES #关闭监听IPv6 sockets。
#=========================================================================================
#在配置文件的末尾添加下列参数:
local_root=/var/ftp/test #设置本地用户登录后所在目录。
chroot_local_user=YES #全部用户被限制在主目录。
chroot_list_enable=YES #启用例外用户名单。
chroot_list_file=/etc/vsftpd/chroot_list #指定例外用户列表文件,列表中用户不被锁定在主目录。
pasv_enable=YES #开启被动模式。
allow_writeable_chroot=YES #允许更改主目录内容
pasv_address=<FTP服务器公网IP地址> #Linux实例的公网IP。
pasv_min_port=<port number> #设置被动模式下,建立数据传输可使用的端口范围的最小值。建议您把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性。
pasv_max_port=<port number> #设置被动模式下,建立数据传输可使用的端口范围的最大值。
① 实现可以匿名登录,创建文件夹
sed -i 's/anonymous_enable=YES/anonymous_enable=NO/' /etc/vsftpd/vsftpd.conf #禁止匿名登录FTP服务器
sed -i 's/listen=NO/listen=YES/' /etc/vsftpd/vsftpd.conf #监听IPv4 sockets
sed -i 's/listen_ipv6=YES/#listen_ipv6=YES/' /etc/vsftpd/vsftpd.conf #关闭监听IPv6 sockets
sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd/vsftpd.conf #全部用户被限制在主目录
sed -i 's/#chroot_list_enable=YES/chroot_list_enable=YES/' /etc/vsftpd/vsftpd.conf #启用例外用户名单
sed -i 's/#chroot_list_file=/chroot_list_file=/' /etc/vsftpd/vsftpd.conf #指定例外用户列表文件,列表中的用户不被锁定在主目录
echo "allow_writeable_chroot=YES" >> /etc/vsftpd/vsftpd.conf
echo "local_root=/var/ftp/test" >> /etc/vsftpd/vsftpd.conf #设置本地用户登录后所在的目录
echo "pasv_enable=YES" >> /etc/vsftpd/vsftpd.conf #开启被动模式
echo "pasv_address=<47.103.143.207>" >> /etc/vsftpd/vsftpd.conf #本教程中为ECS服务器弹性IP
echo "pasv_min_port=20" >> /etc/vsftpd/vsftpd.conf #设置被动模式下,建立数据传输可使用的端口范围的最小值
echo "pasv_max_port=21" >> /etc/vsftpd/vsftpd.conf #设置被动模式下,建立数据传输可使用的端口范围的最大值
② 添加例外用户名单
编辑chroot_list文件,添加例外用户名单。此名单中的用户不会被锁定在主目录,可以访问其他目录。
说明: 没有例外用户时,也必须创建chroot_list文件,内容可为空。
③ 重启vsftpd服务。
[root@node1 ~]# systemctl restart vsftpd
④ linux访问ftp
需要下载ftp 客户端(注意vsftpd是服务端)
yum -y install ftp
6. 默认目录
如果是默认安装vsftpd的话,以下是一些文件的位置约定:
- /usr/sbin/vsftpd ---- VSFTPD的主程序
- /etc/rc.d/init.d/vsftpd ---- 启动脚本
- /etc/vsftpd/vsftpd.conf ---- 主配置文件
- /etc/pam.d/vsftpd ---- PAM认证文件
- /etc/vsftpd.ftpusers ---- 禁止使用VSFTPD的用户列表文件
- /etc/vsftpd.user_list ---- 禁止或允许使用VSFTPD的用户列表文件
- /var/ftp ---- 匿名用户主目录
- /var/ftp/pub ---- 匿名用户的下载目录
如果要更改默认下载目录,修改/etc/vsftpd/vsftpd.conf,加入如下三行:
local_root=/
chroot_local_user=YES
anon_root=/
local_root表示使用本地用户登录到ftp时的默认目录
anon_root表示匿名用户登录到ftp时的默认目录
默认的chroot_list_file是设定锁定登陆用户在其home目录的列表,要在chroot_list_enable=YES情况下才生效。
7. 登录ftp
vsftpd的配置,配置文件中限定了vsftpd用户连接控制配置。
- ftpusers:位于/etc/vsftpd目录下。它指定了哪些用户账户不能访问FTP服务器,例如root等。
- user_list:位于/etc/vsftpd目录下。该文件里的用户账户在默认情况下也不能访问FTP服务器,仅当vsftpd .conf配置文件里启用userlist_enable=NO选项时才允许访问。
其他的账号正常都可以访问ftp了
[root@zabbix-svr-2 conf.d]# ftp 192.168.71.183
Connected to 192.168.71.183 (192.168.71.183).
220 (vsFTPd 3.0.2)
Name (192.168.71.183:root): yurq
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
8. 基本指令
ftp> ascii # 设定以ASCII方式传送文件(缺省值)
ftp> bell # 每完成一次文件传送,报警提示.
ftp> binary # 设定以二进制方式传送文件.
ftp> bye # 终止主机FTP进程,并退出FTP管理方式.
ftp> case # 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母.
ftp> cd # 同UNIX的CD命令.
ftp> cdup # 返回上一级目录.
ftp> chmod # 改变远端主机的文件权限.
ftp> close # 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除.
ftp> delete # 删除远端主机中的文件.
ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件.
ftp> get [remote-file] [local-file] # 从远端主机中传送至本地主机中.
ftp> help [command] # 输出命令的解释.
ftp> lcd # 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录.
ftp> ls [remote-directory] [local-file] # 同DIR.
ftp> macdef # 定义宏命令.
ftp> mdelete [remote-files] # 删除一批文件.
ftp> mget [remote-files] # 从远端主机接收一批文件至本地主机.
ftp> mkdir directory-name # 在远端主机中建立目录.
ftp> mput local-files # 将本地主机中一批文件传送至远端主机.
ftp> open host [port] # 重新建立一个新的连接.
ftp> prompt # 交互提示模式.
ftp> put local-file [remote-file] # 将本地一个文件传送至远端主机中.
ftp> pwd # 列出当前远端主机目录.
ftp> quit # 同BYE.
ftp> recv remote-file [local-file] # 同GET.
ftp> rename [from] [to] # 改变远端主机中的文件名.
ftp> rmdir directory-name # 删除远端主机中的目录.
ftp> send local-file [remote-file] # 同PUT.
ftp> status # 显示当前FTP的状态.
ftp> system # 显示远端主机系统类型.
ftp> user user-name [password] [account] # 重新以别的用户名登录远端主机.
ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。
ftp> ! # 从 ftp 子系统退出到外壳。
9. 示例
不得不说这些自带的命令真是很难用,有兴趣的读者可以安装lftp
进行相关操作
ftp> pwd
257 "/var/ftp/test"
ftp> dir /var/ftp/test
227 Entering Passive Mode (192,168,71,183,130,194).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Mar 08 17:41 1
-rw-r--r-- 1 0 0 0 Mar 08 17:41 2
-rw-r--r-- 1 0 0 0 Mar 08 17:41 3
226 Directory send OK.
ftp> get 1 /tmp/1
local: /tmp/1 remote: 1
227 Entering Passive Mode (192,168,71,183,110,5).
150 Opening BINARY mode data connection for 1 (0 bytes).
226 Transfer complete.
ftp> exit
221 Goodbye.
[root@zabbix-svr-2 conf.d]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Mar 8 04:42 1
2 FTPS
FTPS是在安全套接层使用标准的FTP协议和指令的一种增强型FTP协议,为FTP协议和数据通道增加了SSL安全功能。FTPS也称作“FTP-SSL”和“FTP-over-SSL”。SSL是一个在客户机和具有SSL功能的服务器之间的安全连接中对数据进行加密和解密的协议。
2.1 两种模式
1. FTPS 隐式 SSL
该模式通常在端口 990 上运行。在这个模式下全部数据的交换都需要在客户端和服务器之间建立 SSL 会话,并且服务器会拒绝任何不使用 SSL 进行的连接尝试。SSL/TLS协议在传输层(TCP/IP)之上、但是在应用层之下工作的。因此,它可以很容易在诸如HTTP,Telnet,POP3,IMAP4,SMTP和FTP等应用层协议上实现。
2. FTPS 显式 SSL
显示 SSL 下服务器可以同时支持 FTP 和 FTPS 会话。开始会话前客户端需要先建立与 FTP 服务器的未加密连接,并在发送用户凭证前先发送 AUTH TLS 或 AUTH SSL 命令来请求服务器将命令通道切换到 SSL 加密通道,成功建立通道后再将用户凭证发送到 FTP 服务器,从而保证在会话期间的任何命令都可以通过 SSL 通道自动加密。
总结,当启用隐式模式时,FTP 的默认端口就被改为 TCP/990,服务器自动建立安全连接,并且要求客户端也必须支持安全连接模式也就是使用 SSL 进行连接。当启用显式模式时,与 FTP 连接方式和默认端口一样,但是需要以命令 AUTH SSL/TLS 类型的命令进行激活安全连接后才能正常传输数据。
2.2 搭建FTPS服务器
FTPS又称作“FTP-SSL”和“FTP-over-SSL”,所以我们在ftp服务器的示例基础上,设置ssl和ca即可以完成FTPS服务器
1. 编辑openssl配置文件
先编辑一下openssl.cnf配置文件,修改[ policy_match ]模块下加粗内容
[ policy_match ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
保存文件并退出。
2. 生成相关文件
进入到与CA服务器有关的目录,生成index.txt和serial文件,并且给serial文件赋初始值为“01”
[root@zabbix-svr-2 CA]# ls
certs crl newcerts private
[root@zabbix-svr-2 CA]# touch index.txt
[root@zabbix-svr-2 CA]# touch serial
[root@zabbix-svr-2 CA]# echo '01'> serial
3. 搭建本地CA服务器
使用非对称加密算法rsa,采用1024为算法,得到一个密钥存放在private/cakey.pem中
openssl genrsa 1024 > private/cakey.pem
私钥不允许别人查看,所以将cakey.pem文件的权限改为600,只有所属用户可以读写
chmod 600 private/cakey.pem
使用CA服务器自己的私钥cakey.pem产生一个证书cacert.pem
[root@zabbix-svr-2 CA]# openssl genrsa 1024 > private/cakey.pem
Generating RSA private key, 1024 bit long modulus
..............++++++
..........................................................................................................................++++++
e is 65537 (0x10001)
[root@zabbix-svr-2 CA]# chmod 600 private/cakey.pem
[root@zabbix-svr-2 CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem -days 3650
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
State or Province Name (full name) []:LN
Locality Name (eg, city) [Default City]:SY
Organization Name (eg, company) [Default Company Ltd]:MX
Organizational Unit Name (eg, section) []:DB
Common Name (eg, your name or your server's hostname) []:192.168.70.183
Email Address []:
创建一个目录,存放于vsftp有关的证书,证书请求,密钥
[root@zabbix-svr-2 CA]# mkdir -pv /etc/vsftpd/certs
mkdir: created directory ‘/etc/vsftpd/certs’
[root@zabbix-svr-2 CA]# cd /etc/vsftpd/certs/
非对称加密算法rsa,使用1024位,算出一个密钥vsftp.key
[root@zabbix-svr-2 certs]# openssl genrsa 1024 >vsftpd.key #利用私钥vsftp.key产生一个证书请求文件vsftp.csr
Generating RSA private key, 1024 bit long modulus
........................++++++
.............++++++
e is 65537 (0x10001)
[root@zabbix-svr-2 certs]# openssl req -new -key vsftpd.key -out vsftpd.csr #利用证书请求文件的到一个证书vsftp.cert
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
State or Province Name (full name) []:LN
Locality Name (eg, city) [Default City]:SY
Organization Name (eg, company) [Default Company Ltd]:SW
Organizational Unit Name (eg, section) []:DBC
Common Name (eg, your name or your server's hostname) []:192.168.70.183
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:swww
4. 给自己发证
[root@zabbix-svr-2 certs]# openssl ca -in vsftpd.csr -out vsftpd.cert
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Mar 9 05:43:09 2023 GMT
Not After : Mar 8 05:43:09 2024 GMT
Subject:
countryName = CN
stateOrProvinceName = LN
organizationName = SW
organizationalUnitName = DBC
commonName = 192.168.70.183
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
6F:C6:8E:51:B2:1D:29:B6:17:DD:FE:41:5E:F4:86:EE:31:40:27:AF
X509v3 Authority Key Identifier:
keyid:79:8F:83:04:33:A8:5C:37:E9:F7:A4:1C:2F:46:D1:15:6E:24:4E:86
Certificate is to be certified until Mar 8 05:43:09 2024 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
将该目录下的文件权限全部改为600,即所属用户可读写
chmod 600 *
5. 修改vsftpd配置文件/etc/vsftpd/vsftpd.conf
local_root=/var/ftp/test
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pasv_enable=YES
allow_writeable_chroot=YES
ssl_enable=YES
ssl_tlsv1_2=YES
ssl_sslv2=YES
ssl_sslv3=YES
rsa_cert_file=/etc/vsftpd/certs/vsftpd.cert
rsa_private_key_file=/etc/vsftpd/certs/vsftpd.key
6.重启服务,进行测试
systemctl restart vsftpd
OK就可以了
3 SFTP
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一个组件,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
3.1 SFTP数据传输过程
在进行SFTP数据传输前,首先需要建立SSH加密通道,如下图所示。
-
SSH客户端主动发起TCP请求,和SSH服务器建立TCP会话。
-
SSH客户端和SSH服务器协商认证方式。当前SSH有两种认证方式:口令认证和秘钥认证。
- 2.1 如果使用口令认证,则SSH秘钥协商过程是,SSH服务器主动发送公钥给SSH客户端。SSH客户端收到公钥后,使用公钥对登陆密码加密,并回送给SSH服务器。SSH服务器使用私钥进行数据解密,并验证SSH客户端的信息合法性,如果验证通过则建立连接,进行加密通信。
- 2.2 如果使用秘钥认证,则SSH秘钥协商过程是,SSH客户端主动发送客户端公钥给SSH服务器。SSH服务器收到信息后,检查服务器的授权列表中是否包含SSH客户端的公钥。如果存在,则生成一个随机数,并使用SSH客户端的公钥加密,生成密文回送给SSH客户端。SSH客户单收到密文后,使用私钥解密,并将随机数发回SSH服务器。SSH服务器验证随机数,如果一致,则认证通过,连接建立。
-
SSH加密通道建立完成后,SFTP即可进行数据传输,上传和下载文件。
3.2 搭建sftp
1. 关闭防火墙和selinux
为了避免不必要的麻烦,我们先关闭防火墙和selinux,等搭建成功之后再开启防火墙和相应的端口
[root@centos7 ~]# systemctl status firewalld.service # 查看防火墙状态
[root@centos7 ~]# systemctl stop firewalld.service # 停止防火墙服务
[root@centos7 ~]# systemctl disable firewalld.service # 关闭防火墙开启自启动
# 把文件中的SELINUX=enforcing 改为SELINUX=disabled
[root@centos7 ~]# vim /etc/selinux/config
[root@centos7 ~]# setenforce 0 # 使修改马上生效
2. 安装SSH服务
在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可
查看是否已经安装了ssh
[root@centos7 ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 # 代表已安装
[root@centos7 ~]# rpm -qa|grep openssh*
openssh-clients-7.4p1-22.el7_9.x86_64
openssh-7.4p1-22.el7_9.x86_64
openssl-devel-1.0.2k-25.el7_9.x86_64
openssl-1.0.2k-25.el7_9.x86_64
xmlsec1-openssl-1.2.20-7.el7_4.x86_64
openssl-libs-1.0.2k-25.el7_9.x86_64
openssh-server-7.4p1-22.el7_9.x86_64 # 代表已安装
[root@centos7 ~]# yum install -y openssl* openssh* # 如果已经安装,再次执行yum就会把软件包升级到最新版本
如果未安装,安装ssh
yum install -y openssl openssh-server
设置为开机自动启动服务
[root@centos7 ~]# systemctl enable sshd.service
[root@centos7 ~]# systemctl start sshd.service # 启动服务
systemctl stop sshd.service # 停止服务
systemctl restart sshd.service # 重启服务
systemctl status sshd.service # 查看服务状态
systemctl enable sshd.service # 设置开机自启动sshd服务
systemctl disable sshd.service # 禁用开机自启动sshd服务
3. 新建用户和SFTP目录
sftpuser是你为该sftp服务创建的用户名,/data/sftp/sftpuser为sftp服务器访问路径
新建SFTP目录并授权
mkdir -p /data/sftp/sftpuser
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
新建sftp组及用户
# 新建用户组sftp
groupadd sftp
# 新建用户sftpuser,并且设置不支持ssh系统登录,只能登录sftp服务器
# -g 用户组; -d 指定家目录; -s 不能登陆系统; -M 不创建家目录
useradd -g sftp -d /data/sftp/sftpuser -M -s /sbin/nologin sftpuser
# 设置密码
# echo "新密码" | passwd --stdin 用户名
echo "sftppassword" | passwd --stdin sftpuser
新建SFTP用户可写目录
# 由于/data/sftp/sftpuser的用户是root,其它用户都没有写的权限
# 所以要在该目录下新建一个目录用于文件的上传下载
mkdir -p /data/sftp/sftpuser/upload
chown sftpuser:sftp /data/sftp/sftpuser/upload
chmod 755 /data/sftp/sftpuser/upload
4. 配置SSH和SFTP服务器
# 防止后期配置文件出错后无法还原,备份配置文件
[root@centos7 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
[root@centos7 ~]# cd /etc/ssh/
[root@centos7 ssh]# ll
......
-rw------- 1 root root 4084 8月 11 22:55 sshd_config
-rw------- 1 root root 4084 8月 15 10:22 sshd_config.back
......
配置SSH
vim /etc/ssh/sshd_config
# 修改下面的内容,没有的内容直接新增即可
# 下面这几项的默认值也是它们,所以这一步可以跳过
PermitRootLogin yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
配置SFTP
vim /etc/ssh/sshd_config
# 注释掉这行
# Subsystem sftp /usr/libexec/openssh/sftp-server
# 文件末尾添加以下内容
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
# 下面两项是与安全有关
AllowTcpForwarding no
X11Forwarding no
5. 重启并配置防火墙
systemctl enable firewalld.service # 重启防火墙开机自启动
systemctl restart firewalld.service # 重启防火墙服务
firewall-cmd --version # 查看防火墙版本
firewall-cmd --list-all # 查看已开放的端口
firewall-cmd --permanent --zone=public --add-port=22/tcp # 开通sftp服务22默认端口
firewall-cmd --reload # 刷新防火墙,重新载入
# 关闭Selinux策略
setsebool -P ftpd_full_access on
sed -i s#enforcing#disabled#g /etc/sysconfig/selinux
setenforce 0 && getenforce
getenforce
重启SFTP服务
systemctl restart sshd.service
至此,SFTP其实就已经搭建成功,可以登录了!
6. 访问测试
查看IP地址,创建测试文件
ip a
# 进入之前设置好的路径
[root@centos7 ~]# cd /data/sftp/sftpuser/upload
# 新建测试文件,然后保存退出
[root@centos7 upload]# vim 测试_20220712.txt
[root@centos7 upload]#
终端访问测试
sftp命令
[root@centos7 upload]# sftp sftpuser:sftppassword@192.168.10.110
sftpuser:sftppassword@192.168.10.110's password: # 密码输入不显示,正常输入后直接按回车就行
Connected to 192.168.10.110.
sftp> pwd
Remote working directory: /
sftp> cd upload/
sftp> pwd
Remote working directory: /upload
sftp> lls
测试_20220712.txt
sftp> exit
7. SFTP常用命令
ls 查看当前目录下文件
help 查看sftp支持哪些命令
cd 指定目录
pwd 查看当前目录
get xxx.txt 下载xxx文件
put xxx.txt 上传xxx文件
quit / bye / exit 退出sftp
sftp xxx.xxx.xxx.xxx 登录root用户
sftp zygf@xxx.xxx.xxx.xxx 进行登录zygf用户
4 SFTP 和FTPS的区别
SFTP 和FTPS都是提供安全的链接,协议非常相似。
FTPS借助ssl协议加密,SFTP借助ssh加密。
ssl是为http/smtp等加密设计的,SSL证书是HTTP明文协议升级HTTPS加密协议的重要渠道,是网络安全传输的加密到通道。ssh是为telnet/ftp等加密、建立传输通道而设计的。
其实ssh建立传输通道就是为了加密和传输,而且这个通道是可以用来远程登录。如果只说它们的功能,通俗的讲,ssh就像铺管子,ssl就像打包裹,铺管子和打包裹都会使数据安全,都是一个制作密钥的过程,而因为ssh是一个管子所以它很适合ftp的安全传输。
简单的讲:sftp协议是ssh中的一条独立的协议,利用sftp服务器就可以传输数据。而ftps是ftp-over-ssl的意思,即ftp借助ssl协议加密传输,不但要用ftp服务器还要用ssl协议加密。(如果是ftp-over-ssh,就是完全不同于sftp的传输方式了,就是利用ftp服务器和ssh协议加密传输数据。 )
这两种协议是不同的。sftp是ssh内含的协议,仅仅要sshd server启动了,它就可用,它本身不须要ftp server启动。ftps则象一个二传手。
5 常见连接错误
-
Connect 连接被拒绝: 可能原因是vsftpd服务没被启动
-
530 Permission denied: 可能原因是userlist_enable=YES并且/etc/vsftpd/user_list中包含要登录的ftp用户名 即user_list禁止了该用户的登录、或者可能是没有指定userlist_file=/etc/vsftpd/user_list
-
530 Login incorrect: 可能原因是登录的ftp用户名被包含在禁止登录列表/etc/vsftpdftpusers中 | 同时要确保用户名、密码是正确的 | 也可能是配置文件中少了一行pam_service_name=vsftpd | 检查/etc/pam.d/vsftpd 文件里面lib的路径 | 编辑/etc/pam.d/vsftp文件,注释掉auth required pam_shells.so(这个语句的意思是只有包含shell的用户才能登录)
-
530 Non-anonymous sessions must use encryption.:服务器的强制,非匿名用户必须使用加密连接
-
500 OOPS: cannot open user list file:可能原因是不存在文件“/etc/vsftpd/user_list”或文件中不存在该帐户,解决:解决: cho username >> /etc/vsftpd/user_list
-
500 OOPS: cannot open chroot() user list file | 500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list:可能原因是不存在文件“/etc/vsftpd/chroot_list”
-
500 OOPS: missing value in config file: 可能原因是配置文件“=”等号前值有问题,或只有一个空格
-
500 OOPS: bad bool value in config file: 可能原因是配置文件=”等号后值有问题
-
500 OOPS: unrecognised variable in config file: 可能原因是参数前有空格
-
500 OOPS: chdir, 500 OOPS: child died, 500 OOPS: chroot:可能原因是用户主目录没有权限或没有主目录,或者还是selinux影响的
-
500 OOPS: vsftpd: both local and anonymous access disabled!匿名用户和本地用户登录都被禁用
-
GnuTLS error -12: A TLS fatal alert has been received.:received.:Filezilla最新版本认为vsftpd默认的加密算法”DES-CBC3-SHA”不够安全而拒绝连接导致的。有两种办法解决该问题,一是降级你的Filezilla客户端版本到3.5.3以下,二是更改服务器端vsftpd的配置,增加参数:ssl_ciphers=HIGH
-
ECONNREFUSED – Connection refused by server: 当启用隐式ssl连接,用filezilla、winscp客户端连接时报错,因为vsftpd此时服务器端的端口还是21,但是客户端确以990来连接。修改客户端连接时使用的参数或者服务器的通过参数listen_port设置端口为990,问题解决