在Linux/Unix/BSD服务器上设置SSH隧道以绕过NAT

时间:2020-01-09 10:43:37  来源:igfitidea点击:

如何在台式机/笔记本电脑和远程数据中心的服务器之间设置加密隧道,以绕过网络的限制?
如何在类似Unix的系统上创建反向SSH隧道?
可以将SSH隧道视为可怜的VPN。
如果您希望对任何可能在网络上监听或者窃听的人隐藏交通,这非常方便。

[/donotprint]您可以在计算机和Unix/BSD/Linux服务器之间使用这种隧道来绕过网络设置的限制或者绕过NAT等。

有关Internet协议,端口,tcp和udp的更多信息

Internet协议不过是一组在台式机和Internet(或者WAN或者Lan)上的服务器之间发送信息的规则。
每台计算机至少有一个IP地址。
每个规则都像一种语言,在计算机科学中,您将其称为协议。
可以使用协议通过Internet进行通信。

通用应用协议

例如,您可以使用HTTP(超文本传输协议)或者HTTPS(安全超文本传输协议)协议来查看镜像或者从Internet下载文件。
您可以使用DNS(域名系统)协议将易于记忆的域名(例如www.theitroad.local)转换为数字IP地址(例如75.126.153.206),反之亦然。
您可以使用ssh(安全Shell)进行安全的数据通信,远程命令行登录,远程命令执行等。

拓扑

///////////
                       //Internet//
                       ////////////
                            |
     +---------------+      |       +-------------+
     | Unix/Linux    |      |       | Linux/Unix  | 
     | Server with   +------+-------+ OSX/*BSD    |
     | OpenSSH SSHD  |              | Client      |
     +---------------+              +-------------+
       randomhost.net            client1.theitroad.local
     75.126.153.206                  192.168.1.42
                               (loopback interface 127.0.0.1)

其中:

  • randomhost.net您在此基于Linux/Unix的服务器上拥有一个帐户。
  • client1.theitroad.local您用于连接到server1.theitroad.local服务器的台式机/笔记本电脑。您需要使用IP地址为127.0.0.1的回送接口。只有安装在桌面上的应用程序(例如浏览器,irc客户端,电子邮件客户端等)才能访问127.0.0.1。

示例:IRC客户端的SSH隧道

本地接口(IP 127.0.0.1)上的本地端口8888与irc.freenode.net上的IRC服务器之间的隧道,绑定到远程计算机端口6667。
您将使用回送接口连接到该隧道:

///////////
                       //Internet//
                       ////////////
                            |
     +---------------+      |       +-------------+
     | Unix/Linux    |      |       | Linux/Unix  | 
     | Server with   +------+-------+ OSX/*BSD    |
+----+ OpenSSH SSHD  |              | Client      |
|    +---------------+              +-------------+
|      randomhost.net            client1.theitroad.local
|    75.126.153.206                  192.168.1.42
|                              (loopback interface 127.0.0.1:8888)

如果您使用以下命令登录您的Shell帐户:SSH隧道的ssh [email protected],则必须添加其他参数。
它是这样的:

ssh -L 8888:irc.freenode.net:6667 [email protected]

如果您用来建立隧道的服务器/shell帐户正在侦听其他端口,例如2745,则将这样写:

ssh -p2745 -L8888:irc.freenode.net:6667 [email protected]

这将通过randomhost.net上的Shell帐户在您的计算机与irc.freenode.net之间建立一条隧道。
在进入irc.freenode.net之前,所有流量将作为加密的SSH流量通过您的Shell帐户。
您的计算机现在就像侦听端口8888的irc服务器一样。
将其替换为您要高于1024的任何端口,以免发生冲突。

连接到本地端口,就好像它是irc服务器一样。
在irssi上,这将是:

/server 127.0.0.1 8888

这也将适用于任何其他irc客户端,例如X-Chat。
使用127.0.0.1/8888作为服务器名称,一切顺利。
其他字段保持不变。

如何设置反向SSH隧道

在机器位于NAT或者公司防火墙之后的情况下,正常的SSH隧道将无法工作。
为了克服这个问题,我们必须利用反向SSH隧道。
为此,您需要一个可访问Internet的服务器以及NAT /防火墙后面的计算机。
在此教程中,我们将NAT /防火墙后面的计算机称为NATbox,将可访问Internet的计算机称为OPENbox。

对于反向SSH隧道,基本上涉及三个端口。
一个是工作站的SSH端口,我们使用它将反向隧道端口转发到其中。
第二个是反向隧道端口,该端口转发到工作站的SSH端口。
第三个是公用文件夹的SSH端口,我们需要该端口将SSH放入公用文件夹。

如果从外部使用公用箱的SSH端口,则登录到该箱。
如果使用反向隧道端口,则将转发到工作站。
执行此操作时,必须注意用户名。

public box ip + public box SSH port + public box username -> access to public box 
public box ip + reverse tunnel port + workstation username -> access to workstation

要从工作站建立反向隧道,您将使用:

public box ip + public box SSH port + public box username

并在其他随机端口上设置反向隧道,并将其转发到本地SSH端口。

为了进一步保护SSH守护程序,您可以在默认情况下阻止SSH端口的地方实现端口敲除,并在发送特殊数据包时为您打开端口。
您可以为某些IP打开SSH端口。

因此,让我们考虑一下,OPENbox正在侦听端口1234上的SSH。
在NATbox上执行以下内容:

ssh -p1234 -R 5555:localhost:22 [email protected]

这将启动从NATd /防火墙框后面的连接到可公开访问的框的连接,该框在端口1234上列出到SSH。
一旦建立连接,它将在端口22上创建反向隧道,供远程方连接并进入。

OPENbox上的以下命令:

ssh  -p5555 natboxuser@localhost

由于NATd /防火墙框与OPENbox建立了连接,因此隧道将通过同一通道。
此外,在其他任何地方执行以下内容以访问NATbox,它将通过OPENbox传输流量:

ssh -p5555 natboxuser@OPENbox

这需要在OpenSSHD服务器上进行其他设置,将这些行添加到/etc/ssh/sshd_config中。

GatewayPorts yes

保存并关闭文件。
确保在远程服务器上重新启动/重新加载SSHD。

总结

访问远程服务器端口而不修改防火墙设置语法如下:

## Syntax ##
ssh -f -L {local-port}:localhost:{remote-server-port} [email protected]
 
# Use port 8888 on the localhost to connect to port 4444 on host foo for user bar and run in the background#
# Use port 8888 for your apps such as firefox, xchat, and more #
ssh -D 8888 -f -C -q -N -p 4444 foo@bar &

其中:

  • -f:在命令执行之前,要求ssh进入后台。
  • -L port:指定将本地(客户端)主机上的给定端口转发到远程上的给定主机和端口。
  • -p port:连接到远程主机上的端口。
  • -R:指定将远程(服务器)主机上的给定端口转发到本地的给定主机和端口。
  • -D port:指定本地"动态"应用程序级端口转发。
  • -C:请求压缩所有数据。这对于加快连接速度很有用。
  • -q:安静模式使大多数警告和诊断消息被抑制。
  • -N:不执行远程命令。这对于仅用于防护端口很有用。

有关更多信息,请参见手册页:ssh_config(5)。