实用SSH-奇怪的知识又多知道了一些


在这里插入图片描述

SSH介绍

SSH(Secure Shell)是一个网络协议,用于在不安全的网络上安全地进行远程登录和其他网络服务。SSH 提供了一种加密的会话,使得敏感信息在客户端和服务器之间传输时能够获得保护。SSH 常用于远程管理系统和服务器,以及在不安全的网络环境中执行命令和传输文件。

SSH 的关键特点

加密

SSH 使用强加密来保护传输的数据,确保传输过程中的机密性和完整性。这意味着截获数据的攻击者无法轻易解读或篡改数据。

身份验证

SSH 支持多种身份验证方式,包括密码、密钥对(公钥/私钥)和多因素认证等。建议使用基于密钥的身份验证,因为它比密码更安全。

数据完整性

SSH 使用消息摘要和哈希函数来验证数据包的完整性,确保数据在传输过程中没有被篡改。

隧道和端口转发

SSH 可以安全地转发网络端口和创建隧道,将本地端口映射到远程服务,或者反向映射,从而实现安全的远程端口转发。

SFTP 和 SCP

SSH 提供了安全的文件传输能力,如 SFTP(SSH File Transfer Protocol)和 SCP(Secure Copy),用于在网络上安全地传输文件。

会话管理

SSH 支持将会话保存在后台,即使用户断开连接也能继续执行,还允许用户重新连接并恢复会话。

SSH 的基本用法

远程登录

用户可以通过 SSH 客户端从远程地点登录到 SSH 服务器。在登录过程中,用户的身份需要通过密码或密钥对进行验证。

执行远程命令:
用户可以执行单个命令而无需登录到远程系统的交互式 shell 中。例如:

ssh user@host 'ls -l /path/to/directory'

文件传输

使用 SCP 或 SFTP 命令,用户可以安全地上传和下载文件。

SFTP

SFTP(SSH File Transfer Protocol)和 SCP(Secure Copy)都是基于SSH协议的文件传输工具,可以用来安全地传输文件到远程服务器或者从远程服务器复制文件。

使用 SFTP 进行文件传输
SFTP 是一个交互式的文件传输程序,它具有与 FTP 类似的命令行接口,但它通过 SSH 运行,提供了加密和安全的文件传输。以下是使用 SFTP 从本地系统复制文件到远程服务器的例子:

开始 SFTP 会话:

sftp username@remote_host

这里的 username 是远程服务器上的用户名,remote_host 是远程服务器的地址。

连接后,你可以使用 put 命令上传文件,例如:

put local_file.txt /remote/path/remote_file.txt

这会将本地的 local_file.txt 上传到远程服务器的指定路径下,并命名为 remote_file.txt。

从远程服务器下载文件,可以使用 get 命令:

get /remote/path/remote_file.txt local_file.txt

这会将远程服务器上的 remote_file.txt 下载到本地,并命名为 local_file.txt。

完成后,使用 exit 命令退出 SFTP 会话:

exit

SCP

使用 SCP 进行文件传输
SCP 是一个用于在本地和远程之间安全复制文件的命令行工具。以下是使用 SCP 的例子:

将本地文件复制到远程服务器:

scp local_file.txt username@remote_host:/remote/path/remote_file.txt

这会将本地的 local_file.txt 复制到远程服务器的 /remote/path/ 目录下,并命名为 remote_file.txt。

从远程服务器复制文件到本地:

scp username@remote_host:/remote/path/remote_file.txt local_file.txt

这会将远程服务器上的 /remote/path/remote_file.txt 文件复制到当前的本地目录,并命名为 local_file.txt。

如果需要复制目录,可以使用 -r 选项进行递归复制:

scp -r username@remote_host:/remote/path/remote_directory local_directory

这将复制远程服务器上的整个 remote_directory 目录(及其内容)到本地的 local_directory 目录。

在使用 SCP 和 SFTP 时,你可能需要输入远程服务器的密码,除非你已经设置了基于 SSH 密钥的认证。同时,确保你有足够的权限来读取源文件和写入目标路径。

隧道和端口转发

用户可以通过 SSH 隧道在本地机器和远程机器之间安全地转发网络端口。

为了使用 SSH,通常你需要有一个 SSH 客户端软件和一台运行 SSH 服务器的远程机器。在 Linux 和 macOS 上,SSH 客户端通常已预装在系统中。在 Windows 上,可以使用像 PuTTY 这样的第三方软件,或者在较新版本的 Windows 10 及更高版本中使用 Windows Subsystem for Linux (WSL) 或 PowerShell 提供的 SSH 客户端功能。

