Linux OpenSSH 服务管理

SSH 建立连接

SSH 全称 Secure Shell;是基于应用层,为远程登录会话和其他网络服务提供安全性的协议。

准备两台虚拟机进行演示:
可使用hostnamectl set-hostname server/client.[用户名].cloud命令持久化更改主机名加以区分;server代表服务提供端,client代表访问服务端

[root@server ~]# hostnamectl set-hostname server.root.cloud
#IP:10.1.8.10 端口22
[root@server ~]# hostname -I
10.1.8.10 192.168.122.1 
[root@client ~]# hostnamectl set-hostname client.root.cloud
#IP:10.1.8.11 端口22
[root@client ~]# hostname -I
10.1.8.11 192.168.122.1

IP地址可以通过hostname -I命令进行查询,或使用更加详细的ip addr show命令。
已经连接或连接过服务器时可以通过以下命令了解IP地址相关信息:

  • curl ifconfig.me:查询已连接服务器的公网出口IP;
  • who:查看当前登录用户及来源IP;
  • last:查看历史登录IP记录;

现在使用ssh命令就可以使两台虚拟机进行连接。(首次连接会出现提示信息,在提示信息最后输入 yes 即可)
语法:ssh -p [端口号] [用户名]@[主机/IP地址]

[root@client ~]# ssh -p 22 root@server
root@server's password: 
Last login: Mon Nov  3 17:48:46 2025 from 10.1.8.11
[root@client ~]# ssh -p 22 root@10.1.8.10
root@10.1.8.10's password: 
Last login: Mon Nov  3 18:06:57 2025 from 10.1.8.11

该语法中的用户名是远程服务器上的用户账户,不是本地的用户名。
远程服务器可能有多个用户账户,每个账户有不同的权限和文件访问权;指定用户名确保了SSH知道要登录到哪个账户,从而进行身份验证和授权。

如果省略 [用户名]@,SSH会默认使用本地当前用户名,但这可能无法匹配远程账户,导致登录失败。
此外,还可以省略 -p [端口号],ssh默认连接22号端口;这是 SSH 协议的行业标准默认端口。

另外,还可以在命令结尾追加 [远程命令];即ssh -p [端口号] [用户名]@[主机/IP地址] [远程命令]。这样就不会登录服务器,而是在服务器中执行远程命令后立即返回

[root@client ~]# ssh root@10.1.8.10 'hostname -I'
root@10.1.8.10's password: 
10.1.8.10 192.168.122.1 

成功连接服务器后,运行ls ~/.ssh会出现known_hosts文件,否则 ~/.ssh目录为空;known_hosts是公钥指纹存储文件,每一行代表一个服务器的公钥。
每当首次通过 SSH 连接远程服务器时(即首次连接时确认的提示信息),客户端会收到服务器的公钥指纹,known_hosts自动记录此信息。后续连接同一服务器时,系统会对比本地存储的公钥和服务器返回的公钥是否匹配;若公钥不匹配将触发警告。

/etc/ssh/ssh_config是ssh服务的全局配置文件,影响所有用户;用户还可以自主创建的配置文件~/.ssh/config,优先级高于全局配置。需注意 ~/.ssh/config文件的权限不能高于640,即rw- r-- —
如果~/.ssh/config的权限更高(如 644 或 666),SSH会输出警告并忽略该配置文件。(觉得麻烦可以不要创建用户配置)

/etc/ssh/ssh_config常用配置:

  • Host *:匹配所有主机连接;
  • HostName:指定远程主机的实际地址;
  • User:指定登录用户名;
  • IdentityFile:指定私钥文件路径;
  • StrictHostKeyChecking no:禁用严格主机密钥检查;
  • Compression yes:启用数据压缩,在慢速网络中提升传输效率;
  • ServerAliveInterval 60:客户端心跳检测间隔(秒);
  • ForwardAgent yes:启用SSH代理转发,在跳板机场景中传递密钥凭据;

