ssh原理
# 1. 什么是ssh
SSH(Secure Shell)在计算机网络中有许多重要的作用,它主要用于提供安全的远程访问、数据传输和身份验证等功能。以下是SSH的主要作用:
- 安全远程访问: SSH允许用户在不安全的网络中远程登录到远程服务器或计算机,以执行命令、操作文件和管理系统。通过SSH,用户可以通过加密通道安全地访问远程主机,而不必担心敏感信息被截获。
- 加密数据传输: SSH通过建立加密通道,保护数据在传输过程中的机密性和完整性。这使得数据在网络上的传输过程中免受窃听和篡改的威胁。
- 文件传输: SSH提供了诸如SCP(Secure Copy Protocol)和SFTP(SSH File Transfer Protocol)等工具,用于在本地主机和远程主机之间安全地传输文件。这些工具保护了传输的文件内容。
- 远程命令执行: 除了远程登录,SSH还允许用户在远程服务器上执行命令,使用户可以通过命令行远程控制和管理服务器。这对于自动化和远程维护非常有用。
- 身份验证和安全访问控制: SSH支持多种身份验证方式,如密码、SSH密钥和证书等。这使得服务器可以验证用户的身份,并限制未经授权的访问。这对于保护敏感数据和资源非常重要。
- 隧道和端口转发: SSH允许用户创建安全的隧道,将本地端口与远程主机的端口关联起来。这对于安全地访问内部资源、绕过防火墙限制或加密通信非常有用。
- 远程维护和故障排除: 系统管理员可以使用SSH来远程管理和维护服务器,进行故障排除,更新软件和执行其他管理操作。
- 安全通信通道: SSH在不同网络设备之间创建了安全的通信通道,可以用于远程管理网络设备、传输配置文件等。
当SSH应用于STelnet,SFTP以及SCP时,使用的默认SSH端口都是22。当SSH应用于NETCONF时,可以指定SSH端口是22或者830。SSH端口支持修改,更改后当前所有的连接都会断开,SSH服务器开始侦听新的端口。
# 2. ssh网络原理
可参考:https://www.51cto.com/article/706122.html (opens new window)
比如我一台新的电脑要克隆github的仓库,一般都需要怎么本地使用ssh命名并获得公钥保存到github,可以结合这个案例结合上面的原理讲一讲吗
例子:克隆GitHub仓库到新的电脑
生成SSH密钥: 首先,在新的电脑上,您需要生成一个SSH密钥对。打开终端并运行以下命令(将您的电子邮件地址替换为实际地址):
shCopy code ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
1
2在生成过程中,系统会询问您要保存密钥的路径。默认情况下,它会保存在
~/.ssh/id_rsa
(私钥) 和~/.ssh/id_rsa.pub
(公钥)。添加公钥到GitHub: 打开
~/.ssh/id_rsa.pub
文件,复制其中的内容。然后,登录到GitHub账户,在设置(Settings)中找到SSH和GPG keys,添加您刚刚复制的公钥。克隆GitHub仓库: 现在,您的新电脑已经配置好SSH密钥,您可以在终端中使用SSH克隆GitHub仓库。假设您要克隆名为
my-repo
的仓库,使用以下命令:shCopy code git clone git@github.com:yourusername/my-repo.git
1
2这将克隆
my-repo
仓库到您的本地文件系统中。
原理解释:
- 在生成SSH密钥时,您使用了
ssh-keygen
命令,该命令会为您生成一对RSA密钥(公钥和私钥)。 - 在将公钥添加到GitHub时,您将公钥添加到您的GitHub账户中。这样,GitHub就知道哪个公钥对应于您的账户。
- 当您通过SSH URL(
git@github.com:yourusername/my-repo.git
)克隆GitHub仓库时,您的本地SSH客户端会使用私钥对GitHub进行身份验证。 - GitHub服务器收到连接请求后,它会查找匹配的公钥。如果匹配成功,就说明您是授权的用户,并且连接会通过加密通道进行传输。
通过这个过程,您可以在不暴露敏感信息的情况下与GitHub进行安全通信。整个过程涉及到密钥生成、密钥匹配和加密通信,从而确保了数据的安全性和身份的验证。
# 4. 怎么实现登录自己的服务器
我们都会在github上保存我们的publickey。但是如果我们有自己的服务器,我们登录又不想使用密码登录,而是用publickey登录,应该怎么做呢?
通过公钥方式进行SSH登录是一种更安全和方便的方式,因为它不需要输入密码,而是使用密钥对进行身份验证。下面是在服务器上设置公钥方式进行SSH登录的步骤:
生成SSH密钥对: 首先,在本地计算机上生成SSH密钥对。如果您已经有密钥对,可以跳过此步骤。打开终端并运行以下命令(将您的电子邮件地址替换为实际地址):
shCopy code ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
1
2这将生成一个RSA密钥对,包括私钥(
~/.ssh/id_rsa
)和公钥(~/.ssh/id_rsa.pub
)。复制公钥到服务器: 使用SSH将您的公钥复制到服务器。在终端中运行以下命令(将
your_username
替换为您在服务器上的用户名,your_server_ip
替换为服务器的IP地址或主机名):shCopy code ssh-copy-id your_username@your_server_ip
1
2如果
ssh-copy-id
命令不可用,您可以手动将~/.ssh/id_rsa.pub
文件中的内容复制到服务器上的~/.ssh/authorized_keys
文件中。设置权限: 在服务器上设置SSH文件的权限,确保私钥和授权密钥的权限设置正确:
shCopy code chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
1
2
3禁用密码登录(可选): 为了增强安全性,您可以在服务器上禁用密码登录,仅允许密钥登录。编辑SSH服务器配置文件(通常是
/etc/ssh/sshd_config
),找到PasswordAuthentication
行并将其设置为no
。然后重新启动SSH服务。尝试SSH登录: 现在,您应该能够使用您的私钥进行SSH登录。在本地终端中运行以下命令:
shCopy code ssh your_username@your_server_ip
1
2系统将使用私钥进行身份验证,而不需要输入密码。
通过这些步骤,您可以在服务器上设置公钥方式进行SSH登录。请务必谨慎保存私钥,不要将其泄露给其他人,以确保安全性。
# 4. ssh常用命令
当使用SSH命令时,以下是一些常用的用法和选项:
基本连接:
ssh username@hostname
1这将连接到指定的主机(hostname)使用给定的用户名(username)。系统会提示您输入密码或使用SSH密钥进行身份验证。
指定端口:
ssh -p port_number username@hostname
1如果目标主机使用非默认的SSH端口号(默认是22),您可以使用
-p
选项来指定端口号。使用SSH密钥:
ssh -i path/to/private_key username@hostname
1如果您有SSH密钥对,可以使用
-i
选项来指定私钥文件的路径。这将允许您无需输入密码进行连接。执行远程命令:
ssh username@hostname 'command_to_run'
1您可以使用SSH连接来在远程主机上执行命令,而不需要完全登录到远程主机。
传输文件:
scp source_file username@hostname:destination_path
1使用
scp
命令可以在本地主机和远程主机之间传输文件。将source_file
替换为要传输的本地文件路径,destination_path
替换为远程主机上的目标路径。端口转发(SSH隧道):
ssh -L local_port:target_host:target_port username@jump_host
1这会在本地创建一个端口转发,将本地的
local_port
与目标主机的target_host:target_port
关联起来。这对于创建安全的本地到远程主机的通信通道很有用。断开连接: 您可以在SSH会话中键入
exit
或使用快捷键Ctrl + D
来断开与远程主机的连接。
这只是SSH命令的一些常用用法和选项。在实际使用中,您可能会根据具体情况使用不同的选项和命令。要了解更多细节和选项,请查阅您系统的SSH文档或运行 man ssh
命令来获取SSH的手册页。