ubuntu 22.04 如何允许远程ssh登录

在 Ubuntu 22.04 上允许远程 SSH 登录,你需要确保已经安装了 OpenSSH 服务器,配置了允许登录的用户账号,并且防火墙配置允许 SSH 连接。以下是详细步骤:

安装 OpenSSH 服务器(如果尚未安装)

打开终端,运行以下命令来安装 OpenSSH 服务器:

sudo apt update
sudo apt install openssh-server

检查 SSH 服务状态

安装后,你应该检查 SSH 服务是否正在运行:

sudo systemctl status ssh

如果服务没有运行,你可以使用下面的命令启动它:

sudo systemctl start ssh

并且,如果你希望每次计算机启动时 SSH 服务自动启动,可以使用下面的命令来使其自动化:

sudo systemctl enable ssh

配置 SSH:
你可以编辑 /etc/ssh/sshd_config 文件来配置 SSH 设置。例如,你可以改变默认的端口号,禁止 root 用户登录,或者只允许某些用户登录。

sudo nano /etc/ssh/sshd_config

常见的配置包括:

  • PermitRootLogin no 禁止 root 登录
  • AllowUsers username 仅允许特定用户登录
  • Port 22 更改默认端口号(可选)

保存更改后,重启 SSH 服务以应用配置:

sudo systemctl restart ssh

配置防火墙(如果已启用):
如果你的 Ubuntu 系统使用 UFW(不复杂的防火墙),确保允许 SSH 通信:

sudo ufw allow ssh

如果你更改了默认端口(例如,更改为 2222),则需要允许该端口:

sudo ufw allow 2222/tcp

启用防火墙(如果尚未启用):

sudo ufw enable

检查防火墙状态:

sudo ufw status

从远程计算机连接:
现在你可以从另一台支持 SSH 的计算机上使用以下命令连接到你的 Ubuntu 服务器:

ssh username@your_ubuntu_server_ip

其中 username 是你希望登录的 Ubuntu 服务器上的用户账号,而 your_ubuntu_server_ip 是 Ubuntu 服务器的 IP 地址。

请确保在进行远程连接之前,你已经按照上述步骤完成了所有必要的配置,并且知道 Ubuntu 服务器的 IP 地址。此外,根据你的网络设置,你可能需要在路由器或防火墙上配置端口转发,以便能够从外部网络访问 Ubuntu 服务器。

如何配置ssh免密码登录

为了配置 SSH 免密码登录,你需要在本地计算机上生成一对 SSH 密钥(一个公钥和一个私钥),然后将公钥复制到远程服务器上你希望免密码登录的账户的 ~/.ssh/authorized_keys 文件中。以下是详细步骤:

步骤 1:生成 SSH 密钥对

在你的本地计算机上打开终端,运行以下命令来生成一对新的 SSH 密钥(如果你已经有密钥,可以跳过这一步,并直接使用现有密钥):

ssh-keygen

这个命令会提示你要保存新密钥的位置(默认是 ~/.ssh/id_rsa),以及输入一个可选的密码短语来额外保护你的私钥。为了实现免密码登录,你应该在提示时按 Enter 键留空,不设置密码短语。

步骤 2:复制 SSH 公钥到远程服务器

将生成的 SSH 公钥复制到远程服务器上。可以使用 ssh-copy-id 命令来自动完成这个过程。在终端中运行以下命令:

ssh-copy-id username@remote_host

这里 username 是你在远程服务器上的用户名,而 remote_host 是远程服务器的主机名或 IP 地址。

如果你的远程服务器没有安装 ssh-copy-id 或者你使用的是 Windows 系统,你也可以手动复制公钥。首先,显示并复制你的 SSH 公钥的内容:

cat ~/.ssh/id_rsa.pub

然后,在远程服务器上,登录到对应的用户帐户,编辑 ~/.ssh/authorized_keys 文件,并将你复制的公钥内容粘贴到该文件的末尾:

# 登录到远程服务器
ssh username@remote_host
# 确保.ssh目录存在
mkdir -p ~/.ssh
# 设置正确的权限

chmod 700 ~/.ssh
# 将公钥添加到authorized_keys文件中
echo your_public_key >> ~/.ssh/authorized_keys
# 设置正确的文件权限
chmod 600 ~/.ssh/authorized_keys

将 your_public_key 替换为你的公钥文本。

步骤 3:测试免密码 SSH 登录

一旦你将公钥复制到远程服务器后,尝试再次通过 SSH 登录到远程服务器:

ssh username@remote_host

如果配置正确,系统将不再提示你输入密码即可登录。

