欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SFTP和FTP区别及安装配置SFTP

程序员文章站 2022-06-01 12:06:13
...

SFTP和FTP区别及安装配置SFTP

适用场景

我们平时习惯了使用ftp来上传下载文件,尤其是很多Linux环境下,我们一般都会通过第三方的SSH工具连接到Linux,但是当我们需要传输文件到Linux服务器当中,很多人习惯用ftp来传输,其实Linux默认是不提供ftp的,需要你额外安装FTP服务器。而且ftp服务器端会占用一定的VPS服务器资源。

主要区别

  • FTP(File Transfer Protocol),即文件传输协议

包括一个FTP服务器和多个FTP客户端。用于Internet上控制文件的双向传输,FTP客户端通过FTP协议在服务器上下载资源
一般情况下,当使用FTP服务的时候,我们都知道默认是21号端口,其实还有一个20号端口。FTP使用两个TCP连接,21号端口负责控制连接,20号端口负责数据连接,这样才不会混乱,FTP可以更好的为我们服务。ftp通常以ASCII码和二进制的方式传输数据,FTP协议的工作方式可以分为主动模式和被动模式两种,主动是指FTP客户端发送PORT命令连接FTP服务器,被动是FTP客户端发送PASV命令连接FTP服务器。
主动模式:在通过21号端口连接好控制通道后,客户端发送给服务器PORT命令,就是给服务器说咱们俩通信你可以在那个端口进行,于是服务器打开20号端口,连接上客户端的指定的端口进行连接,传送数据。需要创建一个新的连接。
被动模式:在通过21号端口连接好控制通道后,客户端发送给服务器PASV命令,就是给服务器说咱们俩通信的端口号你选择,然后服务器随机选择一个端口(大于1024),FTP客户端连接至此端口,进行通信。不需要创建一个新的连接

  • SFTP(Secure File Transfer Protocol),即文件加密传输协议

是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全。
sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。传输双方既要进行密码安全验证,还要进行基于**的安全验证。所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多
在使用linux的centos服务器系统中,两个比较起来,ftp传输会比sftp传输速率快,毕竟sftp牺牲了一定的效率,以保证传输过程的安全。
SFTP优点:
1.可以不用额外安装任何服务器端程序(很多公司为了安全性Linux没有外网环境,只有SSH的时候,想传输文件是很悲催的问题)
2.会更省系统资源
3.SFTP使用加密传输认证信息和传输数据,相对来说会更安全。
4.不需要单独配置

安装配置示例

以下为用户通过密码登陆的,还有一种通过秘钥登陆,

  1. 创建sftp服务用户组及sftp服务根目录并修改权限
[[email protected] ~]# id psbc
id: psbc: no such user
[[email protected] ~]# groups sftp
groups: sftp: no such user
[[email protected] ~]# 
[[email protected] ssh]# chattr -i /etc/group /etc/passwd /etc/shadow /etc/gshadow 
[[email protected] ssh]# lsattr /etc/group /etc/passwd /etc/shadow /etc/gshadow
---------------- /etc/group
---------------- /etc/passwd
---------------- /etc/shadow
---------------- /etc/gshadow
[[email protected] ~]# mkdir -p /test/sftp
[[email protected] ~]# groupadd sftp
[[email protected] ~]# useradd -g sftp -s /sbin/nologin -d /test/sftp/psbc psbc
# -g 用户组; -d 指定家目录; -s 不登陆shell; -M 不创建家目录
[[email protected] psbc]# passwd psbc
[[email protected] ~]# tail -1 /etc/passwd
psbc:x:1001:1001::/test/sftp/psbc:/sbin/nologin
[[email protected] ~]# su - psbc
This account is currently not available.
[[email protected] ~]# cd /test/sftp/
[[email protected] sftp]# ls
psbc
[[email protected] sftp]# cd psbc/
[[email protected] psbc]# mkdir -p upload
[[email protected] psbc]# mkdir -p download
[[email protected] psbc]# ll /test/sftp/
总用量 0
drwx------. 4 psbc sftp 92 6月   8 11:37 psbc
[[email protected] sftp]# chown -R root:sftp psbc
[[email protected] sftp]# chmod 755 psbc/
[[email protected] sftp]# ll /test/sftp/
总用量 0
drwxr-xr-x. 4 root sftp 92 6月   8 11:37 psbc
[[email protected] sftp]# cd psbc/
[[email protected] psbc]# ll
总用量 0
drwxr-xr-x. 2 root sftp 6 6月   8 11:37 download
drwxr-xr-x. 2 root sftp 6 6月   8 11:37 upload
[[email protected] psbc]# chown psbc:sftp ./*  (权限很重要啊 很重要!)
[[email protected] psbc]# chmod 755  ./*
[[email protected] psbc]# ll
总用量 0
drwxr-xr-x. 2 psbc sftp 6 6月   8 11:37 download
drwxr-xr-x. 2 psbc sftp 6 6月   8 11:37 upload
  1. 修改sshd配置文件
