OpenSSH 能够创建隧道以便用加密的会话来封装其他协议。
下面的命令告诉 ssh(1) 为 telnet 创建一个隧道:
% ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
%
上述 ssh 命令使用了下面这些选项:
-
强制 ssh 使用第2版的协议 (如果需要和较老的 SSH 一同工作请不要使用这个选项)。
-
表示不使用命令行, 或者说只使用隧道。 如果省略, ssh 将同时初始化会话。
-
强制 ssh 在后台执行。
-
表示产生一条 本地端口:远程主机:远程端口 形式的隧道。
-
远程 SSH 服务器。
-2
-N
-f
-L
user@foo.example.com
SSH 隧道通过监听 localhost 上面指定端口来完成工作。它将把本机主机/端口上接收到的连接通过 SSH 连接转发到远程主机/端口。
本例中, 位于 localhost 的 5023 端口 被用于转发 localhost 的连接到远程主机的 23 端口。 由于 23 是 telnet 使用的,因此它将通过 SSH 隧道完成telnet 会话。
这可以用来封装任意不安全的 TCP 协议, 例如 SMTP、 POP3、 FTP等等。
使用 SSH 为 SMTP 创建安全隧道
% ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
user@mailserver.example.com's password: *****
% telnet localhost 5025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailserver.example.com ESMTP
这可以与 ssh-keygen(1) 以及额外的用户帐号配合来建立一个更透明的 SSH 隧道环境。密钥可以被用在需要输入口令的地方, 而且可以为不同的用户配置不同的隧道。
实用的 SSH 通道例子
加强 POP3 服务的安全
工作时, 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络, 或从您家到办公室的网络可能不, 或不完全可信。 基于这样的原因,您需要以安全的方式来查看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接,并通过这个连接来访问 POP3 服务:
% ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
user@ssh-server.example.com's password: ******
当这个通道连上时, 您可以把 POP3 请求发到 localhost 端口 2110。 这个连接将通过通道安全地转发到 mail.example.com。
绕过严厉的防火墙
一些大脑长包的网络管理员会使用一些极端的防火墙策略, 不仅过滤进入的连接,而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行 SSH 和网页浏览。
您可能希望访问一些其它的 (也许与工作无关的) 服务, 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐,则您将无法访问它。
解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器,并通过它提供的通道连接到 Ogg Vorbis 服务器上。
% ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
user@unfirewalled-system.example.org's password: *******
现在您可以把客户程序指定到 localhost 的 8888 端口,它将把请求转发给 music.example.com 的 8000 端口,从而绕过防火墙。
允许用户登录 AllowUsers
选项
通常限制哪些用户能够登录, 以及从何处登录会是好主意。 采用 AllowUsers 选项能够方便地达到这一目的。 例如, 想要只允许 root 用户从 192.168.1.32 登录, 就可以在 /etc/ssh/sshd_config 文件中加入下述设置:
AllowUsers root@192.168.1.32
要允许用户 admin 从任何地方登录, 则只需列出用户名:
AllowUsers admin
可以在同一行指定多个用户, 例如:
AllowUsers root@192.168.1.32 admin
注意: 列出需要登录机器的用户很重要; 否则他们将被锁在外面。
在完成对 /etc/ssh/sshd_config 的修改之后您必须告诉 sshd(8) 重新加载其配置文件, 方法是执行:
# /etc/rc.d/sshd reload