套接字之间的双工管道似乎在 NAT 后面中继 TLS 以进行 SMTP,但只是有时

Duplex pipe between sockets seems to relay TLS behind NAT for SMTP but only sometimes

本文关键字:SMTP TLS 管道 之间 NAT 套接字      更新时间:2023-09-26

这是设置:

[Proxy/Relay Server] <---------[(SMTP TLS test client) Test server]
              ^    
              |
(Internet)    v 
--------------+-----------------
              |
          [Router]
              |
              |
[     Home email appliance machine
              |
  (Home email server app (Node.js))
              |
         (Postfix)                    ]

所以这个小服务器在家里的NAT后面。外部服务器用作 IMAP 和 SMTP 的代理/中继。

  1. 家用电子邮件设备应用程序连接到互联网上的代理/中继服务器。
  2. 家庭电子邮件设备应用程序连接到本地主机上的 SMTP 后缀端口。
  3. 家庭电子邮件应用程序在两个连接之间创建双向管道。
  4. 从互联网上的测试服务器,将支持 TLS 的 SMTP 客户端连接到代理/中继服务器。
  5. 代理/中继服务器从家庭电子邮件设备在代理连接和预先存在的连接之间传输数据。
  6. SMTP 客户端执行 STARTTLS 协议。
  7. 家庭电子邮件设备应用程序通过管道在代理/中继和本地主机 SMTP 之间传输数据,以通过 TLS 执行 SMTP。

我们使用openssl s_client来测试与代理/中继服务器的TL连接,该代理/中继服务器将数据来回传输到NAT后面的客户端。

它适用于

纯文本,但我不确定它是否始终适用于 TLS。偶尔我会从 openssl s_client命令中获得带有 SSL 证书等的完整输出,但通常它只是说 CONNECTED 并坐在那里。不确定它在这些情况下是否有效。

基本上,它的代码在带有Postfix的计算机上的NAT(路由器)后面运行(有一些安全的东西,但基本上就是这样):

proxyOutgoing = net.connect(proxyport, proxyhost)
localSMTP = net.connect(587, 'localhost')
localSMTP.pipe(proxyOutgoing).pipe(localSMTP)

我想弄清楚的是,这个基本想法是否会导致openssl s_client测试或TLS通常只是偶尔"工作"?我需要以某种方式冲洗管道或奇怪的东西吗?它一直说已连接(000003),但通常只是这样,没有证书信息。

一种理论是 tlsmgr 正在缓存会话,这就是为什么自从它已经设置好以来我没有看到 STARTTLS 的东西。

感谢任何有意见或想法的人。

答案基本上是步骤 2 需要在步骤 4 之后出现,否则不会收到来自本地 SMTP/IMAP 服务器的初始响应,并且 STARTTLS 协议测试客户端不起作用,因为它们正在等待连接上的标准问候语。 起初,本地邮件服务器早期连接到的原始顺序似乎有效,因为明文SMTP命令后来通过,但通常客户端希望在连接时收到某些邮件。