这是部分编程,部分系统管理员,所以如果你觉得这应该在服务器故障上结束,请原谅。
我有一个不支持 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,但这似乎不是一个太大的项目来解决,但如果我咬得比我应该的更多,我想听一些意见。
谢谢