如何使用 SSH 隧道访问受限服务器并安全浏览
已发表: 2022-01-29SSH 客户端连接到 Secure Shell 服务器,这使您可以像坐在另一台计算机前一样运行终端命令。 但是 SSH 客户端还允许您在本地系统和远程 SSH 服务器之间“隧道”连接一个端口。
存在三种不同类型的 SSH 隧道,它们都用于不同的目的。 每个都涉及使用 SSH 服务器将流量从一个网络端口重定向到另一个网络端口。 流量通过加密的 SSH 连接发送,因此在传输过程中无法监控或修改。
您可以使用 Linux、macOS 和其他类 UNIX 操作系统中包含的ssh
命令执行此操作,并且可以创建一个 ssh 配置文件来保存您的设置。 在不包含内置 ssh 命令的 Windows 上,我们建议使用免费工具 PuTTY 连接到 SSH 服务器。 它也支持 SSH 隧道。
本地端口转发:使本地系统上的远程资源可访问
“本地端口转发”允许您访问不暴露于 Internet 的本地网络资源。 例如,假设您想在家中访问办公室的数据库服务器。 出于安全原因,该数据库服务器仅配置为接受来自本地办公网络的连接。 但是,如果您可以访问办公室的 SSH 服务器,并且该 SSH 服务器允许来自办公室网络外部的连接,那么您可以在家中连接到该 SSH 服务器并访问数据库服务器,就像您在办公室一样。 这通常是这种情况,因为保护单个 SSH 服务器免受攻击比保护各种不同的网络资源更容易。
为此,您需要与 SSH 服务器建立 SSH 连接,并告诉客户端将来自本地 PC 的特定端口(例如端口 1234)的流量转发到数据库服务器的地址及其在办公网络上的端口。 因此,当您尝试通过端口 1234 访问您当前 PC 的数据库服务器时,“localhost”,该流量会自动通过 SSH 连接“隧道化”并发送到数据库服务器。 SSH 服务器位于中间,来回转发流量。 您可以使用任何命令行或图形工具来访问数据库服务器,就像它在本地 PC 上运行一样。
要使用本地转发,请正常连接到 SSH 服务器,但还要提供-L
参数。 语法是:
ssh -L local_port:remote_address:remote_port [email protected]
例如,假设您办公室的数据库服务器位于办公室网络上的 192.168.1.111。 您可以通过ssh.youroffice.com
访问办公室的 SSH 服务器,并且您在 SSH 服务器上的用户帐户是bob
。 在这种情况下,您的命令将如下所示:
ssh -L 8888:192.168.1.111:1234 [email protected]
运行该命令后,您将能够在 localhost 的 8888 端口访问数据库服务器。 因此,如果数据库服务器提供 Web 访问,您可以将 http://localhost:8888 插入 Web 浏览器来访问它。 如果您有一个需要数据库网络地址的命令行工具,您可以将其指向 localhost:8888。 发送到您 PC 上端口 8888 的所有流量都将通过隧道传输到您办公室网络上的 192.168.1.111:1234。
如果您想连接到与 SSH 服务器本身在同一系统上运行的服务器应用程序,这会更加令人困惑。 例如,假设您在办公室计算机上的端口 22 上运行了一个 SSH 服务器,但在同一地址的同一系统上,您还有一个在端口 1234 上运行的数据库服务器。 您想从家里访问数据库服务器,但系统只接受端口 22 上的 SSH 连接,并且其防火墙不允许任何其他外部连接。
在这种情况下,您可以运行如下命令:
ssh -L 8888:localhost:1234 [email protected]
当您尝试在当前 PC 上的端口 8888 访问数据库服务器时,流量将通过 SSH 连接发送。 当它到达运行 SSH 服务器的系统时,SSH 服务器会将其发送到“localhost”上的 1234 端口,即运行 SSH 服务器的同一台 PC。 所以上面命令中的“localhost”,从远程服务器的角度来看,就是“localhost”。
要在 Windows 上的 PuTTY 应用程序中执行此操作,请选择连接 > SSH > 隧道。 选择“本地”选项。 对于“源端口”,输入本地端口。 对于“Destination”,以 remote_address:remote_port 形式输入目标地址和端口。
例如,如果您想设置与上述相同的 SSH 隧道,则输入8888
作为源端口,输入localhost:1234
作为目标。 之后单击“添加”,然后单击“打开”以打开 SSH 连接。 当然,在连接之前,您还需要在主“会话”屏幕上输入 SSH 服务器本身的地址和端口。
相关:什么是 SSH 代理转发以及如何使用它?
远程端口转发:使本地资源在远程系统上可访问
“远程端口转发”与本地转发相反,使用频率不高。 它允许您使本地 PC 上的资源在 SSH 服务器上可用。 例如,假设您正在坐在您面前的本地 PC 上运行 Web 服务器。 但是您的 PC 位于不允许传入流量到服务器软件的防火墙后面。
假设您可以访问远程 SSH 服务器,您可以连接到该 SSH 服务器并使用远程端口转发。 您的 SSH 客户端将告诉服务器将 SSH 服务器上的特定端口(例如端口 1234)转发到您当前 PC 或本地网络上的特定地址和端口。 当有人访问 SSH 服务器上的端口 1234 时,该流量将自动通过 SSH 连接“隧道化”。 任何有权访问 SSH 服务器的人都可以访问您 PC 上运行的 Web 服务器。 这实际上是一种通过防火墙的隧道方式。
要使用远程转发,请使用带有-R
参数的ssh
命令。 语法与本地转发基本相同:
ssh -R remote_port:local_address:local_port [email protected]
假设您想让一个在本地 PC 上的端口 1234 上侦听的服务器应用程序在远程 SSH 服务器上的端口 8888 上可用。 SSH 服务器的地址是ssh.youroffice.com
并且您在 SSH 服务器上的用户名是bob 。 您将运行以下命令:
ssh -R 8888:localhost:1234 [email protected]
然后有人可以在端口 8888 上连接到 SSH 服务器,并且该连接将通过隧道连接到在您建立连接的本地 PC 上的端口 1234 上运行的服务器应用程序。
要在 Windows 上的 PuTTY 中执行此操作,请选择连接 > SSH > 隧道。 选择“远程”选项。 对于“源端口”,输入远程端口。 对于“目标”,以 local_address:local_port 形式输入目标地址和端口。
例如,如果要设置上面的示例,则输入8888
作为源端口,输入localhost:1234
作为目标。 之后单击“添加”,然后单击“打开”以打开 SSH 连接。 当然,在连接之前,您还需要在主“会话”屏幕上输入 SSH 服务器本身的地址和端口。
然后人们可以连接到 SSH 服务器上的端口 8888,他们的流量将通过隧道传输到本地系统上的端口 1234。
默认情况下,远程 SSH 服务器只会监听来自同一主机的连接。 换句话说,只有与 SSH 服务器本身在同一系统上的人才能连接。 这是出于安全原因。 如果要覆盖此行为,则需要在远程 SSH 服务器上的 sshd_config 中启用“GatewayPorts”选项。
相关:如何在 Windows 和 Linux 中管理 SSH 配置文件
动态端口转发:使用您的 SSH 服务器作为代理
相关: VPN 和代理之间有什么区别?
还有“动态端口转发”,其工作方式类似于代理或 VPN。 SSH 客户端将创建一个 SOCKS 代理,您可以配置应用程序使用。 通过代理发送的所有流量都将通过 SSH 服务器发送。 这类似于本地转发——它将本地流量发送到您 PC 上的特定端口,然后通过 SSH 连接将其发送到远程位置。
相关:为什么使用公共 Wi-Fi 网络可能是危险的,即使在访问加密网站时也是如此
例如,假设您使用的是公共 Wi-Fi 网络。 您想安全地浏览而不被窥探。 如果您可以在家中访问 SSH 服务器,则可以连接到它并使用动态端口转发。 SSH 客户端将在您的 PC 上创建一个 SOCKS 代理。 发送到该代理的所有流量都将通过 SSH 服务器连接发送。 监控公共 Wi-Fi 网络的任何人都无法监控您的浏览或审查您可以访问的网站。 从您访问的任何网站的角度来看,就好像您坐在家里的 PC 前一样。 这也意味着您可以在美国境外使用此技巧访问仅限美国的网站——当然,假设您可以访问美国的 SSH 服务器。

