1

这是部分编程,部分系统管理员,所以如果你觉得这应该在服务器故障上结束,请原谅。

我有一个支持 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 不能很好地工作,即使有补丁)

我们的想法是编写一个监听指定端口上所有接口的守护进程——然后它会从应用程序中获取传入的数据包,抓取数据包信息(dst IP、端口、有效负载),重新创建数据包并通过单个代理它SSH SOCKS 连接( ssh -D 1080 user@somehost )。这样,我们只有 1 个 SSH 连接,所有端口都被代理通过。

我的问题是——这可行吗?有什么我在这里想念的吗?我一直在梳理 pfctl、ipfw、iptables 文档,但我没有看到任何选项可以通过这些文档来完成,而且这似乎不是最难编码的事情。它将根据原始目标 IP 和端口重新创建数据包,连接到本地 SOCKs 代理并重新发送数据包,就好像它是原始应用程序一样,但现在支持 SOCKS。

如果我错过了有人知道的已经这样做的东西,请告诉我。我不太了解套接字编程或 SOCK,但这似乎不是一个太大的项目来解决,但如果我咬得比我应该的更多,我想听一些意见。

谢谢

4

1 回答 1

1

如果您的应用程序可以添加 SOCKS 客户端支持,您可以简单地ssh -D lock_socks_port remote_machine打开本地 *lock_socks_port* 作为 localhost 的 SOCKS 服务器,然后可以连接到远程机器可访问的任何主机。

示例:假设您正在使用未加密的不受信任的 wifi 网络。您可以简单地启动ssh -D 1082 home,然后将您的网络浏览器配置为使用localhost:1080作为 SOCKS 服务器。当然,您需要一个支持 SOCKS 的客户端。所有流量都将显示为来自您的网关,并且对于那些窥探 wifi 的人来说,连接将是不透明的。

您还可以打开ssh具有无限数量LocalForward请求的单个客户端,这些请求将在单个 ssh 会话之上进行隧道传输。

ControlMaster此外,您可以使用 ssh 的和ControlPath选项将 ssh 连接添加到已建立的 ssh 连接。

于 2012-10-18T13:04:27.607 回答