Detect the Current Public IP

宽带运营商,有的会提供动态公网IP(Dynamic Public IP Address)。用户可以通过DDNS(Dynamic DNS)绑定域名后,就能远程访问自家网络了。这个方案有个最重要的前提,就是要知道当前的公网IP,然后才可以进行DDNS绑定。

以下总结几个检测并获取当前公网IP的方法。另外,为了方便使用,所获取的公网IP地址,都是文本。

1. 请求第三方网站

网站服务基于TCP/IP协议,能获取客户端的公网IP。只要在当前网络请求第三方网站,并且该网站返回客户端的公网IP,就是当前网络的公网IP了。这个方案最常用。

整理了一些网站,能返回当前网络的公网IP,而且返回的IP地址都是文本格式:

2. 自建网站

既然第三方网站能返回当前网络的公网IP,那么可以自己建一个这样网站或者接口。前提是,需要网站服务器,或者小小的VPS。

相关功能,只需要配置Nginx即可:

server {
  ...
  # 请求path为"/ip"的网址,则返回当前网络的公网IP
  location /ip {
    default_type text/plain;
    return 200 $remote_addr;
  }
}

3. Cloudflare pages

如果没有网站服务器(或者VPS),可以利用Cloudflare pages实现相关功能。

首先需要开通Cloudflare的pages功能,然后进入“Workers & Pages” -> “Create”按钮 -> 选“Workers” -> “Start from a template”点“Hello World” -> “worker.js”的代码改为如下 -> 点“Deploy”执行部署。

export default {
  async fetch(request) {
    return new Response(request.headers.get('CF-Connecting-IP'), {
      status: 200,
      headers: {"Content-Type": "text/plain;charset=UTF-8"},
    })
  }
};

4. 从路由器检测

一般家用路由器,能用于网络拨号,那就能检测宽带运营商所分配的动态公网IP。这个方法虽然效率最高,但不同路由器的获取方法不同,甚至不能获取。

这里记录一下K2P刷了官改ROM后,通过telnet执行命令,检测当前公网IP。其中192.168.0.1是路由器IP地址。

(sleep 1; echo "ip addr show dev pppoe-wan"; sleep 1; ) | telnet 192.168.0.1 2>/dev/null | grep -oP '(?<=inet\ )[0-9\.]+'
使用 Hugo 构建
主题 StackJimmy 设计