[[email protected] ~]# cp /etc/ssh/sshd_config{,.bak}
[[email protected] ~]# vim /etc/ssh/sshd_config
17 ListenAddress 0.0.0.0:22
18 ListenAddress 0.0.0.0:2222   (行数仅供参考)
39 PermitRootLogin no
40 AllowUsers zbh psbc  (我设置的不允许root登陆 所以这里也要记得添加sftp用户)
134 #Subsystem      sftp    /usr/libexec/sftp-server
113 Subsystem       sftp    internal-sftp
137 # Example of overriding settings on a per-user basis
138 #Match User anoncvs
139 #       X11Forwarding no
140 #       AllowTcpForwarding no
141 #       PermitTTY no
142 #       ForceCommand cvs server
143 
144 Match Group sftp
145         ChrootDirectory /test/sftp/%u 
146         X11Forwarding no
147         AllowTcpForwarding no
148         ForceCommand internal-sftp

• Match Group sftp 这一行是指定以下的子行配置是匹配 sftp 用户组的。Match user userA,userB 则是匹配用户。
• ChrootDirectory /data/sftp/%u 设定属于用户组 sftp 的用户访问的根文件夹。%h 代表用户 home 目录,%u 代表用户名。
• ForceCommand internal-sftp 该行强制执行内部 sftp,并忽略任何 ~/.ssh/rc 文件中的命令。
• AllowTcpForwarding no 是否允许 TCP 转发,默认值为 “yes”, 禁止 TCP 转发并不能增强安全性,除非禁止了用户对 shell 的访问,因为用户可以安装他们自己的转发器。
• X11Forwarding no 是否允许进行 X11 转发。默认值是 “no”,设为 “yes” 表示允许。如果允许 X11 转发并且 sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。那么将可能有额外的信息被泄漏。由于使用 X11 转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止 X11 转发并不能禁止用户转发 X11 通信,因为用户可以安装他们自己的转发器。

  1. 重启服务使其生效
[[email protected] ~ ]# systemctl restart sshd 
[[email protected] psbc]# netstat -anpt |grep sshd
tcp        0      0 0.0.0.0:2222            0.0.0.0:*               LISTEN      26005/sshd          
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      26005/sshd          
tcp        0      0 192.168.17.136:22       192.168.17.15:60240     ESTABLISHED 1508/sshd: [email protected] 
tcp        0      0 192.168.17.175:22       192.168.17.10:63728     ESTABLISHED 25907/sshd: zbh [pr 
tcp        0      0 192.168.17.136:22       192.168.17.15:65352     ESTABLISHED 1904/sshd: [email protected] 
tcp        0      0 192.168.17.175:22       192.168.17.15:49673     ESTABLISHED 1972/sshd: [email protected] 
  1. 登陆用户验证
[[email protected] psbc]# sftp -P 2222 [email protected]
The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
ECDSA key fingerprint is SHA256:KW/l1qcEgtv5gK3kwFGeO2ZBfjwRbXGrbKu4erPJYy4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:2222' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Connected to [email protected]
sftp> ls
download  upload    
sftp> pwd
Remote working directory: /
sftp> cd upload           
sftp> ls
test  
sftp> get test   
Fetching /upload/test to test
/upload/test                                                                                                     100%   15    51.8KB/s   00:00    
sftp>
到此搭建sftp及创建用户psbc成功
  1. 遇到的错误及解决办法
  • packet_write_wait: Connection to 127.0.0.1 port 2222: Broken pipe
[[email protected] psbc]# sftp -P 2222 [email protected]
Authorized only.All activity will be monitored and reported.
[email protected]'s password: 
packet_write_wait: Connection to 127.0.0.1 port 2222: Broken pipe 
Connection Closed.
Connection Closed.

解决办法:

/test/sftp/psbc(ChrootDirectory) 的用户必须为 root
[[email protected] ~ ]# chown -R root:sftp /test/sftp/psbc
  • Remote readdir("/"): Permission denied
Sftp登陆后,没有读的权限
sftp> ls remote readdir("/"): Permission denied

解决办法:

/test/sftp/psbc(ChrootDirectory) 组sftp必须要有读权限
[[email protected] ~ ]# chmod -R 755 /test/sftp/psbc

参考文档:https://www.cnblogs.com/binarylei/p/9201975.html