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

gat*_*ack 12 email

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

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

Gor*_*son 42

您需要测试两件事:它们是否阻止\xc2\ xa0port \xc2\xa025(对应于发送消息的服务器)上的传出连接,以及它们是否阻止\xc2\xa0port\xc2\xa025(您的服务器接收消息)。

\n

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

\n
$ host -t mx google.com\ngoogle.com mail is handled by 10 smtp.google.com.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ { sleep 2; echo "quit"; } | nc -w5 smtp.google.com. 25 && echo "connection succeeded" || echo "connection failed"\n220 mx.google.com ESMTP p5-20020a170902eac500b001d7077d91b1si1426011pld.170 - gsmtp\n221 2.0.0 closing connection p5-20020a170902eac500b001d7077d91b1si1426011pld.170 - gsmtp\nconnection succeeded\n$ \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

还有一些其他更模糊的可能性。正如 gidds在评论中指出的那样,如果您收到“220\xc2\xa0...”和“连接成功”消息,但“220\xc2\xa0...”消息表示服务器属于您的 ISP 而不是如果您尝试测试的公司是您的,那么您的 ISP 可能会拦截传出连接(而不是完全阻止它们),并且您必须调查他们的策略以找出影响。这可能有点含糊,因为服务器名称并不总是与您期望的相符(例如,我称为“smtp.google.com”的服务器回答为“mx.google.com”),因此测试与多个不同的目标服务器可能会有所帮助 - 如果它们以相同的方式回答,那就是一个很好的迹象表明您正在被拦截。

\n

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

\n

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

\n

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

\n

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

\n

如果连接没有通过,yougetsignal 页面会显示类似“ [您的 IP 此处]上的端口 25 已关闭”之类的内容,并且sudo nc仍会等待连接\n(您可以使用Ctrl+C来终止它)。 \xc2\xa0\n这意味着 ISP 阻止访问,\或者您所做的设置中的某些内容不正确。

\n

  • 一个相关的可能性是 ISP 可能会将传出端口 25 连接重定向到其自己的邮件服务器,而不是简单地阻止或传递它们。但我认为这应该很容易发现:“nc”命令将显示 ISP 的欢迎消息,而不是 Google 或其他任何消息。 (6认同)

Jim*_* L. 8

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

# tcpdump -i public tcp port 25
Run Code Online (Sandbox Code Playgroud)

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

$ telnet myhost.example.com 25
Run Code Online (Sandbox Code Playgroud)

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


don*_*l24 1

一种选择是设置一个非常基本的 Web 服务器,侦听端口 25,然后使用任何可用的 Web 服务来查看是否可以访问您的系统。不是推荐,但我使用了https://www.montastic.com/并扫描了http://mail.example.com:25以查看该端口是否可通过互联网使用。