是否有终端命令可以确定 ISP 是否阻止端口 25,而无需实际设置电子邮件服务器?

是否有终端命令可以确定 ISP 是否阻止端口 25,而无需实际设置电子邮件服务器?

我是考虑设置电子邮件服务器,但担心 ISP 会阻止端口 25。在设置电子邮件服务器之前,最好知道端口 25 是否打开。

是否有终端命令可以确定我的 ISP 是否阻止端口 25,而无需实际设置电子邮件服务器?

答案1

您需要测试两件事:它们是否阻塞外向的端口 25 上的连接(对应于您的服务器发送消息),以及它们是否阻塞传入端口 25 上的连接(您的服务器接收消息)。

测试传出连接相当容易。选择一个已知良好的邮件服务器作为测试目标。在这里,我查找@google.com 的邮件服务器:

$ host -t mx google.com
google.com mail is handled by 10 smtp.google.com.

然后我尝试nc打开与它的连接,看看是否获得成功的连接和 SMTP 服务器消息:

$ { sleep 2; echo "quit"; } | nc -w5 smtp.google.com. 25 && echo "connection succeeded" || echo "connection failed"
220 mx.google.com ESMTP p5-20020a170902eac500b001d7077d91b1si1426011pld.170 - gsmtp
221 2.0.0 closing connection p5-20020a170902eac500b001d7077d91b1si1426011pld.170 - gsmtp
connection succeeded
$ 

“220 ...”消息是 SMTP 协议的一部分,基本上是服务器说“欢迎...”。那和“连接成功”告诉我连接有效。

我使用的命令有点复杂,所以它的作用如下:该nc命令尝试打开到服务器上端口 25 的连接(-w5如果没有响应,则在 5 秒后超时)。它等待两秒钟,然后发送“退出”SMTP 命令,礼貌地告诉服务器它将关闭连接,而不发送任何实际电子邮件。之所以存在两秒的延迟,是因为如果您在发送“220 ...”欢迎消息之前开始发送命令,某些服务器会将您视为垃圾邮件发送者。最后,echo最后的命令在那里,因为nc它本身不会打印任何内容来指示连接是否成功或失败,因此这些命令会根据 的退出状态给出适当的消息nc

如果连接被阻止,它就会退出(可能几秒钟后)并打印“连接失败”,而不会从服务器发出任何“220 ...”内容。

还有一些其他更模糊的可能性。正如吉兹指出的在评论中,如果您收到“220 ...”和“连接成功”消息,但“220 ...”消息表明服务器属于您的 ISP 而不是您尝试测试的公司,那么您的 ISP 可能正在拦截传出连接(而不是完全阻止它们),并且您必须调查他们的策略以找出影响。这可能有点含糊,因为服务器名称并不总是符合您的预期(例如,我称为“smtp.google.com”的服务器回答为“mx.google.com”),因此使用多个进行测试不同的目标服务器可能会有所帮助——如果它们全部以同样的方式回答,这非常清楚地表明您正在被拦截。

也可能会收到相互冲突的指示,例如“220 ...”消息后跟“连接失败”,或者除了状态检查中的“连接成功”之外,服务器什么也没有发送。如果发生这些情况,您需要进行一些更详细的检查(例如可能运行tcpdump以观察连接)以弄清楚发生了什么。

测试传入连接更为复杂,因为您首先必须完成为端口 25 设置端口转发(假设您在 NAT 上)、查找公共 IP 地址等所有工作。基本上,您必须配置你的部分您的网络连接以接收端口 25 上的传入连接。

但实际上您并不需要设置邮件服务器,只需在端口 25 上侦听即可。因此,一旦设置好网络,只需在sudo nc -l 25要用作邮件服务器的计算机上运行即可(并且您需要使用您的密码进行身份验证sudo)。这将侦听端口 25 上的连接(并打印它接收到的任何内容);它应该只是坐在那里等待有东西连接到它。

然后你需要测试对其的访问从您的专用网络外部(最好是来自 ISP 网络外部)。最简单的测试可能是去https://www.yougetsignal.com/tools/open-ports/,确保您的公共IP正确,将端口号设置为25,然后单击“检查”。如果有效,它应该显示“端口 25 已打开”[这里是你的IP]" 并且该sudo nc命令将退出(因为它已获得正在等待的连接)而不打印任何内容(因为测试没有发送任何实际数据)。

如果连接未成功,yougetsignal 页面会显示类似“端口 25 已关闭”的信息[这里是你的IP]",并且sudo nc仍会等待连接(您可以使用Ctrl+C来终止它)。这意味着 ISP 正在阻止访问,或者您所做的设置中的某些内容不正确。

答案2

我能想到的最简单的事情是使用tcpdump和嗅探进入public接口的数据包:

# tcpdump -i public tcp port 25

然后登录到不同 ISP 网络上的系统并:

$ telnet myhost.example.com 25

并查看是否tcpdump显示任何传入数据包。

答案3

您可以运行(以 root 身份绑定到 < 1024 的端口):

socat -u tcp-listen:25,reuseaddr 'system:
  echo "Got a connection from ${SOCAT_PEERADDR}:${SOCAT_PEERPORT}"'

anyone@[a.b.c.d]然后,当尝试从某个电子邮件提供商发送电子邮件时,a.b.c.d作为可以访问您的服务器的公共 IP 地址,应该会导致它输出如下内容:

Got connection from 1.2.3.4:59604

确认端口未被阻塞。

答案4

非回答:只是不要这样做。对于传入的电子邮件,为动态 IP 地址设置 MX 记录是可能的,但有点棘手。但对于外发电子邮件,请不要在住宅/动态 IP 地址上执行此操作。即使您的 ISP 没有阻止端口 25,大多数理智的邮件服务器也应该拒绝接受来自您的 IP 地址的邮件。

租用具有静态 IP 地址的小型虚拟专用服务器并不昂贵,并且您成功传输邮件的机会很大。对于 Gmail 等某些服务,您可能仍然不走运,因为这些服务往往使用反垃圾邮件机制,有利于更大的操作,并且在阻止您的邮件时没有有效的缓解途径。

相关内容