使用 iptables 和 stunnel 加密点对点应用程序

使用 iptables 和 stunnel 加密点对点应用程序

我正在运行无法访问源代码的旧版应用程序。这些组件在特定端口上使用纯文本相互通信。我希望能够使用类似 stunnel 的东西来保护两个或多个节点之间的通信,以促进点对点通信,而不是使用更传统(且集中式)的 VPN 包(如 OpenVPN 等)。

理想情况下,流量应该是这样的:

  1. app@hostA:1234 尝试打开与 app@hostB:1234 的 TCP 连接。
  2. iptables 捕获端口 1234 上的流量并将其重定向到在 hostA 端口 5678 上运行的 stunnel。
  3. stunnel@hostA 与 stunnel@hostB:4567 协商并建立连接。
  4. 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)

  1. appA 在 hostA 上监听 127.0.0.1:1234
  2. hostA 上的 stunnel 配置为将加密连接从 AAAA:1234 转发到 127.0.0.1:1234

    [应用程序A]

    接受 = AAAA:1234

    连接 = 127.0.0.1:1234

    客户端 = 否

  3. hostB 上的 stunnel 配置为创建加密隧道并从 127.0.0.1:4321 转发到 AAAA:1234

    /usr/bin/stunnel -d 127.0.0.1:4321 -r AAAA:1234

  4. appB 与 127.0.0.1:4321 建立连接

对于 hostB 来说,反之亦然

相关内容