通过SSH隧道使用服务器的IP

首先,我的设置是Ubuntu笔记本电脑和Ubuntu服务器。

我在我的本地笔记本电脑上有一个需要访问某个networking服务的程序(可以叫http://someserver.com/someservice123 )。 现在这个服务有一个防火墙,只允许从我的服务器的IP访问。

是否有某种types的SSH隧道,我可以使用我的笔记本电脑和服务器之间,以便当我的笔记本电脑上的Python脚本发送请求http://someserver.com/someservice123该服务看到来自我的服务器的IP请求?

我知道它会看起来像这样:

ssh -N -R 80:localhost:80 user@myserver 

但我不确定。

你想要的不是一个反向隧道,而是一个常规隧道。

 ssh -L 80:someserver.com:80 user@myserver 

这将在您的笔记本电脑(localhost)的端口80上创build一个监听套接字,该套接字将通过myserver上的SSH服务器转到someserver.com。

我通常将隧道与选项-CfN结合,-C将启用压缩(加快速度),-f在authentication完成后将SSH发送到后台(因此,如果需要,您仍然有机会input密码) ,-N将确保在SSH服务器上没有执行任何命令(在后台运行SSH可能假设被用来向服务器发送命令是不安全的,这是一个健康的偏执狂/一个很好的做法)。

如果你不关心在你的笔记本电脑和myserver之间build立一个非常安全的连接,你也可以将密码改为快速的,比如使用-fishfish的河豚,或者arcfour128(这个更快)。

所以我会用这个:

 ssh -CfNc arcfour128 -L 80:someserver.com:80 user@myserver 

这会给你一个很好的,快速的隧道,直接进入后台,而不是在服务器上留下一个打开的命令提示符。

请记住,如果你把它发送到背景,当你想打破隧道,你必须先find进程ID,做一些像ps -ef | grep ssh ps -ef | grep ssh并杀死正确的进程ID。

你可以使用ssh提供的SOCKS代理。 通过连接

 ssh -D 9999 user@myserver 

然后你就可以在你的python脚本中使用这个SOCKS代理了, 如何使用带有urllib2的SOCKS 4/5代理 :

 import socks import socket socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9999) socket.socket = socks.socksocket 

(把这段代码放在脚本的顶部)

我的build议是使用:

ssh -L 8080:localhost:80 user @ server

这样,通过将程序连接到http://localhost:8080/ ,您不会与端口80是特权端口发生冲突。 另外,我会使用选项-C进行压缩,使用-f作为背景, -N使用不打开terminal。
所以ssh -CfN -L 8080:localhost:80 user@server应该这样做


继续您的评论,请允许我引用tutorialspoint.com :

一个简单的客户:

 import socket # Import socket module s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 8080 # Reserve a port for your service. s.connect((host, port)) s.close 

正如你使用Python连接到networking的手段,我假设你的代码中有一个connect()语句。

(按照链接更深入的信息。);-)