openssh加密远程管理 OpenSSH简介 OpenSSH是SSH(Secure Shell)协议的开源实现,主要用于安全地远程登录到计算机系统。它提供了一种加密的方式来进行远程命令行登录、执行命令以及管理文件传输等操作,从而确保了数据在传输过程中的安全性。OpenSSH支持多种认证方式,包括密码认证和公钥认证,并且默认情况下使用强加密算法来保护通信的安全性。传统的网络服务程序,如 FTP、POP 和 Telnet 其本质上都是不安全的,因为它们在默认状态下网络上用明文传送数据。而 SSH 更为可靠,专为远程登录会话和其他网络服务提供安全性的协议,透过 SSH 可以对所有传输的数据进行加密。
ssh的主要功能
加密的远程管理
加密的远程文件传输 scp。scp 默认连接的端口是 22 端口,如果 ssh 不是使用标准的 22 端口则使用-P(P 大写)指定 。
端口映射
openssh的安装 本次案例使用的centos7操作系统进行示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@test ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
OpenSSH 的安装方式因操作系统和环境不同而有所差异,主要安装方式有两种:
通过系统包管理器安装(最推荐、本次示例使用)
从源代码编译安装(适用于需要特定版本、定制功能或系统无包管理器的场景(如嵌入式系统、安全加固环境))
正常情况下,在安装centos系统的时候,系统都会默认安装openssh,可以使用如下命令进行查看是否安装
1 2 3 4 [root@test ~]# rpm -qa | grep openssh openssh-clients-7.4p1-16.el7.x86_64 openssh-server-7.4p1-16.el7.x86_64 openssh-7.4p1-16.el7.x86_64
使用rpm -qa | grep openssh 命令,如果在输出结果中看到,openssh-clients和openssh-server的软件包,那么说明该系统已经安装了openssh,只需要启用即可。 如果没有安装的话,可以使用如下命令进行安装
1 yum -y install openssh.x86_64 openssh-server-7.4p1-16.el7.x86_64 openssh-7.4p1-16.el7.x86_64
openssh-clients-7.4p1-16.el7.x86_64 提供 SSH 客户端工具(用于连接远程主机)
openssh-7.4p1-16.el7.x86_64 OpenSSH 的核心基础库和通用文件
openssh-server-7.4p1-16.el7.x86_64 提供 SSH 服务端(允许别人连接本机)
完成了openssh的安装,接下来只需要启动openss即可,如果该软件包之前已经默认安装了的,那么该服务也是默认开机自启动的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 启动openssh [root@test ~]# systemctl start sshd 查看openssh服务的状态 [root@test ~]# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since 五 2026-01-02 18:48:48 CST; 23h ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 1037 (sshd) Tasks: 1 Memory: 5.6M CGroup: /system.slice/sshd.service └─1037 /usr/sbin/sshd -D openssh的默认端口号是22端口,也可以通过查看端口号,判断该服务是否已经启动(如下所示,该服务已经启动并正常运行) [root@test ~]# ss -luntp | grep 22 tcp LISTEN 0 128 *:22 *:* users :(("sshd",pid=1037 ,fd=3 ))
ssh加密的远程管理 使用ssh可以更好的便于远程管理服务器,通过网络即可实现,在同一网络内任何地方都能登录到服务器内部对服务器进行管理。远程管理命令格式为:ssh username@ip 以windows的cmd为例,通过ssh 用户名@IP地址 的方式,我登录到了10.201.9.133这台服务器中,并且可以执行相关命令进行管理 不过在日常使用中,我们一般不会使用windows自带的cmd去远程管理服务器,都是使用一些三方的软件工具,例如:MobaXterm,没有该工具的小伙伴可以去网上找资源下载下,接下来,介绍下如何使用MobaXterm并通过ssh远程管理服务器。
打开MobaXterm,点击左上角的Session按钮 因为我们使用ssh去进行远程管理的,所以这里的会话选项也选择ssh
点击ok,输入root用户的密码,即可登录到服务器中。
ssh配置文件 ssh作为一个服务,自然少不了配置文件,平常也可以通过配置文件进行管理,一下列举一些常用的配置 ssh配置文件路径: /etc/ssh/sshd_config
vi /etc/ssh/sshd_config ← 用vi打开SSH的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 AddressFamliy any;支持那 IP 协议;比如 ipv4,ipv6,;默认 any; Port 22 :SSH 端口号配置,默认 22; Protocol 2 ; SSH 协议的 2 版本,推荐 2 版本 LoginGraceTime 2m; 输入密码时的等待时长默认 2 分钟,超出则断开会话; ListenAddress IP:监听哪个 IP,默认监听所有 IP; PermitRootlogin Yes\No: 控制 root 登录; PermitEmptyPasswords No:控制空密码登录 PasswordAuthentication Yes:建议禁止密码登录,使用 key 验证登录 Gatewayports Yes\No:端口转发功能; StrickHostKeyChecking Ask\No;登录询问; MaxAuthTries 6 ;密码最多试错次数,是设置数值的一半次数; MaxSessions 10;同一个会话的连接次数;默认 10 个; PubkeyAuthentication yes ;公钥的身份验证开启; Banner /path/file ;用户 SSH 登录前的提示信息; ClientAliveInterval 30: 默认 0 永久连接,可自定义无操作等待时间; UseDNS No : DNS 解析; Maxstartup: 10:30:100:支持 10 个并发连接,超过 10 个,以 30%概率拒绝,超过 60%的并发则 全部拒绝; AllowUsers user1 user2 user3;允许用户登录,其他人拒绝; DenyUsers user1 user2 :拒绝用户登录; AllowUsers 和 DenyUsers 只能配置一个,若设置允许用户,其他用户都不能登录,若设置拒绝 用户,则其他用户都可以登录; AllowGroups :允许组访问,如果没有可以添加; DenyGroups :拒绝组访问,如果没有可以添加;
有些时候,只允许部分网段的客户端通过ssh登录到服务器,以最大限度减少不安全因素 可修改一下两个文件
/etc/hosts.deny 和 /etc/hosts.allow 是 Linux/Unix 系统中用于基于主机的访问控制(Host-based Access Control) 的两个配置文件,它们由 TCP Wrappers(tcpd)机制提供支持,用于限制或允许特定服务(如 SSH、FTP、Telnet 等)对远程主机的访问。
典型配置示例 1、只允许特定 IP 访问 SSH 1 2 3 4 5 [root@node1 ~]# vi /etc/hosts.allow sshd: 10.201.9.1 [root@node1 ~]# vi /etc/hosts.deny sshd: ALL
只有10.201.9.1 能 SSH 登录,其他全部拒绝。
使用除了10.201.9.1 以外的客户端登录ssh提示如下:
2、修改 ssh 端口号 为了安全考虑想要修改默认端口号的话就需要编辑 sshd 配置文件了,vim /etc/ssh/sshd_config 这个文件,这里把#Port 22 这个字段前面的#去掉,再把 22 改成自己要端口就可以了,然后重 启 ssh 服务。
1 2 vim /etc/ssh/sshd_config
重启sshd服务器systemctl restart sshd
查看端口是否监听
1 2 3 [root@node2 local ]# ss -luntp | grep 2200 tcp LISTEN 0 128 *:2200 *:* users :(("sshd",pid=4294 ,fd=3 )) tcp LISTEN 0 128 :::2200 :::* users :(("sshd",pid=4294 ,fd=4 ))
3、ssh服务访问控制 SSH服务的访问控制是保障服务器安全的重要手段。通过合理配置,可以有效防止未授权访问、暴力破解等安全威胁。本次介绍的是通过修改sshd_config中的配置来针对用户或者是用户组的服务访问控制。主要涉及到的配置有以下几点:
AllowUsers/AllowGroups:只允许指定用户 或组
DenyUsers/DenyGroups :明确拒绝某些用户或组
注意:AllowUsers 和 DenyUsers 同时存在时,Allow 优先级更高。
实例: 当前系统中有一个名字叫做aaa的用户,需求:禁止aaa用户进行远程登录,配置如下:
1 2 3 4 5 [root@node1 ~]# vi /etc/ssh/sshd_config DenyUsers aaa [root@node1 ~]# systemctl restart sshd
添加完以上配置之后,在使用aaa用户从其他主机进行远程登录(提示“Permission denied”) 验证: 如果是要禁止多个用户登录的话,就可以考虑使用DenyGroups的方式进行配置。配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@node1 ~]# groupadd nologin [root@node1 ~]# groupmems -g nologin -a bbb [root@node1 ~]# groupmems -g nologin -a ccc [root@node1 ~]# groupmems -g nologin -l bbb ccc [root@node1 ~]# vi /etc/ssh/sshd_config DenyGroups nologin [root@node1 ~]# systemctl restart sshd
验证:
ssh 密钥级身份认证 目前 SSH 连接还需要输入密码,下面将介绍使用密钥进行连接,免去了输入密码的烦恼。 示例环境:
主机名
角色
IP 地址
操作系统版本
用途说明
centos-manager
管理节点
10.201.9.134
CentOS Linux 7
部署控制、监控、调度
centos-node1
工作节点
10.201.9.133
CentOS Linux 7
运行应用容器或服务
以上两台服务器,当manager去通过ssh管理node1的时候,使用密钥连接,不需要输入密码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 首先创建.ssh 的目录 [root@centos-manager ~] mkdir /root/.ssh 然后使用 ssh-keygen 生成密钥,ssh-keygen -t rsa,生成密钥的过程中一路回车就可以。 [root@centos-manager] 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: SHA256:C2PberhNIbtTSp4+U8U2APnEfyODRcHO1m3yBwXi4N8 root@node2 The key's randomart image is: +---[RSA 2048]----+ | .+ o+.. .. | | . +.oo . .| | o O.... . | | o %.=.+ | | = S+ =.=E. | | ..Boo . .| | oo*+ . | | O=. | | .=*. | +----[SHA256]-----+ [root@centos-manager ~] cd /root/.ssh/ [root@centos-manager .ssh] ll -rw-------. 1 root root 1679 1月 1 14:25 id_rsa -rw-r--r--. 1 root root 399 1月 1 14:25 id_rsa.pub
密钥生成完成之后,进入到/root/.ssh 的目录中查看,会多出两个文件,这两个文件就是SSH 密钥对 id_rsa —— 私钥(Private Key)存储在本地,用于证明你的身份。当你尝试 SSH 登录到其他服务器时,SSH 客户端会使用此私钥对服务端的进行签名。 id_rsa.pub —— 公钥(Public Key)内容需要被复制到目标服务器的 ~/.ssh/authorized_keys 文件中。当你用私钥 id_rsa 尝试登录时,目标服务器会用这个公钥验证你的签名是否合法
通过 ssh-copy-id 工具,将公钥传给目标主机manager,然后就可以通过证书无口令登录。
1 2 3 4 5 6 7 8 9 10 [root @centos -manager .ssh ] ssh-copy-id root@10.201 .9.133 /usr/bin/ssh-copy-id : INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id : INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id : INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@10.201 .9.133 's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh ' root@10.201 .9.133 '" and check to make sure that only the key(s) you wanted were added.
ssh-copy-id 此命令会自动将 id_rsa.pub 的内容追加到 centos-node1(目标服务器) 的 /root/.ssh/authorized_keys 中。
免密登录,再次使用ssh登录的时候,就可以实现免密登录
1 2 3 4 5 6 7 8 9 10 11 [root @centos -manager .ssh ] ssh root@10.201 .9.133 Last login: Sat Jan 3 19 :33 :13 2026 from 10.201 .9.140 [root @node1 ~] ifconfig ens33 ens33: flags=4163 <UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.201 .9.133 netmask 255.255 .255.0 broadcast 10.201 .9.255 inet6 fe80::d995:c7fb:4 b15:c27c prefixlen 64 scopeid 0 x20<link> ether 00 :0 c:29 :66 :93 :0 c txqueuelen 1000 (Ethernet) RX packets 47801 bytes 21827862 (20.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 55501 bytes 77025853 (73.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
加密的远程文件传输 scp scp(Secure Copy Protocol)是 Linux/Unix 系统中用于在本地与远程主机之间安全地复制文件和目录的命令。它基于 SSH 协议,因此传输过程是加密的,安全性高。
基本语法:scp [选项] 源路径 目标路径
常用选项:
选项
说明
-r
递归复制整个目录
-P port
指定 SSH 端口(注意是大写 P)
-p
保留文件的修改时间、访问时间和权限模式
-C
启用压缩(加快传输速度)
-v
显示详细输出(调试用)
1 2 3 4 5 6 7 8 9 10 11 [root@node1 opt]# scp /opt/test.sh root@10.201.9.140:/opt root@10.201.9.140's password: test.sh 100% 210 286.5KB/s 00:00 # 从远程主机拉取文件到本地 # scp 用户名@IP地址:远程文件路径 本地路径 [root@node1 opt]# scp root@10.201.9.140:/opt/1.txt /opt/ root@10.201.9.140' s password: 1.txt 100% 0 0.0KB/s 00:00
基于 ssh 的跳板机配置: 基于 SSH 的跳板机(也称为“堡垒机”或“跳转主机”,Jump Host / Bastion Host)是一种常见的安全架构,用于控制对内部网络中服务器的访问。用户必须先通过跳板机,再连接到目标主机,从而减少直接暴露内部主机的风险。
登录方式:
用户 → 跳板机) → 目标主机
所有 SSH 连接都通过跳板机中转
示例:
角色
IP 地址
说明
跳板机
10.201.9.133
用于中转 SSH 连接的堡垒机
目标服务器
10.201.9.140
实际需要访问的节点(Node)
如图所示:客户端无法访问目标服务器node,而是需要通过jumpserver跳板机进行中转才能够访问。
1 2 3 4 5 [root@jumper .ssh]# useradd jumpserver [root@jumper .ssh]# usermod -s /usr/sbin/nologin jumpserver [root@jumper .ssh]# passwd jumpserver
客户端中通过跳板机进行登录 这里以windows的cmd为例,可以看到我们的主机如果是直接访问目标主机的话,是无法通过ssh直接连接的。 通过跳板机进行登录:语法ssh -J 跳板机用户@跳板机IP地址 目标主机用户@目标主机IP地址,可以登录成功,这种方式,虽然可以跳转登录,但是还是暴露了ip地址,更推荐使用ssh端口转发的方式进行跳转登录