在Linux/Unix/BSD服务器上设置SSH隧道以绕过NAT
如何在台式机/笔记本电脑和远程数据中心的服务器之间设置加密隧道,以绕过网络的限制?
如何在类似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)。