SSH隧道的直观指南

2021-02-09 20:22:45

该页面在直观地显示流量时说明了SSH隧道的使用案例和示例。例如,这是一个反向隧道,该隧道仅允许IP地址1.2.3.4的用户通过SSH服务器访问SSH客户端上的端口80。

SSH隧道是SSH客户端和服务器之间的加密TCP连接,它允许进入隧道一侧的流量透明地从另一侧退出。虽然该术语最初是指使用TUN / TAP虚拟网络接口的隧道,但如今通常用于指代SSH端口转发。用例包括:

本地端口转发使您可以将SSH客户端上的流量通过SSH服务器转发到某个目标。这使您可以通过加密连接访问远程服务,就像它们是本地服务一样。用例示例:

远程端口转发使您可以将SSH服务器上的流量通过SSH客户端或其他远程主机转发到目标,这使公用网络上的用户可以访问专用网络上的资源。

动态端口转发在SSH客户端上打开一个SOCKS代理,使您可以通过SSH服务器将TCP流量转发到远程主机。

如果要打开特权端口(端口1-1023)以转发流量,则需要在打开端口的系统上以超级用户特权运行SSH。

sudo ssh -L 80:example.com:80 SSH服务器

-f#将ssh进程派生到后台-n#防止从STDIN读取-N#不运行远程命令。仅在转发端口时使用-T#禁用TTY分配这是您将在后台创建SSH隧道的命令示例,该隧道通过ssh服务器转发本地端口。

ssh -fnNT -L 127.0.0.1:8080:example.org:80 ssh服务器

ssh -L 127.0.0.1:8080:example.org:80 ssh-server通过ssh-server将连接转发到本地系统上的127.0.0.1:8080到example.org上的端口80。本地系统和ssh-server之间的流量包装在SSH隧道中,但ssh-server和example.org之间的流量不是。从example.org的角度来看,流量来自ssh-server。

ssh -L 8080:example.org:80 ssh服务器ssh -L *:8080:example.org:80 ssh-server通过隧道将连接转发到本地系统所有接口上的8080端口到example.org:80 -服务器。

ssh -L 192.168.0.1:5432:127.0.0.1:5432 ssh-server将连接转发到本地系统上的192.168.0.1:5432到ssh-server上的127.0.0.1:5432。请注意,从ssh-server的角度来看,这里的127.0.0.1是localhost。

确保在SSH服务器上启用了TCP转发。默认情况下应该是。

AllowTcpForwarding是如果您要在127.0.0.1以外的接口上转发端口,则需要在ssh_config或asa命令行选项中启用本地系统上的GatewayPorts。

GatewayPorts是

如果要使用安全连接来访问通过纯文本进行通信的远程服务。例如,redis和memcachedall使用纯文本协议。如果您通过公共网络安全地访问远程服务器上的这些服务之一,则可以从本地系统到远程服务器建立隧道连接,而不必通过公共Internet进行监听。

ssh -R 8080:localhost:80 ssh-server将流量转发到ssh-server上端口8080上的所有接口到本地计算机上的localhost端口80。如果这些接口之一可用于公用Internet,则连接到端口8080的流量将转发到您的本地系统。

ssh -R 1.2.3.4:8080:localhost:80 ssh-server将流量转发到本地系统上的ssh-server:8080到localhost:80,同时仅允许从IP地址1.2.3.4访问ssh-server上的SSH隧道入口。与此一起使用GatewayPorts客户端指定的指令。

ssh -R 8080:example.org:80 ssh-server将流量转发到本地系统上ssh-server:8080上的所有接口到localhost:80。然后,从您的本地系统将流量转发到example.org:80。从example.org的角度来看,流量源自您的本地系统。

默认情况下,公共Internet无法访问转发的端口。您需要将此端口添加到远程服务器上的sshd_config中,以将公共Internet流量转发到本地计算机。

GatewayPorts是,或者如果您想指定允许哪些客户端访问,则可以在sshd_config中使用以下内容代替

指定的GatewayPorts客户端

ssh -D 3000 ssh-server在本地系统所有接口的端口3000上打开一个SOCKS代理。这使您可以将通过代理发送的流量转发到任何端口或目标主机上的ssh-server。默认情况下,SSH将使用SOCKS5协议,该协议转发TCP和UDP通信。