SSH 加密

SSH建立链接包含以下阶段:

  1. ‌TCP连接建立‌:客户端向服务器的22端口发起TCP连接;
  2. SSH协议版本协商阶段:双方交换支持的SSH协议版本,协商使用哪个版本(SSH目前包括SSH1和SSH2两个大版本,如SSH-1.99表示支持SSH2.0);
  3. 密钥和算法协商阶段:服务器将它的主机公钥发送给客户端,客户端验证此服务器公钥(检查~/.ssh/known_hosts文件,首次连接时会提示用户确认);然后双方使用‌Diffie-Hellman算法‌,在不安全的通道上安全地共同生成一个唯一的、共享的‌对称会话密钥,最后协商后续通信将使用的加密算法、消息认证码算法等;
  4. 认证阶段:客户端向服务器证明自己的身份;
  5. 会话请求阶段:认证成功后,客户端请求开启一个交互式会话(如启动一个Shell);
  6. 交互会话阶段:此阶段的所有通信都使用在步骤3中生成的‌对称会话密钥‌进行加密和解密,确保通信的机密性和完整性。非对称加密主要用于最初的密钥交换和身份验证,因为其计算开销较大;

SSH协议是基于非对称加密方法的,即服务器和客户端都会生成自己的公钥和私钥。
公钥用来加密数据;私钥用来解密数据

双向加密过程:

  1. 服务器创建密钥对:服务器端持有一对长期的‌主机密钥‌(包括公钥和私钥);当客户端首次连接时,服务器会将自己的‌公钥‌(也称为主机公钥)发送给客户端,这个公钥用于客户端验证服务器身份,并建立一个临时的安全通道;
  2. 客户端记录服务器公钥并计算自己的公私钥:客户端收到服务器公钥后,保存在本地,用于后续连接时验证服务器身份;同时为了本次会话,客户端也会在内存中临时生成一对‌会话密钥对‌(非对称密钥对);
  3. 客户端使用服务器的公钥加密自己的公钥并发送给服务器:客户端会使用收到的‌服务器公钥‌对自己刚生成的‌会话公钥‌进行加密,然后将这个加密后的结果发送给服务器;由于只有拥有对应私钥的服务器才能解密此信息,这就确保了会话公钥的安全传递;
  4. 双向加解密:服务器收到加密数据后,用自己的‌主机私钥‌解密,得到客户端的‌会话公钥‌;此时,双方都拥有了对方的公钥;

使用ssh-keygen命令可以生成密钥对;执行命令时系统的三次询问依次为:确认私钥保存位置,私钥是否加密,最终确认
不想确认这些问题可以使用ssh-keygen -t rsa -f - -N ‘’ 使系统以默认设置直接输出私钥。

之后在~/.ssh中可以查看私钥(id_rsa)和公钥(id_rsa.pub);
使用ssh-copy-id命令可以将本地主机的公钥自动添加到远程服务器的 ~/.ssh/authorized_keys 文件中,实现 SSH 免密码登录。

首次配置免密码登录前依然需要进行密码连接,可以通过sshpass命令将密码传递给目标服务器;
语法:sshpass [选项] [属性]

sshpass选项作用
-f从文件中读取密码
-p直接在命令行中指定密码
-d从文件描述符中读取密码
-e从环境变量 SSHPASS 中读取密码
[root@client ~]# ls .ssh
id_rsa  id_rsa.pub  known_hosts
[root@client ~]# sshpass -p 123 ssh-copy-id root@10.1.8.10
/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.1.8.10's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.1.8.10'"
and check to make sure that only the key(s) you wanted were added.

[root@client ~]# ssh root@10.1.8.10
Last login: Mon Nov  3 20:48:26 2025 from 10.1.8.11

如果配置密钥后,远程登录仍要需要输入密码验证,可能是远程服务器文件目录的权限问题;SSH服务出于安全考虑,对用户家目录及其内部文件有严格的权限要求
如果目标服务器的权限过于宽松,ssh会拒绝访问服务器。以下为SSH密钥认证权限对照表:

