Linux搭建 FTP 服务器、SFTP服务器

Linux 运维 同时被 2 个专栏收录
14 篇文章 1 订阅
33 篇文章 0 订阅

使用场景

ftp是大多数网站的文件传输选择工具,但ftp并不是非常安全,并且在centos上搭建的vsftpd也非常的不稳定,偶尔会出现权限问题,例如500、或是账号密码不正确等等。

SFTP是基于默认的22端口,是ssh内含的协议,只要启动了sshd就可以使用

建议:更高的效率使用FTP协议,更安全的通信使用SFTP协议。

sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多

FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资源。而SFTP协议是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全。但是这种安全是以牺牲效率为代价的,也就是说SFTP的传输效率比FTP要低(不过现实使用当中,没有发现多大差别)。个人肤浅的认为就是:

FTP要安装,SFTP不要安装。
SFTP更安全,但更安全带来副作用就是的效率比FTP要低些。

一、linxu 搭建ftp 服务器

华为云文档搭建ftp服务器

二、linxu 搭建sftp服务器

操作步骤
以root用户登录云服务器。
执行以下命令查看ssh版本,OpenSSH版本大于等于4.8p1。

ssh -V

回显信息如下所示:

# OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017

创建用户和组,以user1用户为例。

groupadd sftp
useradd -g sftp -s /sbin/nologin user1

设置用户密码。

passwd user1

图1 设置用户密码
在这里插入图片描述

设置目录权限。

chown root:sftp /home/user1  #文件夹所有者必须为root,用户组可以不是root


chmod 755 -R /home/user1    #权限不能超过755,否则会导致登录报错,可以是755


mkdir /home/user1/upload

chown -R user1:sftp /home/user1/upload
# 新建一个目录供sftp用户user1上传文件,这个目录所有者为user1所有组为sftp,所有者有写入权限所有组无写入权限

chmod -R 755 /home/user1/upload

另外需要注意的是:ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。注意以下两点原则:

1)目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。

2)目录开始一直往上到系统根目录为止都不可以具有群组写入权限

执行以下命令,编辑sshd_config文件。

vim /etc/ssh/sshd_config

注释掉如下信息

#Subsystem sftp /usr/libexec/openssh/sftp-server

补充如下内容:

Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /home/%u 
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no

图2 sshd_config文件补充配置信息后
在这里插入图片描述

重启云服务器,或执行以下命令重启sshd服务。

service sshd restart

或

systemctl restart sshd

执行以下命令,在其他服务器上远程连接到服务器。

三种方式:
sftp root@IP地址

sftp -P 10001 mysftp@127.0.0.1 

sftp -oPort=19222 user1@127.0.0.1

连接成功后,您可以使用交互式的sftp命令。
在这里插入图片描述
执行以下命令,上传或下载文件、文件夹。
上传文件:put -r

在这里插入图片描述

下载文件:get -r
在这里插入图片描述
SFTP命令:

命令格式:sftp 用户名@ip
系统会提示输入密码,按系统要求输入密码

1):默认会进入到当前用户的主目录下。比如root,进入到/root目录。普通用户进入到/home/用户目录

2):远程主机操作

cd 进入某个目录

ls 查看文件列表

pwd 查看当前目录

get 获取某个文件

3):本地主机操作

lcd 进入某个目录

lls 查看文件列表

lpwd 查看当前目录

lget 获取某个文件

put 向服务器放一个文件 sftp 安全文件传输;远程系统 ;是一个交互式文件传输程式,实现Linux
从一台服务器传输文件到另一台服务器,以及其他相关操作。

一、现在想将 主机IP是20.200.2.1 下的 /home/tomcata/a.txt 放到远程主机IP为20.200.2.2 上的 /home/tomcatb/下:

1、sftp tomcatb@20.200.2.2 (首先连接20.200.2.2)
2、提示输入tomcatb用户的密码(输入tomcatb用户的密码)
3、pwd (查看的是20.200.2.2 的当前所在路径)
或 cd /home/tomcatb/ (直接进入20.200.2.2所要复制文件的路径下)
4、ls (查询20.200.2.2的/home/tomcatb/ 下的文件列表)
5、lpwd (查看的是20.200.2.1 的当前所在路径)
或 lcd /home/tomcata/ (直接进入20.200.2.1 a.txt所在的路径下)
6、lls (查询20.200.2.1的/home/tomcata/ 下的文件列表)
7、put a.txt ./ 或
put /home/tomcata/a.txt /home/tomcatb/ (将20.200.2.1 下的 a.txt 放到20.200.2.2下)

