S(ecure)SH(hell) 广泛用于服务器连接。除了单纯连接之外,还有许多细节值得了解:

  • 端口转发
  • 客户端选项
  • 服务器端选项

端口转发可以把本地某个端口上的网络流量重新导向到远程机器的另一个端口,反之亦然。

1. 端口转发

端口转发是最常使用的功能。基本上有三种:

  1. 本地端口转发(Local port forwarding)
  2. 远程端口转发(Remote port forwarding)
  3. 动态端口转发(Dynamic port forwarding)

1.1 本地端口转发

本地端口转发是 SSH 的一项功能,可以把本地某个端口上的网络流量重新导向到远程服务器上指定的目的端口。它让你可以访问远程服务器上的服务或资源,就像它们在本地上运行一样。

ssh -L <local_port>:<destination_host>:<destination_port> <username>@<SSH_server>

在上面的命令中:

<local_port> 是想要在本地上重新导向流量的端口号。 <destination_host> 是想要把流量转发过去的远程机器主机名称或 IP 地址。 <destination_port> 是远程机器上想要把流量转发过去的端口号。 <username> 是你在 SSH 服务器上的用户名。 <SSH_server> 是 SSH 服务器的主机名称或 IP 地址。

示例:

假设你想把本地 8080 端口的流量转发到 IP 地址为 192.168.1.100 的远程机器上、运行于 80 端口的网页服务器。可以使用以下命令:

ssh -L 8080:192.168.1.100:80 [email protected]

这个命令会建立与 ssh-server.example.com 的 SSH 连接,并把本地 8080 端口收到的所有流量转发到远程机器的 80 端口。

1.2 远程端口转发

远程端口转发是 SSH 的一项功能,可以把远程服务器某个端口上的网络流量重新导向到本地或本地所在局域网内另一台机器的指定目的端口。它让你可以把本地运行的服务或资源,暴露给远程服务器所在的网络。

ssh -R <remote_port>:<destination_host>:<destination_port> <username>@<SSH_server>

在上面的命令中:

<remote_port> 是想要在远程机器上重新导向流量的端口号。 <destination_host> 是想要从远程机器把流量转发过去的机器主机名称或 IP 地址。 <destination_port> 是目的机器上想要把流量转发过去的端口号。 <username> 是你在 SSH 服务器上的用户名。 <SSH_server> 是 SSH 服务器的主机名称或 IP 地址。 远程端口转发让你可以从本地访问远程机器上的服务。

请确保你有这台服务器的 SSH 访问权限,以及建立端口转发所需的权限。

1.3 动态端口转发

动态端口转发让你可以在本地上建立一个 SOCKS 代理,通过 SSH 隧道路由流量,并从远程服务器出口。

ssh -D <local_port> [email protected]

<local_port> 换成想要用于 SOCKS 代理的端口号。默认情况下,它会绑定到 localhost。

SSH 连接建立之后,把应用程序(例如浏览器)配置成使用以下设置的 SOCKS 代理:

SOCKS Host: localhost SOCKS Port: <local_port>(与 SSH 命令中指定的端口相同) 这让你可以把网络流量通过远程服务器路由,就像身处那个网络一样访问资源。

1.4 服务器配置

为了使用端口转发,需要修改 /etc/ssh/sshd_config 里的 sshd_config 文件。

AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes

2. 客户端选项

2.1 命令行中的选项

以下是一些可以用来自定义与增强 SSH 连接的额外选项:

  1. -C:在 SSH 连接期间启用数据压缩,改善在慢速网络连接下的性能。它会在数据通过网络发送之前先压缩。
  2. -F:指定替代的 SSH 配置文件,取代默认的 ~/.ssh/config。这让你可以针对特定的 SSH 连接使用自定义配置文件。
  3. -N:建立 SSH 连接时不执行远程命令。当你只需要配置端口转发或建立安全隧道、不需要执行远程命令时,这个选项很有用。
  4. -T:禁用远程服务器上的伪终端分配。当你想在没有终端的情况下运行 SSH 时很有用,例如在脚本中执行 SSH 命令。
  5. -q:安静模式。抑制大部分警告和诊断消息,让 SSH 连接更安静,适合用于脚本。
  6. -4-6:这些选项分别强制 SSH 客户端使用 IPv4(-4)或 IPv6(-6)地址。默认情况下,SSH 两者都会使用。
  7. -L:指定本地端口转发,让你可以把本地某个端口的流量转发到远程服务器。
  8. -R:指定远程端口转发,让你可以把服务器上某个远程端口的流量转发到本地。
  9. -D:指定动态端口转发,也就是 SOCKS 代理。它让你可以在本地建立 SOCKS 代理,把流量通过 SSH 隧道路由。
  10. -o:让你可以直接在命令行上指定配置选项。例如,可以用 -o "User=username" 来指定 SSH 连接要使用的用户名。
  11. -v-vv-vvv:提高 SSH 客户端的详细程度。指定 -v 会提高调试输出的细节程度,-vv-vvv 则提供更详细的调试信息。

这些选项在使用 SSH 客户端(ssh)连接到远程服务器时,提供了额外的控制与灵活性。请记得参考 SSH 手册(man ssh)以获取完整的选项列表、说明及其具体用法细节。

2.2 客户端配置文件

这些配置可以写进一个文件里。

3. 服务器配置

sshd_config 文件是 OpenSSH 服务器(sshd)的主要配置文件,通常位于大多数 Linux 系统的 /etc/ssh/ 目录下。sshd_config 文件包含各种控制 SSH 服务器行为与功能的配置。以下是 sshd_config 文件中常见的几个关键配置:

  1. Port: 指定 SSH 服务器监听传入连接的端口号。默认是 22 端口,但可以更改以提升安全性。
  2. PermitRootLogin: 决定是否允许 root 用户直接通过 SSH 登录。可以设为 yesnoprohibit-password
  3. PasswordAuthentication: 指定 SSH 连接是否允许以密码进行认证。可以设为 yesno。一般建议禁用密码认证、改用密钥认证以提升安全性。
  4. PubkeyAuthentication: 启用或禁用公钥认证。应设为 yes,让用户可以用 SSH 密钥进行认证。
  5. AllowUsers/AllowGroups/DenyUsers/DenyGroups: 这些指令控制哪些用户或组被允许或拒绝访问 SSH 服务器。可以指定个别用户名或组名称。
  6. PermitEmptyPasswords: 决定认证时是否允许空白密码。应设为 no 以禁止空白密码。
  7. ChallengeResponseAuthentication: 启用或禁用挑战响应认证。若想禁用这种认证方式,应设为 no
  8. AllowTcpForwarding/AllowStreamLocalForwarding/AllowAgentForwarding: 这些选项控制是否允许特定类型的端口转发。可以设为 yesno 来启用或禁用转发能力。
  9. LoginGraceTime: 指定以秒为单位的时间,在此期间内若用户尚未成功登录,SSH 服务器允许认证的时间过后就会关闭连接。有助于防止暴力破解攻击。
  10. TCPKeepAlive: 决定是否发送 TCP keep-alive 消息以维持 SSH 连接。大多数情况下应设为 yes

这些只是 sshd_config 文件中众多配置选项的一部分示例。请注意,修改 sshd_config 文件需要 root 或管理员权限。更改文件后,需要重新启动 SSH 服务器(sshd)才能让新配置生效。

4. 小结

本文讨论了:

  1. SSH 端口转发
  2. 客户端选项
  3. 服务器端配置