当连接仅限于 imap.gmail.com 时,Mutt 有时会挂起

当连接仅限于 imap.gmail.com 时,Mutt 有时会挂起

我想限制电子邮件客户端仅连接到 1 个 IMAP 服务器 - imap.gmail.com。并写了这个 iptables 规则:

iptables -A OUTPUT -d imap.gmail.com -p tcp --dport imaps -j ACCEPT

我有一个电子邮件客户端:mutt,有时会连接到该服务器。有时不是。

当我从规则中删除“-d imap.gmail.com”时,它每次都会开始工作:

iptables -A OUTPUT -p tcp --dport imaps -j ACCEPT

也许,这与 gmail 有很多 IP,并且 mutt 下次尝试连接到不同的 IP 这一事实有关。防火墙会阻止它吗?

在这种情况下我应该如何指定允许的主机?

答案1

imap.gmail.com拥有许多不同的 IP 地址,这对于大容量、高可用性的服务来说并不奇怪。 DNS 服务器显然返回两个地址(至少对我来说是这样),但地址集会随着时间的推移而变化(由于缓存,它会在几分钟内保持不变)。

当您设置规则时,DNS 服务器返回两个地址 A1 和 A2。 iptables 程序足够聪明,可以检测到这一点,并创建两条规则,每一个对应两个 IP 地址。

几分钟后,您运行电子邮件客户端,其 DNS 请求返回两个地址 A3 和 A4,大多数情况下与 A1 和 A2 不同。所以 mutt 使用第一个 A3,并且该地址被您的防火墙阻止。

防火墙只看到 IP 数据包。它无法知道电子邮件客户端使用什么 DNS 名称。事实上,电子邮件客户端可以直接使用 IP 地址。 IP 数据包发送至 IP 地址,不包含主机名。 IMAP 连接内可能有主机名,但由于您使用的是 IMAPS,因此该连接是加密的,并且您的防火墙无法监视流量。

服务器在 SSL 握手期间发送其身份(在证书中),因此您可以检查流量并在服务器的证书不符合您的喜好时中止连接。你可以用 iptables 来做到这一点,尽管不是 100% 可靠(我认为只有当您匹配的字符串位于单个 TCP 数据包内时才有效)。为了完全可靠地做到这一点,您需要设置一个内容敏感的代理。

相关内容