我自仰头向天笑,笑完我就去睡觉,哈哈哈哈……

Linux(CentOS)上配置 SFTP(附解决Write failed: Broken pipe Couldn't read packet: Connection reset by peer)

#创建sftp组:

groupadd sftp

#创建一个用户sftpuser:

useradd -g sftp -s /bin/false sftpuser

#提示:

/etc/group      文件包含所有组
/etc/shadow    /etc/passwd    系统存在的所有用户名

 

#设置sftpuser用户的密码,会要求你输入两次密码确认:

passwd sftpuser

#创建一个sftp的上传目录:

mkdir /datas/www

#修改用户sftpuser所在的目录:

usermod -d /datas/www sftpuser

#配置sshd_config:

vi /etc/ssh/sshd_config
#找到如下这行,并注释掉
#Subsystem sftp /usr/libexec/openssh/sftp-server
#添加如下几行(如果添加之后出现问题,则添加到最后)
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp
Match User sftpuser #这行用来匹配用户
ChrootDirectory /datas/www  #用chroot将用户的根目录指定到/datas/www ,这样用户就只能在/datas/www下活动
AllowTcpForwarding no
ForceCommand internal-sftp #指定sftp命令
为什么用 internal-sftp 而不用默认的 sftp-server,这是因为: 
这是一个进程内的 sftp 服务,当用户 ChrootDirectory 的时候,将不请求任何文件;
更好的性能,不用为 sftp 再开一个进程。

#保存退出

#设定Chroot目录权限:

chown -R root:root /datas/www
chmod 755 /datas/www

#建立SFTP用户登入后可写入的目录:

mkdir /datas/www/sftpuser
chown -R sftpuser:sftp /datas/www/sftpuser/
chmod 755 /datas/www/sftpuser/

#重启sshd服务:

service sshd restart

#测试是否能正常登陆:

sftp -P 22122 ftpuser@127.0.0.1    

#关闭SElinux:

vi /etc/sysconfig/selinux

#找到如下这行 
SELINUX=enforcing

#修改为
SELINUX=disabled

#保存退出

#这里讨论了为什么要关闭这功能:https://www.zhihu.com/question/20559538

 

常见问题:

1、修改sshd_config文件后重启 sshd,报错:Directive 'UseDNS' is not allowed within a Match block

语法错误,原因未知,只需要把两段配置的位置互调就不报错了。

修改前:

Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/

UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes

修改后(就是换个顺序):

UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes

Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/

参考资料:http://www.cnblogs.com/xjnotxj/p/6912471.html

 

 

2、如果你链接服务器的时候出现下面的提示:

> Write failed: Broken pipe     
> Couldn't read packet: Connection reset by peer

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

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

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

  • 上面2点一定注意,仔细检查。我就是因为这个问题,导致一直有这个问题。仔细检查配置后,解决问题。

 

参考资料:

https://segmentfault.com/a/1190000008578734

http://www.cnblogs.com/kgdxpr/p/3623369.html

http://blog.csdn.net/xinxin19881112/article/details/46831311

posted @ 2017-06-23 10:48  轻轻的烟雾  阅读(36234)  评论(3编辑  收藏  举报