文件/目录权限
‌用户家目录700
~/.ssh700
~/.ssh/authorized_keys600
私钥文件 (id_rsa)600
公钥文件 (id_rsa.pub)无严格限制
~/.ssh/config无严格限制
~/.ssh/known_hosts无严格限制

SSH 自定义配置

可在/etc/ssh/sshd_config中自定义ssh服务配置;
注意/etc/ssh/sshd_config是SSH服务器(sshd守护进程)的配置文件,与SSH客户端(ssh命令)的配置文件/etc/ssh/ssh_config不同。

  • /etc/ssh/sshd_config:定义服务器端的设置;例如监听的端口、认证方式、日志级别等;文件影响所有连接到该服务器的客户端;
  • /etc/ssh/ssh_config:定义客户端在连接到任何SSH服务器时的默认行为;如默认用户名、连接超时等;适用于所有用户;

/etc/ssh/sshd_config常用配置:

  • PermitRootLogin no:禁止 root 用户登录;
    • root用户权限不受限制。
    • root用户存在每个Linux系统,只需要猜密码就可以。
    • 从审计角度来看,很难跟踪哪个授权用户以root身份登录并进行了更改。 如果用户必须以普通用户身份登录并切换到root帐户,则会生成一个日志事件,可用于帮助提供问责制。
  • PermitRootLogin prohibit-password:禁止 root 用户通过密码登录;
  • PasswordAuthentication no:禁止用户使用密码登录。
  • AllowUsers exampleuser:允许特定用户登录,该用户可以提权为root;
  • UseDNS no:客户端连接服务器的时候,服务器不需要反向解析服务端IP地址,提高连接速度;
  • Port 22:监听端口;即能够连接至该服务器的端口号;
Linux系统上搭建OpenSSH服务器是一个相对简单的过程。OpenSSH是一种安全协议,用于在不安全的网络中提供安全的远程登录和其他安全网络服务。以下是搭建OpenSSH服务器的步骤: ### 步骤1:更新系统 首先,确保你的系统是最新的。使用以下命令更新包列表和已安装的软件包: ```bash sudo apt update sudo apt upgrade -y ``` ### 步骤2:安装OpenSSH服务器 使用包管理器安装OpenSSH服务器。对于基于Debian的系统(如Ubuntu),使用`apt`命令: ```bash sudo apt install openssh-server -y ``` 对于基于Red Hat的系统(如CentOS),使用`yum`命令: ```bash sudo yum install openssh-server -y ``` ### 步骤3:启动并启用SSH服务 安装完成后,启动SSH服务并设置其开机自启: ```bash sudo systemctl start ssh sudo systemctl enable ssh ``` ### 步骤4:配置防火墙 如果你启用了防火墙,需要允许SSH流量通过。使用`ufw`(Uncomplicated Firewall): ```bash sudo ufw allow ssh ``` 或者,允许特定的端口(默认是22): ```bash sudo ufw allow 22 ``` ### 步骤5:验证SSH服务状态 检查SSH服务是否正在运行: ```bash sudo systemctl status ssh ``` 你应该看到类似“active (running)”的状态。 ### 步骤6:配置SSH 编辑SSH配置文件以根据需要进行调整: ```bash sudo nano /etc/ssh/sshd_config ``` 常见的配置选项包括更改默认端口、禁用root登录、更改认证方式等。编辑完成后,保存文件并重新启动SSH服务: ```bash sudo systemctl restart ssh ``` ### 步骤7:测试SSH连接 从另一台计算机尝试连接到你的SSH服务器: ```bash ssh username@server_ip ``` 将`username`替换为你的用户名,`server_ip`替换为服务器的IP地址。 ### 总结 通过以上步骤,你应该能够在Linux系统上成功搭建一个OpenSSH服务器,并进行基本的配置和测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值