运行SOCKS代理后,可以将Web浏览器配置为使用代理访问资源,就好像连接是从ssh-server发起的一样。例如,如果ssh-server可以访问专用网络中的其他服务器,则可以使用SOCKS代理来访问本地的其他服务器,就像在网络上一样,而无需设置VPN。

如果您希望SOCKS代理可用于除本地主机以外的更多接口,请确保在本地系统上启用GatewayPort。

GatewayPorts是由于此处在SSH客户端上配置了GatewayPorts,因此您也可以使用命令行选项而不是ssh_config对其进行配置。

ssh -o GatewayPorts =是-D 3000 ssh服务器

ssh -J user1 @ jump-host user2 @ remote-host ssh -o" ProxyJump user1 @ jump-host" user2 @ remote-host与跳转主机建立SSH连接,并将TCP通信转发到远程主机。通过中间的跳转主机连接到远程主机。如果跳转主机已经具有对远程主机的SSH访问权限,则上述命令应立即可用。如果不是,则可以使用代理转发将本地计算机的SSH身份转发到远程主机。

ssh -o ProxyCommand =" nc -X 5 -x localhost:3000%h%p" user @ remote-host使用netcat通过SOCKS5代理连接到远程服务器。从服务器的角度来看,原始IP来自代理主机,但是SSH连接本身是端到端加密的,因此仅代理主机查看本地系统和远程主机之间的加密通信流。

要启用代理转发,可以使用ssh-add将本地SSHidentity添加到本地ssh代理。

SSH添加

上面列出的命令是临时运行的,但是如果您想通过网络中断或不可靠的连接来维护SSH隧道,则必须进行一些附加设置。

默认情况下,一段时间不活动后,用于建立SSH隧道的TCP连接可能会超时。为了防止超时,可以将服务器配置为发送心跳消息。

ServerAliveInterval 15 ServerAliveCountMax 4 ClientAliveInterval 15 ClientAliveCountMax 4

尽管上述选项可以防止由于不活动而导致连接断开,但它们不会重新建立断开的连接。要确保重新建立SSH隧道,可以使用autossh来建立SSH隧道并监视其运行状况。

autossh -R 2222:localhost:22 ssh-server这将建立一个反向隧道,该隧道在网络故障后会返回。默认情况下,AutoSSH将在SSH客户端和服务器上打开额外的端口以进行运行状况检查。如果运行状况检查端口之间似乎不再有流量通过,则AutoSSH将重新启动SSH隧道。

autossh -R 2222:localhost:22 \ -M 0 \ -o" ServerAliveInterval 10" -o" ServerAliveCountMax 3"远程主机使用-M 0标志禁用运行状况检查端口,并允许SSH客户端处理运行状况检查。在此示例中,SSH客户端希望服务器每10秒发送一次心跳。如果连续3个心​​跳失败,则SSH客户端退出,并且AutoSSH将重新建立新连接。

假设在专用网络上有一个git存储库,该存储库只能通过网络上的专用服务器进行访问。该服务器不可用于publicinternet。您可以直接访问服务器,但不能访问专用网络的VPN。

为了方便起见,您希望访问此私有git存储库,就好像您是直接从本地系统连接到它一样。如果您对本地服务器和私有服务器均可访问的另一台服务器具有SSH访问权限,则可以通过建立SSH隧道并使用几个ProxyCommand指令来实现此目的。

ssh -L 127.0.0.1:22:127.0.0.1:2222中间主机它将中间主机上的端口2222转发到专用服务器上的端口22。现在,如果您从中间主机SSH到端口2222,则您'即使公用Internet无法访问专用服务器,也要重新连接到专用服务器上的SSH服务器。

ssh -p 2222 user @ localhost如果您想使后门更加方便,则可以向本地〜/ .ssh / config添加一些指令

主机git.private.network主机名git.private.network ForwardAgent是ProxyCommand ssh私有nc%h%p主机私有主机名localhost本地端口2222用户私有用户ForwardAgent是ProxyCommand ssh tunnel @ intermediate-host nc访问%h%p到私有git仓库,就像您在私有网络上一样。