这是部分编程,部分系统管理员,所以如果您觉得这应该在服务器故障中结束,请原谅。
我有一个不 SOCKS感知的应用程序,我们需要通过防火墙使用。我们无法修改应用程序以获得SOCKS支持。
目前,我们通过将应用程序与主机上的环回适配器对齐的IP别名,然后创建到其他主机的SSH隧道来实现此目的。应用程序使用的IP是硬编码的。我们的SSH连接如下:
ssh -L 1.2.3.4:9999:1.2.3.4:9999 user @ somehost
其中1.2.3.x是环回上的别名。
因此,应用程序连接到环回上的开放端口,该端口将被发送到SSH主机并发送到真正的1.2.3.4。
它有效,但问题是这个应用程序连接到很多IP(50+),所以我们最终会从框中输出50个ssh连接。
我们尝试使用多个“代理”应用程序,例如tsocks和其他应用程序,但是它们有很多问题(应用程序在OS X上运行,并且tsocks不能很好地工作,即使有补丁)< / p>
我们的想法是编写一个监听指定端口上所有接口的守护进程 - 然后它将从应用程序中获取传入的数据包,刮取数据包信息(dst IP,端口,有效负载),重新创建数据包并将其代理通过单个SSH SOCKS连接(ssh -D 1080用户@ somehost)。这样,我们只有1个SSH连接,所有端口都被代理通过。
我的问题是 - 这可行吗?这里有什么我想念的吗?我一直在梳理pfctl,ipfw,iptables docs,但是我没有看到通过这些选项做任何选择,这似乎不是最困难的代码。它将根据原始目标IP和端口重新创建数据包,连接到本地SOCK代理并重新发送数据包,就像它是原始应用程序一样,但现在支持SOCKS。
如果我遗漏了某人已经知道的事情,请告诉我。我不太了解套接字编程或SOCKs,但这似乎不是一个需要解决的项目太大,但我想要一些意见,如果我咬得更多,我应该。
由于
答案 0 :(得分:1)
如果您的应用程序可以添加SOCKS客户端支持,您可以简单地ssh -D lock_socks_port remote_machine
,它将打开本地* lock_socks_port *作为localhost上的SOCKS服务器,然后可以连接到远程计算机可访问的任何主机。
示例:假设您使用的是不受加密的不受信任的WiFi网络。您只需启动ssh -D 1082 home
,然后将您的Web浏览器配置为使用 localhost:1080 作为SOCKS服务器。当然,您需要一个支持SOCKS的客户端。所有流量都会显示为来自您的网关,并且连接对于窥探无线网络的人来说是不透明的。
您还可以打开一个ssh
个客户端,其中包含无限数量的LocalForward
个请求,这些请求将通过单个ssh会话进行隧道传输。
此外,您可以使用ssh的ControlMaster
和ControlPath
选项将ssh连接添加到已建立的ssh连接。