是否可以通过 iptables 来阻止/中止未加密的 smtp 连接?
有效地拒绝所有没有执行启动 tls 的连接。
答案1
这不可避免地很棘手。TLS 的本质是必须建立与 MTA 的纯文本连接前TLS 可以协商,因此 iptables(在传输层运行)设计不良,无法影响应用层的问题。
您可以编写另一个目标模块并通过该模块引导您的流量,但除非您是网络大神,否则这对您来说可能并不比对我来说更可行。而且我绝对不知道该怎么做。
结果是,在应用程序内部执行应用层内容要容易得多。你没有说你使用的是哪种 MTA,但我怀疑大多数足够聪明可以执行 TLS 的 MTA 都足够聪明可以强制执行它。
我使用 sendmail。各家提供商有一篇关于强制使用 TLS 的文章,地址如下:http://www.brandonhutchinson.com/Using_TLS_with_Sendmail.html,它将我引导到 Access 数据库条目
TLS_Clt:communication_partner_MTA PERM+VERIFY:112
这需要特定的通信伙伴(可能通过 IP 地址标识)使用至少 112 位长度的密钥进行身份验证,并拥有正确签名的证书。sendmail 配置页面位于http://www.sendmail.org/documentation/configurationReadme在 ANTI-SPAM CONFIGURATION CONTROL 部分中,指出涉及 IPv4 地址的访问数据库条目可以采用单个八位字节的形式,然后应用于以该八位字节开头的所有地址。所以我推测,我强调这只是猜测,sendmail 允许我拥有一系列条目
TLS_Clt:1 PERM:112
TLS_Clt:2 PERM:112
TLS_Clt:3 PERM:112
....
TLS_Clt:223 PERM:112
强制所有 IP 地址加密(但不是可验证签名的证书;自签名 TLS 证书非常常见,我倾向于不禁止它们)。我还会不是有一个条目TLS_Clt:127
,因为 localhost 可能不应该受到如此限制。
我再说一遍,我没有测试过上述任何一项,如果您的 MTA 不是 sendmail,上述内容不会特别有帮助;但我想表明我的 MTA(至少)似乎有钩子可以做您想做的事情。祝您调查顺利。
答案2
Iptables 主要用于过滤网络数据包的元数据,例如 IP 标头、TCP 选项等。TLS 在应用程序级别处理:您需要观察 TCP 流内部发生的情况。
您可以使用扩展检查数据包的内容string
,如果内核过滤器不够用,您可以编写用户空间过滤器。但这会非常困难:例如,TCP 流可以以任意方式分解为数据包,并且 TCP 数据包可能会无序接收...您必须处理所有这些问题(重复内核的工作)。
您在这里寻找的是转发 TLS 连接并阻止非 TLS 连接的 SMTP 代理。Iptable 的贡献只是确保 SMTP 流量确实通过代理。