sftp&&ssh服务配置一站式指南

sftp&&ssh服务配置一站式指南

三葉Leaves Author


SSH和SFTP服务对于运维人员来说必不可少,网上的教程不是太深就是太浅,我撰写该文章,旨在为广大入门运维的朋友提供一些干货

通常情况下,Windows作为SSH的客户端,Linux(如Ubuntu和CentOS)作为SSH的服务端,这很好理解,Linux广泛应用于企业服务器

用Ubuntu配置sftp&ssh服务

参考了这两篇教程:
SFTP服务器的搭建与使用_sftp服务器搭建-CSDN博客
Ubuntu 配置 SFTP 服务器_ubuntu sftp-CSDN博客
其中

  • 教程1有java的代码实现
  • 涉及一些权限修改内容

==root用户(不在意权限分发)可以直接用下面的步骤快速使用==


1.安装sftp服务

1
2
sudo apt update
sudo apt install openssh-server openssh-client -y

sftp是openssh里面的一个子协议


2.编辑配置文件/etc/ssh/sshd_config

如果没有UI界面,可以使用vim编辑器
这里要注意是sshd而不是ssh,前者对应的是服务端后者是客户端

2.1 将如下这行用#符号注释掉

(为什么要注释掉可以看这篇文章【OpenSSH】internal-sftp和sftp-server之间的区别和联系什么? - 简书 (jianshu.com)

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

2.2 在文件最后面添加如下几行内容然后保存(最好放在文件末尾)

1
2
3
4
5
6
7
8
Subsystem       sftp    internal-sftp   
Match Group sftp
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitRootLogin yes
PasswordAuthentication yes

大模型Copilot对此的解释如下:

  1. Subsystem sftp internal-sftp
    • 这行定义了一个 SFTP 子系统,使用 internal-sftp 作为 SFTP 服务器。
  2. Match Group sftp
    • 这行表示接下来的配置只适用于属于 sftp 组的用户。
  3. ChrootDirectory /sftp/%u
    • 这行将用户的根目录(chroot)设置为 /sftp/%u,其中 %u 会被替换为用户的用户名。这意味着用户只能访问他们自己的目录,增强了安全性。
  4. ForceCommand internal-sftp
    • 这行强制用户只能使用 internal-sftp 命令,限制他们只能进行 SFTP 操作,不能执行其他命令。
  5. AllowTcpForwarding no
    • 这行禁用了 TCP 转发,进一步限制了用户的操作权限,防止他们通过 SSH 隧道进行端口转发。
  6. X11Forwarding no
    • 这行禁用了 X11 转发,防止用户通过 SSH 隧道转发 X11 图形界面
  7. PermitRootLogin yes
    • 允许用户通过root登录。在终端里使用命令echo "PermitRootLogin yes" >> /etc/ssh/sshd_config能达到同样效果(需要service ssh restart)

如遇到只读文件不可编辑的情况,可使用以下命令赋权

1
sudo chmod a+w 文件名

3.修改ssh所用端口号(可选)

由于ipv4地址稀缺之类的原因,大概率vps提供商或者你自己用了NAT技术,那么也许sftp的默认22端口就无法使用
这时候你需要修改sftp的默认端口号为目前可用的端口(比如我的vps提供商给我开了十个端口,你自己的NAS也可以在你家路由器里添加端口映射)
在sshd_config文件里,将

1
# port 22

改为

1
port <可用的端口,不含括号>

完成后别忘了保存
改完之后,貌似ssh远控的端口也会随之修改了


4. 重启sshd服务

1
service ssh restart

这边可能遇到如下图一样的报错
Failed to restart sshd.service: Unit sshd.service not found.

此时就需要进一步排查了,

  1. 先测试能不能ping通主机

  2. 检查sshd的安装情况

    1
    ps -e | grep ssh

    成功安装会如下图所示

  3. 测试端口是否开启(ssh服务默认用22端口)

    1
    ss -ntl

ss类似于netstat命令,直接使用貌似会列出所有进程端口。
-n 选项表示以数字形式显示地址和端口,而不是尝试将其解析为主机名和服务名。
-t 选项表示仅显示 TCP 套接字。
-l 选项表示仅显示监听套接字。

也许你的终端会提示bash: ss: command not found,ss命令依赖于iproute2,那么我们就先安装即可,命令如下

1
apt install -y iproute2

完成后再使用刚才的命令。我这里就是只显示了表头,下面并没有任何信息(尤其是与sshd有关端口的)

看来是sshd服务并未启动,那就使其重启,命令如下

1
systemctl enable ssh.service

查了一下资料,systemd是Linux的一种服务管理器,这让我想起了Windows里也有类似的GUI工具

命令进行后,竟然提示我permission denied,吓得我赶紧用sudo -i提权了一下,再次用一遍命令即可,此时service sshd restart已经可用。
再用一遍进程显示的命令,可以看到22端口已经乖乖运行


5.验证服务

1
sftp -P 11165 root@127.0.0.1 

中间的11165是前面设置的可用的端口号
服务正常的话,日志应该如下

1
2
3
4
5
6
root@hbcm-7k62-nat1-202409041216467fca88:~# sftp -P 11165 mysftp@127.0.0.1
The authenticity of host '[127.0.0.1]:11165 ([127.0.0.1]:11165)' can't be established.
ECDSA key fingerprint is SHA256:F5M7HVRlp/0SmsEC0J6ivw/RmRHDBEw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[127.0.0.1]:11165' (ECDSA) to the list of known hosts.
mysftp@127.0.0.1's password:

会要求你输密码,输入后就能进入sftp命令层了

如果登录失败,可能是遭遇了一个权限问题,在上文提到的sshd.config的设置项里,有一个参数PermitRootLogin限定root用户通过ssh的登录方式,如禁止登陆、禁止密码登录、仅允许密钥登陆和开放登陆。需要设置成yes获取所有权限:

1
PermitRootLogin yes

更多细节可以参考这篇文章:
sshd_config 中 PermitRootLogin 的探讨-CSDN博客
不过我这里默认的是Fobidden开头的,文章里并未提到,但是有了这个思路以后自己搜一下也很方便了。

6.windows为例使用sftp进行测试

为了让事情变得更简单,还要批量传文件,我选择用一个sftp客户端,例如WinSCP,会要求输入主机(即为公网ip)和端口号(默认为22,你需要修改为前面你设置的),用户名和密码就是Linux的登入账户信息

理论上,sftp可以挂载到资源管理器(Exploer)里使用,这就变成了一个文件夹一样交互。但是看来看去,因为Windows本身没有sftp的内部支持,还要做协议接口转换,太复杂。实在想搞网络存储挂载的话,可以使用WebDAV协议,而不是SFTP。
SMB用作局域网传输,WebDAV或者SMB+VPN作为广域网传输,永远是网络存储最好的方案。

其他实现文件传输的方式

WinSCP其实支持多种文件传输协议,各种协议的区别可见这里
SFTP,SMB,FTP,SCP选哪种?

用Windows配置sftp&ssh服务

作为客户端,有诸多客户端程序可选:

  1. PowerShell
    直接用原生的终端进行一些简单的操作未尝不可

    原生终端使用ssh
    原生终端使用ssh

  2. PuTTY
    很质朴的应用,提供一个简洁的界面供你输入地址和端口号,但也仅此而已

    PuTTY
    PuTTY

  3. 一些第三方做的SSH工具,集成了sftp服务,还能保存一些自定义命令将来快捷使用,同时也有好看的GUI界面 ,比如Termius

    使用Termius作为ssh客户端
    使用Termius作为ssh客户端

作为服务端,你可以参考以下实践:

  1. 启用 OpenSSH 服务器
    • 打开“控制面板” > “程序” > “程序和功能” > “启用或关闭 Windows 功能”。
    • 在“Windows 功能”窗口中,找到并勾选“OpenSSH 服务器”。
    • 点击“确定”安装 OpenSSH 服务器。
  2. 配置 OpenSSH 服务器
    • 安装完成后,您可以通过搜索并打开“服务”应用来配置 OpenSSH 服务器。
    • 找到“OpenSSH SSH Server”服务,右键点击选择“属性”。
    • 在“登录”选项卡中,确保选择了“本地系统账户”,并勾选“允许服务与桌面交互”(如果需要图形界面登录)。
    • 在“恢复”选项卡中,设置失败时的恢复操作。
    • 启动服务。
  3. 设置防火墙规则(如果需要):
    • 打开“Windows 防火墙”设置。
    • 允许入站连接到 SSH 服务的端口(默认是 22)。
  4. 生成 SSH 密钥对(如果需要无密码登录):
    • 在 Windows PowerShell 中,您可以使用 New-SSHKey 命令生成新的 SSH 密钥对。
    • 将生成的公钥复制到客户端的 ~/.ssh/id_rsa.pub 文件中。
  5. 连接到 Windows SSH 服务器
    • 使用 SSH 客户端(如 PuTTY 或 Windows 10 及更高版本的 Windows Subsystem for Linux (WSL) 中的 SSH 客户端)连接到 Windows 主机。
    • 使用格式如下的命令:ssh username@hostname -p port,其中 username 是 Windows 用户名,hostname 是 Windows 主机的 IP 地址,port 是 SSH 服务监听的端口(默认是 22)。
  • 标题: sftp&&ssh服务配置一站式指南
  • 作者: 三葉Leaves
  • 创建于 : 2024-09-04 00:00:00
  • 更新于 : 2024-11-21 16:56:20
  • 链接: https://leavesblog.netlify.app/6128f81adc0c/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论