我正在运行无法访问源代码的旧版应用程序。这些组件在特定端口上使用纯文本相互通信。我希望能够使用类似 stunnel 的东西来保护两个或多个节点之间的通信,以促进点对点通信,而不是使用更传统(且集中式)的 VPN 包(如 OpenVPN 等)。
理想情况下,流量应该是这样的:
- app@hostA:1234 尝试打开与 app@hostB:1234 的 TCP 连接。
- iptables 捕获端口 1234 上的流量并将其重定向到在 hostA 端口 5678 上运行的 stunnel。
- stunnel@hostA 与 stunnel@hostB:4567 协商并建立连接。
- stunnel@hostB 将任何解密的流量转发到 app@hostB:1234。
本质上,我试图将其设置为任何到端口 N 的出站流量(在本地机器上生成)都通过 stunnel 转发到端口 N+1,并且接收端在端口 N+1 上接收、解密并转发到端口 N 上的本地应用程序。
当 stunnel@hostB 转发到 app@hostB 时,我并不特别担心丢失 hostA 原始 IP 地址/机器身份,因为通信有效负载包含识别信息。
另一个技巧是,通常使用 stunnel 时,您会拥有客户端/服务器架构。但此应用程序更像 P2P,因为节点可以动态地来来去去,而在 stunnel 配置中硬编码某种“connection = hostN:port”将不起作用。
编辑:另一种可能性可能是配置某种默认路由,以便到端口 N 的出站流量通过配置为网关的 stunnel 转发......
答案1
我认为 iptables 在这里似乎有点多余。
appA 是 hostA 上的应用程序的一个实例(外部 IP AAAA) appB 是 hostB 上的应用程序的一个实例(外部 IP BBBB)
- appA 在 hostA 上监听 127.0.0.1:1234
hostA 上的 stunnel 配置为将加密连接从 AAAA:1234 转发到 127.0.0.1:1234
[应用程序A]
接受 = AAAA:1234
连接 = 127.0.0.1:1234
客户端 = 否
hostB 上的 stunnel 配置为创建加密隧道并从 127.0.0.1:4321 转发到 AAAA:1234
/usr/bin/stunnel -d 127.0.0.1:4321 -r AAAA:1234
appB 与 127.0.0.1:4321 建立连接
对于 hostB 来说,反之亦然