是否可以在不发出出站 Web 请求的情况下查看我的外部 IP 地址?

Axe*_*ger 21 networking ip-address nat

如果您的连接经过 NAT,是否可以在不发出出站 Web 请求的情况下查看您的外部 IP 地址?

任何操作系统(Windows、Linux 等)都可以。

har*_*ymc 24

如果您的计算机在 NAT 之后,您可能会看到路由器的外部 IP 地址,但您需要对路由器进行管理访问。

路由器知道您的外部 IP 地址,因此通过访问其配置页面您可以找到该 IP 地址。这种方式不需要任何专门的工具,除了 Web 浏览器。

其他需要使用工具获取信息的协议:

经用户@dirkt 测试,所有方法仅适用于 IPv4(PCP 可能除外)。

  • “任何其他方式都需要发出外部 Web 请求” Web(即 HTTP)不是必需的,但可能最容易掌握 (2认同)

Spi*_*iff 12

有几种方法可以与某些 NAT 配合使用,但没有任何方法可以保证在任何地方都有效。

我相信 uPnP、NAT-PMP 和 PCP(通用即插即用、NAT 端口映射协议和端口控制协议)都有办法向兼容的 NAT 网关询问公共地址是什么,但并非所有 NAT 都支持这些协议。与企业或运营商级 NAT 解决方案相比,家庭网关路由器的支持更为普遍。

当您发现自己位于 NAT 后面时,查看它将您的流量转换为哪个公共 IP 地址的唯一可靠方法是将一些传出流量发送到某个公共主机,该主机将以 NAT 不会转换的方式返回报告,地址您的流量似乎来自。使用基于 Web 的服务是一种方法,但您也可以通过 SSH 连接到云服务器实例并查看sshd您的 SSH 会话来自何处。

  • 如果系统在双重(或更多)NAT 之后,UPnP 等也可能给出错误的结果。 (8认同)

use*_*686 8

您可以使用 DNS 请求,我认为它不属于“网络请求”类别:

nslookup myip.opendns.com resolver1.opendns.com
Run Code Online (Sandbox Code Playgroud)


VL-*_*-80 7

我想对已有的答案补充一点。

它还取决于网络的复杂性。您的计算机可能位于具有多个外部 IP 地址的网络中,并且线路上某处的路由器根据某些条件将流量发送到 Internet:例如,目标 IP 地址或一天中的时间(可能一个上行信道在夜间或其他原因更便宜)。

因此,为了完整起见,“外部 IP 地址”的概念可能需要定义您的地址在外部的目标点。

在下面的示例中,Router #2可以执行 NAT 并将流量发送到任一上行链路,并且接收主机可以看到Host.

或者可能是某个目的地(例如host1.example.com)始终通过 路由Uplink A,而主机host2.example.com始终通过 路由Uplink B。因此,通过这些主机所看到的外部IP地址会有所不同,提供Uplink AUplink B不同的互联网服务供应商。

   Uplink A                                  Uplink B
-------------                             -------------
      |                                         |
      |                                         |
      |     192.168.1.1         192.168.50.50   |
      |               -----------               |
      |---------------|Router #2|---------------|
                      -----------
                           |  192.168.100.1
                           |
                           |  192.168.100.2
                      -----------
                      |Router #1|
                      -----------
                           |  192.168.200.1
                           |
                           |  192.168.200.2
                      -----------
                      |   Host  |
                      -----------
Run Code Online (Sandbox Code Playgroud)

因此,发送流量将允许获得更可靠的结果。


kas*_*erd 5

您可以使用 DNS 而不是 HTTP。例如您可以使用:

dig +short TXT o-o.myaddr.l.google.com
Run Code Online (Sandbox Code Playgroud)

这将显示您正在使用的 DNS 服务器的单播地址,如果它支持 EDNS,它还将显示您的 IP 地址,尽管可能会被截断。

要获取完整的 IP 地址,您可以绕过本地 DNS 服务器并将上述请求直接发送到 ns{1,2,3,4}.google.com

dig +short TXT o-o.myaddr.l.google.com @ns3.google.com
Run Code Online (Sandbox Code Playgroud)

如果您想查看特定协议版本中的 IP 地址,您可以使用-6-4

dig -6 +short TXT o-o.myaddr.l.google.com @ns3.google.com
dig -4 +short TXT o-o.myaddr.l.google.com @ns3.google.com
Run Code Online (Sandbox Code Playgroud)

如果您愿意,也可以使用 OpenDNS。OpenDNS 不使用 TXT 记录,而是使用 A 和 AAAA 记录,因此您必须指定要查找的协议版本:

dig -6 +short AAAA myip.opendns.com @resolver2.opendns.com
dig -4 +short A myip.opendns.com @resolver2.opendns.com
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的流量经过协议转换,您可能会得到不同的结果或根本没有结果。在 NAT64 后面的机器上进行测试,我能够使用上述命令看到我的 IPv6 地址,但看不到 NAT64 的 IPv4 地址。

这个答案基于这些来源1 2 3和我自己的一些研究。