二、将从远程主机的 /home/tomcatb/目录下将 index.php 下载到当前主机 /home/tomcata/目录下
sftp> get /home/tomcatb/index.php /home/tomcata/

SFTP 并发连接

系统SSH终端连接数配置过小,查看虚拟机该参数(该参数在/etc/ssh/sshd_config中配置,为MaxStartups),MaxStartups 默认设置是 10:30:100,意思是从第10个连接开始以30%的概率(递增)拒绝新连接,直到连接数达到100为止。

解决方法:

修改/etc/ssh/sshd_config中的MaxStartups,将其改为MaxStartups 1000:30:1200;修改/etc/ssh/sshd_config中的MaxSessions,将其修改为1000
重启SSH服务/etc/init.d/ssh restart
另外,系统的默认连接时间120秒,如果远程终端连接数过多,则会出现超时连接,解决办法如下:

修改/etc/ssh/sshd_config中LoginGraceTime 120,将其改为LoginGraceTime 0,其中0表示不限制连接时间。
重启SSH服务/etc/init.d/ssh restart

SFTP配置文件

配置sshd_config文件

 
[root@localhost ~]# vim /etc/ssh/sshd_config
 
找到如下这行,用#符号注释掉,大致在文件末尾处。 
 
#Subsystem sftp /usr/libexec/openssh/sftp-server
 
Subsystem sftp internal-sftp     #这行指定使用sftp服务使用系统自带的internal-sftp
 
Match Group sftp     #这行用来匹配sftpusers组的用户,如果要匹配多个组,多个组之间用逗号分割; 
 
ChrootDirectory /data/sftp/%u        #用chroot将用户的根目录指定到%h,%h代表用户home目录,这样用户就只能在用户目录下活动。也可用%u,%u代表用户名。
 
ForceCommand internal-sftp    #指定sftp命令 
 
AllowTcpForwarding no
 
X11Forwarding no
 
Match user sftpadmin        #匹配用户了,多个用户名之间也是用逗号分割
 
ChrootDirectory /data/sftp
 
ForceCommand internal-sftp
 
AllowTcpForwarding no
 
X11Forwarding no
 

设置记录sftp服务器的登录及操作日志

既然搭建了sftp服务器,那么通常还是需要知道哪些人在什么时候做了哪些操作,默认情况下sftp服务只会记录相关的登录信息,默认保存在/var/log/audit/audit.log日志下。但是默认的记录方式并不便于管理员获取指定的信息,因此我们可以对sftp日志进行另行的设置指定。

  • 修改/etc/ssh/sshd_config
 
[root@localhost ~]# vim /etc/ssh/sshd_config 
 
Subsystem sftp internal-sftp -l VERBOSE -f AUTH,local5        #设置日志级别为VERBOSE,并指定日志记录的收集设施
 
Match Group sftp
 
ChrootDirectory /data/sftp/%u
 
ForceCommand internal-sftp -l VERBOSE        #设置日志级别为VERBOSE
 
AllowTcpForwarding no
 
X11Forwarding no
 
Match user sftpadmin
 
ChrootDirectory /data/sftp
 
ForceCommand internal-sftp -l VERBOSE        #设置日志级别为VERBOSE
 
AllowTcpForwarding no
 
X11Forwarding no
 
  • 修改rsyslog.conf
 
[root@localhost ~]# vim /etc/rsyslog.conf
 
auth,authpriv.*,local5.* /var/log/sftp.log        #设置将相关的auth、authpriv及local5相关的日志信息记录到/var/log/sftp.log文件
 
  • 重启sshd和rsyslog
 
[root@localhost ~]# service sshd restart
 
Stopping sshd: [ OK ]
 
Starting sshd: s [ OK ]
 
[root@localhost ~]# service rsyslog restart
 
Shutting down system logger: [ OK ]
 
Starting system logger: [ OK ]
 
  • 查看日志
 
[root@localhost ~]# cat /var/log/sftp.log 
 
Jul 12 15:46:46 localhost sshd[1706]: pam_unix(sshd:session): session closed for user sftpadmin
 
Jul 12 15:46:49 localhost unix_chkpwd[1816]: password check failed for user (sftpadmin)
 