作为另一个示例,您可能想要访问家庭网络上的媒体服务器应用程序。 出于安全原因,您可能只有一个 SSH 服务器暴露在 Internet 上。 您不允许从 Internet 到您的媒体服务器应用程序的传入连接。 您可以设置动态端口转发,配置 Web 浏览器以使用 SOCKS 代理,然后通过 Web 浏览器访问在您的家庭网络上运行的服务器,就像您坐在家里的 SSH 系统前一样。 例如,如果您的媒体服务器位于家庭网络上的端口 192.168.1.123,您可以使用 SOCKS 代理将地址192.168.1.123
插入任何应用程序,您就可以像在家庭网络上一样访问媒体服务器.
要使用动态转发,请使用-D
参数运行 ssh 命令,如下所示:
ssh -D local_port 用户名@server.com
例如,假设您可以访问ssh.yourhome.com
上的 SSH 服务器,并且您在 SSH 服务器上的用户名是bob
。 您想使用动态转发在当前 PC 的 8888 端口打开一个 SOCKS 代理。 您将运行以下命令:
ssh -D 8888 [email protected]
然后,您可以配置 Web 浏览器或其他应用程序以使用您的本地 IP 地址 (127.0.01) 和端口 8888。来自该应用程序的所有流量都将通过隧道重定向。
要在 Windows 上的 PuTTY 中执行此操作,请选择连接 > SSH > 隧道。 选择“动态”选项。 对于“源端口”,输入本地端口。
例如,如果您想在端口 8888 上创建 SOCKS 代理,则输入8888
作为源端口。 之后单击“添加”,然后单击“打开”以打开 SSH 连接。 当然,在连接之前,您还需要在主“会话”屏幕上输入 SSH 服务器本身的地址和端口。
然后,您可以配置应用程序以访问本地 PC 上的 SOCKS 代理(即 IP 地址 127.0.0.1,它指向您的本地 PC)并指定正确的端口。
相关:如何在 Firefox 中配置代理服务器
例如,您可以将 Firefox 配置为使用 SOCKS 代理。 这特别有用,因为 Firefox 可以拥有自己的代理设置,而不必使用系统范围的代理设置。 Firefox 将通过 SSH 隧道发送其流量,而其他应用程序将正常使用您的 Internet 连接。
在 Firefox 中执行此操作时,选择“手动代理配置”,在 SOCKS 主机框中输入“127.0.0.1”,并在“端口”框中输入动态端口。 将 HTTP 代理、SSL 代理和 FTP 代理框留空。
只要您打开 SSH 会话连接,隧道就会保持活动状态并打开。 当您结束 SSH 会话并与服务器断开连接时,隧道也将关闭。 Just reconnect with the appropriate command (or the appropriate options in PuTTY) to reopen the tunnel.
Linux 命令 | ||
文件 | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev ·查看·字符串·类型·重命名· zip ·解压缩· mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
流程 | 别名· screen · top · nice · renice ·进度· strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat ·超时·墙·是·杀死·睡眠· sudo · su ·时间· groupadd · usermod ·组· lshw ·关机·重新启动·停止·关机· passwd · lscpu · crontab ·日期· bg · fg | |
联网 | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
相关:适合开发人员和爱好者的最佳 Linux 笔记本电脑