SSH连接设置:从入门到精通 – wiki大全

SSH连接设置:从入门到精通

SSH(Secure Shell Protocol)是一种加密的网络协议,用于在不安全的网络上安全地执行网络服务,最常见的是远程命令行登录。它提供了强大的加密和认证机制,确保数据传输的机密性和完整性。本文将从入门到精通,详细介绍SSH连接的设置与使用。

一、 SSH连接基础:理解与安装

1. 什么是SSH?

SSH协议旨在替代Telnet、rlogin、rsh等不安全的远程登录协议。它通过在客户端和服务器之间建立加密通道,防止数据被窃听或篡改。SSH主要提供以下功能:
* 远程命令行执行:安全地在远程服务器上运行命令。
* 端口转发/隧道:通过加密通道转发其他网络服务的流量。
* 文件传输:使用SCP(Secure Copy Protocol)或SFTP(SSH File Transfer Protocol)安全地传输文件。

2. SSH客户端与服务器

  • SSH客户端:用于发起SSH连接的程序。
    • Linux/macOS:通常内置OpenSSH客户端,直接在终端使用ssh命令。
    • Windows
      • Windows 10/11:内置OpenSSH客户端,可在PowerShell或CMD中使用ssh命令。
      • 旧版Windows:常用PuTTY等第三方客户端。
  • SSH服务器:监听SSH连接请求的程序。最常见的是OpenSSH服务器(sshd)。

3. 安装SSH(如果未安装)

  • Linux (Debian/Ubuntu):
    bash
    sudo apt update
    sudo apt install openssh-server openssh-client
  • Linux (CentOS/RHEL):
    bash
    sudo yum update
    sudo yum install openssh-server openssh-clients
    sudo systemctl enable sshd
    sudo systemctl start sshd
  • Windows 10/11 (OpenSSH客户端和服务器):
    1. 打开“设置” -> “应用” -> “可选功能”。
    2. 点击“添加可选功能”。
    3. 搜索并安装“OpenSSH 客户端”和“OpenSSH 服务器”。
    4. 服务器安装后,可通过“服务”应用启动OpenSSH SSH Server服务,并设置为自动启动。

二、 SSH连接入门:密码认证

最直接的SSH连接方式是使用用户名和密码。

1. 基本连接命令

在客户端终端中输入:
bash
ssh username@remote_host

* username:你在远程服务器上的用户名。
* remote_host:远程服务器的IP地址或域名。

示例
bash
ssh [email protected]
ssh [email protected]

首次连接到新的服务器时,SSH客户端会提示你确认服务器的RSA指纹。这是为了防止中间人攻击。如果确认无误,输入yes,服务器的指纹将被添加到~/.ssh/known_hosts文件中。

2. 指定端口

如果SSH服务器监听的不是默认端口22,可以使用-p选项指定端口:
bash
ssh -p 2222 username@remote_host

3. 常见问题与解决

  • Permission denied (publickey, password).:可能是密码错误,或者服务器禁止密码认证(推荐更安全的密钥认证)。
  • Connection refused:SSH服务器可能未运行,或防火墙阻止了连接。检查服务器的SSH服务状态和防火墙设置。
    • Linux防火墙 (ufw): sudo ufw allow sshsudo ufw allow 22/tcp
    • Linux防火墙 (firewalld): sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload

三、 SSH连接进阶:密钥认证(推荐)

密钥认证是比密码认证更安全、更便捷的SSH连接方式。它涉及一对密钥:一个私钥(保存在客户端,绝不能泄露)和一个公钥(保存在服务器)。

1. 生成SSH密钥对

客户端终端中运行:
bash
ssh-keygen -t rsa -b 4096 -C "[email protected]"

* -t rsa:指定密钥类型为RSA。
* -b 4096:指定密钥长度为4096位(更安全,推荐)。
* -C "[email protected]":为公钥添加注释,方便识别。

按照提示操作:
* Enter file in which to save the key (…):可以直接回车使用默认路径(~/.ssh/id_rsa)。
* Enter passphrase (empty for no passphrase):强烈建议为私钥设置一个密码短语(passphrase)。这会额外保护你的私钥,即使私钥文件泄露,没有密码短语也无法使用。每次使用私钥时都需要输入此短语。

成功生成后,你会在~/.ssh/目录下看到两个文件:
* id_rsa:私钥文件(Private Key),权限应严格限制(通常是600)。
* id_rsa.pub:公钥文件(Public Key)。

2. 上传公钥到服务器

将公钥(id_rsa.pub)上传到远程服务器有几种方法:

方法一:使用ssh-copy-id(推荐)
这是最简单、最安全的方式:
bash
ssh-copy-id -i ~/.ssh/id_rsa.pub username@remote_host

它会提示你输入远程服务器的密码,然后将公钥添加到服务器用户主目录下的~/.ssh/authorized_keys文件中。

方法二:手动复制
如果ssh-copy-id不可用,可以手动复制公钥内容:
1. 在客户端查看公钥内容
bash
cat ~/.ssh/id_rsa.pub

复制输出的所有内容。
2. 登录到远程服务器
bash
ssh username@remote_host

输入密码登录。
3. 在服务器上创建.ssh目录并设置权限(如果不存在):
bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh

4. 将公钥内容添加到authorized_keys文件
bash
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

