Post

SSH配置与使用完全指南

SSH配置与使用完全指南

···感觉一直没写过SSH相关教材,为了便利他人也便利自己,还是发一下吧。

引言

SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络中安全地访问远程计算机。作为系统管理员、开发人员或任何需要远程访问服务器的人,掌握SSH的配置和高效使用方法至关重要。本文将深入探讨SSH的配置细节、安全最佳实践以及提高工作效率的技巧。

基础知识

SSH的工作原理

SSH通过非对称加密技术建立安全连接。当客户端连接到服务器时,它们首先协商加密参数,然后使用公钥加密技术验证服务器身份,最后建立加密通道进行安全通信。

安装SSH

  • 在Linux/macOS上:通常预装了SSH客户端,服务器端可通过以下方式安装:

    1
    2
    3
    4
    5
    6
    
      # Ubuntu/Debian
      sudo apt update
      sudo apt install openssh-server
        
      # CentOS/RHEL
      sudo yum install openssh-server
    
  • 在Windows上:Windows 10/11可通过”可选功能”安装OpenSSH客户端和服务器,或使用PuTTY等第三方工具。

基本连接命令

1
ssh username@hostname

例如,连接到IP为192.168.1.100的服务器:

1
ssh admin@192.168.1.100

SSH客户端配置详解

配置文件位置

SSH客户端配置文件通常位于:

  • 全局配置:/etc/ssh/ssh_config
  • 用户配置:~/.ssh/config(推荐使用此文件进行个人配置)

创建SSH密钥对

使用密钥认证比密码认证更安全:

1
ssh-keygen -t ed25519 -C "your_email@example.com"

现代推荐使用ED25519算法,它提供更好的安全性和性能。如果需要兼容旧系统,可使用:

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

配置主机别名

~/.ssh/config中添加主机配置可大大简化连接过程:

1
2
3
4
5
Host dev-server
    HostName 192.168.1.100
    User admin
    Port 22
    IdentityFile ~/.ssh/id_ed25519

配置后,只需使用ssh dev-server即可连接。

高级客户端配置选项

1
2
3
4
5
6
7
8
9
10
11
12
Host *
    # 保持连接活跃
    ServerAliveInterval 60
    ServerAliveCountMax 3
    
    # 共享连接(加快多次连接速度)
    ControlMaster auto
    ControlPath ~/.ssh/control/%r@%h:%p
    ControlPersist 1h
    
    # 压缩数据传输
    Compression yes

SSH服务器配置安全最佳实践

配置文件位置

SSH服务器配置文件位于:/etc/ssh/sshd_config

提高服务器安全性的关键设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 禁用root登录
PermitRootLogin no

# 禁用密码认证,仅使用密钥认证
PasswordAuthentication no
ChallengeResponseAuthentication no

# 限制SSH版本(仅使用SSHv2)
Protocol 2

# 设置最大认证尝试次数
MaxAuthTries 3

# 限制可以使用SSH的用户
AllowUsers user1 user2

# 修改默认端口(增加安全性)
Port 2222

设置SSH密钥认证

  1. 在客户端生成密钥对

  2. 将公钥复制到服务器:

    1
    
     ssh-copy-id -i ~/.ssh/id_ed25519.pub username@hostname
    

    或手动添加到服务器的~/.ssh/authorized_keys文件

  3. 确保权限正确:

    1
    2
    
     chmod 700 ~/.ssh
     chmod 600 ~/.ssh/authorized_keys
    

SSH高级使用技巧

端口转发

本地端口转发

将本地端口转发到远程服务:

1
ssh -L 8080:localhost:80 username@hostname

这会将本地8080端口的流量转发到远程主机的80端口。

远程端口转发

将远程端口转发到本地服务:

1
ssh -R 8080:localhost:80 username@hostname

动态端口转发(SOCKS代理)

创建SOCKS代理:

1
ssh -D 1080 username@hostname

然后配置浏览器使用localhost:1080作为SOCKS代理。

通过跳板机连接

通过一台中间服务器连接到目标服务器:

1
ssh -J user1@jumphost user2@destination

在配置文件中设置跳板机:

1
2
3
4
Host destination
    HostName target-server.internal
    User admin
    ProxyJump user@jumphost.example.com

执行远程命令

无需登录即可执行远程命令:

1
ssh username@hostname "ls -la /var/log"

传输文件

使用SCP传输文件:

1
2
3
4
5
# 上传文件到服务器
scp local_file.txt username@hostname:/path/to/destination/

# 从服务器下载文件
scp username@hostname:/path/to/remote_file.txt local_destination/

使用SFTP进行交互式文件传输:

1
sftp username@hostname

挂载远程文件系统

使用SSHFS挂载远程文件系统:

1
2
3
4
5
6
# 安装SSHFS
sudo apt install sshfs  # Ubuntu/Debian

# 挂载远程目录
mkdir ~/remote_dir
sshfs username@hostname:/remote/path ~/remote_dir

故障排除与调试

启用详细输出

连接时添加-v参数查看详细信息(增加v的数量可提高详细程度):

1
ssh -vvv username@hostname

常见问题解决

  1. 连接被拒绝:检查服务器SSH服务是否运行、防火墙设置、IP限制等
  2. 密钥认证失败:检查权限设置、authorized_keys文件内容
  3. 连接超时:检查网络连接、防火墙规则、SSH服务器状态

日志检查

服务器SSH日志通常位于:

1
2
/var/log/auth.log  # Debian/Ubuntu
/var/log/secure    # CentOS/RHEL

自动化与集成

使用SSH配置与Git

~/.ssh/config中配置Git仓库主机:

1
2
3
4
Host github.com
    User git
    IdentityFile ~/.ssh/github_key
    IdentitiesOnly yes

SSH与配置管理工具集成

将SSH配置与Ansible、Puppet或Chef等配置管理工具集成,实现批量管理:

1
2
3
4
5
6
7
8
9
# Ansible示例
- name: 配置SSH服务器
  template:
    src: sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: '0600'
  notify: 重启SSH服务

希望本指南能帮助你更好地理解和使用SSH。如有任何问题或补充,欢迎在评论区讨论。


参考资料:

This post is licensed under CC BY 4.0 by the author.