Jul 12 15:46:49 localhost sshd[1814]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.10.10.1 user=sftpadmin
 
Jul 12 15:46:50 localhost sshd[1814]: Failed password for sftpadmin from 10.10.10.1 port 61361 ssh2
 
Jul 12 15:46:54 localhost sshd[1814]: Accepted password for sftpadmin from 10.10.10.1 port 61361 ssh2
 
Jul 12 15:46:54 localhost sshd[1814]: pam_unix(sshd:session): session opened for user sftpadmin by (uid=0)
 
Jul 12 15:46:54 localhost sshd[1819]: subsystem request for sftp
 
Jul 12 15:46:54 localhost sshd[1820]: session opened for local user sftpadmin from [10.10.10.1]
 
Jul 12 15:46:54 localhost sshd[1820]: received client version 4
 
Jul 12 15:46:54 localhost sshd[1820]: realpath "."
 
Jul 12 15:46:54 localhost sshd[1820]: opendir "/"
 
Jul 12 15:46:54 localhost sshd[1820]: closedir "/"
 
Jul 12 15:46:55 localhost sshd[1820]: realpath "/charles"
 
Jul 12 15:46:55 localhost sshd[1820]: opendir "/charles"
 
Jul 12 15:46:55 localhost sshd[1820]: closedir "/charles"
 
Jul 12 15:46:56 localhost sshd[1820]: realpath "/charles/share"
 
Jul 12 15:46:56 localhost sshd[1820]: opendir "/charles/share"
 
Jul 12 15:46:56 localhost sshd[1820]: closedir "/charles/share"
 
Jul 12 15:46:58 localhost sshd[1820]: open "/charles/share/New File" flags WRITE,CREATE,TRUNCATE mode 0666
 
Jul 12 15:46:58 localhost sshd[1820]: close "/charles/share/New File" bytes read 0 written 0
 
Jul 12 15:46:58 localhost sshd[1820]: realpath "/charles/share"
 
Jul 12 15:46:58 localhost sshd[1820]: opendir "/charles/share"
 
Jul 12 15:46:58 localhost sshd[1820]: closedir "/charles/share"
 
Jul 12 15:47:01 localhost sshd[1820]: rename old "/charles/share/New File" new "/charles/share/testfile"
 
[root@localhost ~]# 
 

限制ssh连接的访问Ip

 
[root@localhost ~]# vim /etc/ssh/sshd_config 
 
# Authentication:
 
AllowUsers root@10.10.10.*        #限制root用户只能通过10.10.10.*网段登录访问
 
AllowUsers charles@10.10.10.*        #限制charles用户只能通过10.10.10.*网段登录访问
 
AllowUsers john@10.10.10.*
 

sftp的密钥认证

  • 将对应用户的家目录更改回默认路径并修改其属主和属组权限:
 
[root@localhost ~]# usermod -d /home/charles/ charles
 
  • 创建密钥对
 
[root@localhost ~]# mkdir /home/charles/.ssh
 
[root@localhost ~]# ssh-keygen -t rsa
 
Generating public/private rsa key pair.
 
Enter file in which to save the key (/root/.ssh/id_rsa):         #默认保存路径
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:         #输入密钥认证密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
9f:76:8f:e0:a3:68:ae:38:34:cf:7c:7d:b0:0d:77:d3 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| |
| S . |
| o o...o E |
| . = . *=... |
 
| ..+ o.oo+o o |
 
| ...=o .o... . |
 
+-----------------+
 
[root@localhost ~]# cp /root/.ssh/id_rsa.pub /home/charles/.ssh/authorized_keys        #将公钥保存为指定用户的家目录下的authorized_keys,额外的keys可通过cat追加到authorized_keys中
 
[root@localhost ~]# chown -R charles.sftp /home/charles        #修改对应家目录的属主和属组  
 
[root@localhost ~]# service sshd restart        #最后重启sshd服务
 
  • 测试密钥登录sftp
 
[root@localhost ~]# sftp -oIdentityFile=/root/.ssh/id_rsa charles@10.10.10.11
 
Connecting to 10.10.10.11...
 
Enter passphrase for key '/root/.ssh/id_rsa': 
 
sftp> ls
 
share  
 

如上图所示,输入了密钥认证的密码后,应该能正常登录到sftp服务中。

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

胖虎是只mao

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值