你的公钥内容替换为你从客户端复制的内容。确保authorized_keys文件只有所有者有读写权限。

3. 使用密钥认证连接

上传公钥后,再次尝试连接:
bash
ssh username@remote_host

如果私钥有密码短语,会提示你输入。成功后,你将无需密码即可登录。

4. 禁用密码认证(增强安全性)

在服务器上编辑SSH配置文件/etc/ssh/sshd_config,找到并修改或添加以下行:
PasswordAuthentication no
重要:在禁用密码认证前,务必确认你的密钥认证已经成功,并且你有一个备用登录方式(如控制台访问),以防万一。

保存文件并重启SSH服务:
* Linux (systemd): sudo systemctl restart sshd
* Linux (init.d): sudo service ssh restart

四、 SSH高级用法

1. SSH配置文件 (~/.ssh/config)

为了简化连接命令和管理多个服务器,可以在客户端创建和编辑SSH配置文件:~/.ssh/config
示例配置:
“`
Host myserver
HostName 192.168.1.100
User user
Port 2222
IdentityFile ~/.ssh/id_rsa_myserver # 为不同服务器指定不同私钥
IdentitiesOnly yes # 仅使用IdentityFile指定的私钥

Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github

Host *
ForwardAgent yes # 默认开启SSH代理转发
ServerAliveInterval 60 # 防止连接超时断开
ServerAliveCountMax 3 # 允许三次不响应后断开
``
使用配置后,只需输入
ssh myserver`即可连接。

2. SSH代理 (ssh-agent)

如果你的私钥设置了密码短语,每次连接都需要输入。ssh-agent可以帮助你管理私钥,只需在会话开始时输入一次密码短语。

  1. 启动ssh-agent
    bash
    eval "$(ssh-agent -s)"
  2. 将私钥添加到代理
    bash
    ssh-add ~/.ssh/id_rsa

    如果私钥有密码短语,此时会提示输入。
    你可以添加多个私钥:ssh-add ~/.ssh/id_rsa_myserver
  3. 验证已加载的私钥
    bash
    ssh-add -l

    现在,在本终端会话中,所有需要使用这些私钥的SSH连接都不再需要输入密码短语。

3. SSH端口转发/隧道

SSH隧道可以在两个网络之间建立加密连接,转发其他协议的数据。

  • 本地端口转发 (-L):将本地端口映射到远程服务器上的某个地址和端口。
    场景:访问远程服务器内网的服务。
    bash
    ssh -L 8080:remote_internal_ip:80 username@remote_host

    这会将你本地机器的8080端口转发到remote_host上的remote_internal_ip:80。然后你在本地访问localhost:8080,实际上就是在访问远程服务器内网的web服务。

  • 远程端口转发 (-R):将远程服务器的端口映射到本地机器上的某个地址和端口。
    场景:让外部网络访问本地服务。
    bash
    ssh -R 8080:localhost:80 username@remote_host

    这会将remote_host的8080端口转发到你本地机器的80端口。其他人连接remote_host:8080实际上就是连接你本地的80端口。

  • 动态端口转发 (-D):建立一个SOCKS代理。
    场景:科学上网或匿名访问。
    bash
    ssh -D 1080 username@remote_host

    这会在本地建立一个SOCKS代理,监听在1080端口。你可以配置浏览器或其他应用程序使用这个SOCKS代理来通过remote_host访问互联网。

4. SCP和SFTP进行文件传输

  • SCP (Secure Copy Protocol):用于在本地和远程系统之间复制文件和目录。
    • 本地到远程
      bash
      scp /path/to/local/file username@remote_host:/path/to/remote/directory
      scp -r /path/to/local/folder username@remote_host:/path/to/remote/directory # 复制目录
    • 远程到本地
      bash
      scp username@remote_host:/path/to/remote/file /path/to/local/directory
  • SFTP (SSH File Transfer Protocol):提供更交互式的文件传输体验,类似于FTP,但基于SSH。
    bash
    sftp username@remote_host

    连接后,可以使用lscdgetput等命令操作文件。

五、 SSH安全最佳实践

  1. 使用密钥认证,禁用密码认证:密钥更长,更难暴力破解。
  2. 为私钥设置强密码短语:即使私钥文件泄露,也能提供一层保护。
  3. 修改SSH默认端口:将22端口修改为其他不常用端口,减少被扫描和攻击的几率。在/etc/ssh/sshd_config中修改Port 22
  4. 限制SSH登录用户:在/etc/ssh/sshd_config中使用AllowUsersDenyUsers限制可登录的用户。
  5. 禁用root用户直接登录:在/etc/ssh/sshd_config中设置PermitRootLogin no。以普通用户登录后再sudo到root。
  6. 使用防火墙:限制只有特定IP地址才能访问SSH端口。
  7. 定期更新OpenSSH软件:确保获得最新的安全补丁。
  8. 启用两因素认证 (2FA):对于高安全性要求,可以结合Google Authenticator等工具实现SSH 2FA。
  9. 了解并识别SSH指纹:首次连接时确认指纹,并在指纹变更时警惕。

总结

SSH是远程管理服务器不可或缺的工具。从基本的密码认证,到更安全的密钥认证,再到高级的端口转发和代理功能,掌握SSH能极大地提升你的工作效率和网络安全。通过遵循最佳实践,你可以建立起一个健壮、安全的远程访问环境。

滚动至顶部