首先,我的设置是一台 Ubuntu 笔记本电脑和一台 Ubuntu 服务器。
我的本地笔记本电脑上有一个程序需要访问某个网络服务(我们称之为http://someserver.com/someservice123)。现在这个服务有一个防火墙,只允许从我的服务器的IP进行访问。
是否有某种类型的 SSH 隧道可用于我的笔记本电脑和服务器之间,以便当我笔记本电脑上的 Python 脚本向http://someserver.com/someservice123该服务是否看到来自我服务器 IP 的请求?
我知道它看起来应该是这样的:
ssh -N -R 80:localhost:80 user@myserver
但我不太确定。
答案1
你想要的不是反向隧道而是常规隧道。
ssh -L 80:someserver.com:80 user@myserver
这将在您的笔记本电脑(localhost)的端口 80 上创建一个监听套接字,该套接字将通过 myserver 上的 SSH 服务器转到 someserver.com。
我通常将隧道与选项 -CfN 结合使用,-C 将启用压缩(稍微加快速度),-f 在身份验证完成后将 SSH 发送到后台(因此您仍然有机会在需要时输入密码),-N 将确保没有在 SSH 服务器上执行任何命令(在后台运行 SSH 并不安全,假设可以使用它向服务器发送命令,这是一种健康的偏执/一种良好做法)。
如果您不关心您的笔记本电脑和 myserver 之间的连接是否非常安全,您也可以将密码更改为更快的密码,例如使用 -c blowfish 的 blowfish 或 arcfour128(速度更快)。
所以我会用的是这个:
ssh -CfNc arcfour128 -L 80:someserver.com:80 user@myserver
这将为您提供良好、快速的隧道,直接进入后台,而不是在您的服务器上留下打开的命令提示符。
请记住,如果您将其发送到后台,当您想要断开隧道时,您必须首先通过执行类似操作来找到进程 ID ps -ef | grep ssh
,然后终止正确的进程 ID。
答案2
您可以使用 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
(将此代码放在脚本顶部)
答案3
我的建议是使用:
ssh -L 8080:localhost:80 用户@服务器
这样,通过将程序连接到 ,您就不会与端口 80 的特权端口发生冲突http://localhost:8080/
。此外,我会使用-C
压缩、-f
后台运行和-N
不打开终端的选项。
所以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 的方式连接网络,我假设connect()
您的代码中有一个语句。
(请点击链接获取更多深入信息。);-)