实际例子

  • 30.194.6.193 为跳板机
  • 192.168.249.241 为目标机器,希望从30.194.6.193免密码登录到 192.168.249.241

生成私钥
1、登录跳板机器(即30.194.6.193),机器已经存在ssh密钥,在机器上生成新的密钥对:可以使用以下命令生成新的SSH密钥对:

ssh-keygen -t rsa -f ~/.ssh/id_rsa_new

这将在.ssh目录中生成新的公钥文件id_rsa_new.pub和私钥文件id_rsa_new。

也可以直接使用id_rsa.pub和id_rsa文件。

将跳板机的公钥添加到目标机器
2、将新公钥添加到SSH的免密登录配置中:将新生成的公钥文件id_rsa_new.pub的内容复制到远程服务器的~/.ssh/authorized_keys文件中,以实现SSH的免密登录。

cat ~/.ssh/id_rsa_new.pub | ssh automator@192.168.249.241 'cat >> ~/.ssh/authorized_keys'

编辑跳板机的ssh配置
3、配置SSH配置文件:编辑跳板机器上的SSH配置文件~/.ssh/config,添加以下内容:

Host 192.168.249.241
    HostName 192.168.249.241
    User automator
    IdentityFile ~/.ssh/id_rsa_new

4、确保您的配置文件权限正确。使用以下命令设置正确的权限:

chmod 600 ~/.ssh/config

5、测试无密码登录和无密码传输

ssh 192.168.249.241
scp test.zip 192.168.249.241:~
  1. 在你的 ~/.ssh/config文件的最后添加
Host 30.194.6.193
    HostName 30.194.6.193
    User automator
    IdentityFile ~/.ssh/id_rsa

SSH的隧道和端口转发

这个功能很少人会用的到,大家感兴趣可以继续阅读。

SSH 隧道和端口转发是 SSH 协议提供的强大特性之一,它们允许用户在两个端点之间建立一个安全的加密通道,并通过这个通道转发任意网络端口的数据。

  • 隧道和端口转发的类型:
    本地端口转发 (Local Port Forwarding):

  • 将本地计算机上的一个端口通过 SSH 隧道映射到远程服务器上的特定端口。
    应用场景:安全地访问在防火墙后面、只在远程服务器本地可用的服务(例如数据库)。
    远程端口转发 (Remote Port Forwarding):

  • 将远程服务器上的一个端口通过 SSH 隧道映射到本地计算机上的特定端口。
    应用场景:允许从远程服务器端访问在本地计算机上运行的服务,即使本地计算机位于 NAT 或防火墙后面。

  • 动态端口转发 (Dynamic Port Forwarding):

  • 通过 SSH 创建一个 SOCKS 代理服务器,客户端可以配置为使用这个代理来动态决定需要通过隧道转发的流量。
    应用场景:安全地浏览网页,所有流量会通过 SSH 隧道动态转发,适合绕过内容过滤或访问地区限制的资源。

如何配置:

本地端口转发:

ssh -L local_port:remote_address:remote_port user@ssh_server

其中:

  • local_port 是你的本地机器上要监听的端口。
  • remote_address 是远程网络中希望连接的机器的地址(可以是 SSH 服务器自身或 SSH 服务器能够访问的任何机器)。
  • remote_port 是远程机器开放的端口,你希望通过 SSH 隧道访问。
  • user 是你在 SSH 服务器上的用户名。
  • ssh_server 是 SSH 服务器的地址。
    例如,如果你想通过 SSH 隧道访问远程 MySQL 数据库(默认端口3306),你可以这样做:
ssh -L 3307:localhost:3306 user@example.com

本地监听在端口3307上,所有通过此端口的数据都会安全地转发到 example.com 上的3306端口。

远程端口转发:

ssh -R remote_port:local_address:local_port user@ssh_server

其中:

  • remote_port 是在 SSH 服务器上要监听的端口。
  • local_address 通常是本地机器的 localhost。
  • local_port 是本地机器上的服务端口。
    例如,你想让远程服务器能够访问你本地运行的web服务(假设端口是8080),你可以这样做:
ssh -R 9090:localhost:8080 user@example.com

这样,在远程服务器上访问9090端口实际上是访问你本地机器的8080端口。

动态端口转发:

ssh -D local_port user@ssh_server

其中:

  • local_port 是你的本地机器上要用作 SOCKS 代理的端口。
    例如,设置动态端口转发:
ssh -D 1080 user@example.com

然后你可以在浏览器或其他应用程序中配置 SOCKS 代理,指向本地的1080端口,从而所有流量都经过 SSH 服务器。

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

namedlock

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值