我如何知道我的ssh隧道是否创建成功?


21

我依靠tunnel.sh其他人编写的以下脚本来保持ssh隧道的生命:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

要创建持久的ssh隧道,我只需发出tunnel.sh。直到tunnel.sh再次发出通知,隧道才会关闭。

我想知道如何验证ssh隧道是否确实创建成功?

隧道的主要用途是将文档打印到与服务器位于同一LAN中的某些打印机,并且只能从LAN内访问打印机。创建隧道后,现在打印不会报告任何问题,但是由于我不在那儿,所以我无法检查文档是否确实已打印。

我以为由于隧道的缘故,由于我现在在局域网中,所以我的外部IP应该与服务器的IP相同。但实际上它们并不相同(我通过找到了它们wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//')。我想知道为什么?当我通过隧道连接到Internet上的某个网站时,由于我和服务器之间的隧道,服务器不是我和互联网网站之间的中间点吗?

Answers:


25

这要复杂得多:-)

启动隧道:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

停止隧道:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

这就是您需要做的。如果需要详细信息,请跳到下面。

第二个问题是IP。不,您的IP不会更改。您要做的就是通过远程主机创建一个SOCKS代理。除非您告知您,否则系统不会自动使用此代理。

SSH解释
Args启动隧道的方法
-f::告诉ssh后台。只有成功启动(与-o下面的参数配合使用),它才会自动后台运行。
-o ExitOnForwardFailure=yes:这告诉ssh如果无法设置SOCKS代理则退出。
-N:不执行命令。我们只想建立隧道,而不对远程主机执行任何操作。
-D 9999:您的SOCKS代理。
-M注意:这是使-S参数在这里工作所必需的。
-S /tmp/ssh_tunnel_%h.sock:这告诉它使用/tmp/ssh_tunnel_HOSTNAME.sock作为其控制套接字。该-M选项告诉它ssh需要设置此套接字,并且不向已在套接字上侦听的另一个ssh发出命令。在ssh已经运行之后,您可以使用此套接字来设置其他隧道。的%h 使用远程主机的主机名作为文件名的一部分。

用于阻止隧道的Args
-S /tmp/ssh_tunnel_%h.sock::这应该是显而易见的。但是,由于我们没有发出-M,这意味着ssh应该连接到已经存在的套接字,并告诉它该做什么而不是自己做什么。
-O exit:这是的一部分-S。我们告诉ssh在套接字上侦听以退出。
$SSH_HOST这里仍然需要。即使您指定一个绝对的套接字路径而不使用%h文件名,ssh仍然希望指定一个远程主机。这就是为什么我将%h参数放入。如果ssh要请求主机,也可以使用它,它可以使事情井井有条。


5

这种类型的隧道不会更改您的IP地址信息。它所做的只是告诉您的计算机打开端口9999,并通过ssh连接将该端口的连接转发到远程计算机(tim @ server)。测试连接是否正常的最简单方法是通过telnet到在其上创建了转发的端口(在您的示例中为9999):

$ telnet localhost 9999
正在尝试服务器...
已连接到服务器。
转义字符为'^]'。

如果收到“已连接到服务器”。消息,这意味着您的隧道已建立。如果相反,您得到:“无法连接到远程主机:连接被拒绝”,则您的隧道没有启动。

关于第二个问题,对于您的浏览器,除非您告知,否则您的浏览器将不会使用该隧道。在浏览器的网络设置中,您可以配置代理设置,并将localhost:9999指定为socks5代理,然后您的Web连接应使用ssh隧道,并且似乎来自服务器的IP地址。


+1谢谢!(1)当我在局域网中打印到打印机时,如何知道进入端口9999,即使用隧道?没有别的吗 (2)是否有更改我的IP地址信息的隧道类型?
蒂姆(Tim)

@Tim可能是已将特定打印机配置为打印到特定IP地址和端口。这取决于打印机的设置方式。通常,在定义打印机时可以同时指定两者。是的,有些隧道将具有自己的IP信息。通常,对于这些用户,您将创建一个单独的tun / tap en.wikipedia.org/wiki/TUN/TAP接口,该接口将附加有其自己的IP地址,并且从该地址发出的所有流量似乎都来自不同的网络。
gabe。

谢谢!在Firefox的首选项中,在“高级”->“连接”->“设置”中,选择手动代理配置,然后为HTTP Proxy键入“ localhost”,为端口键入“ 9999”。之后,我将无法连接到Firefox中的任何网站。我想知道为什么?
蒂姆(Tim)

@Tim有点令人困惑...要设置的正确内容是:SOCKS主机,而不是HTTP代理。第一次尝试时,我遇到了同样的问题。
gabe。

1

就我而言(Ubuntu 14.10上的Google Chrome),我的外部地址至少在浏览器中确实发生了变化。只是谷歌“我的IP地址是什么?” 有和没有代理连接。

另外,设置代理后,请尝试销毁隧道,看看是否仍能获得流量。当我这样做时,chrome返回错误“无法连接到代理服务器”。

另一种方法:隧道传输到远程主机后,创建一个新的ssh会话并运行tcpdump -A dst port 80。然后浏览到某个页面,您应该在终端中看到相关的流量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.