当前位置: 首页 > 科技观察

如何在命令行快速获取公网动态IP地址

时间:2023-03-14 23:43:53 科技观察

如何确定公网IP地址是很多家庭宽带朋友经常遇到的问题。毕竟,固定IP地址总是很昂贵,因此不适合家庭宽带。而我们的电信宽带运营商(ISP)经常为我们分配一个动态IP地址。之所以称为动态IP地址,是因为每次拨号获得的IP地址可能不同。运营商每天定时或不定期刷新IP地址池,强制释放已经获得的IP地址,分配新的IP地址。这对我们一些运行在家庭带宽上的服务有影响——需要重新设置服务器的IP地址,比如监控、网络存储等。这时候DDNS就会发挥作用,现在大部分路由器都内置了-在DDNS客户端,比如花生壳等服务客户端,但是这些客户端存在收费、不稳定、刷新间隔小等问题。有自己域名的朋友可以使用DNS服务商的API自行实现IP更新操作,比如阿里云(Aliyun),Cloudflare就可以实现。如何使用DDNS的API更新不在本文的讨论范围内,但是调用API有一个关键的参数,就是公网IP地址。如何获取当前运营商分配的公网IP地址?除了询问路由器(打开路由器管理界面可以找到WAN口信息)之外,我们还可以通过一些网络服务来检测。1、使用Shell命令获取公网IP地址的浏览器方法如果我们用浏览器打开这个地址checkip.amazonaws.com,你会发现你的公网IP地址可观,网上的服务器总能知道是什么它是IP地址的客户端发起连接。当然也可以通过这种方式获取公网IP。有许多具有相同功能的网站。以下是我收集的一些:https://checkip.amazonaws.comhttps://api.ipify.orghttps://ifconfig.me/iphttps://icanhazip.comhttps://ipinfo.io/iphttps://ipecho.net/plainhttps://checkipv4.dedyn.iocURL方式当然我们不能在命令行中启动浏览器这种小事,我们可以请教另一个强大的工具,那就是curl,cURL是一个文件使用URL语法在命令行下工作的传输工具,cURL的快速使用可以参考阮一峰的网络日志《curl 的用法指南》,这里就不多说了,最简单的用法就是curl你想要的URL请求,例如curlcheckip.amazonaws.com。使用dig命令是第一次在别人的脚本中看到这种获取公网IP的方法。未安装dig命令。对于Debian系列系统,可以通过apt-getinstalldnsutils安装。该命令的原理是指定resolver1.opendns.com为域名myip.opendns.com的解析服务器。你为什么要指定它?主要是为了避开DNS下游服务器另外OpenDNS专门配置了指定的解析服务器,始终将域名myip.opendns.com解析为发起DNS请求的客户端IP地址,从而实现功能查找公网IP。这比cURL方法有什么优势?当然,数据量更小,传输速度更快。毕竟使用cURL发起HTTP请求,必然会导致协议头等无关信息的交换。如果启用了HTTPS/TLS,则会进行加密协商,效率较低。当然,这种方式也有缺点,就是DNS查询容易被运营商审计和过滤,稳定性稍差,但我测试除了偶尔查询失败外,其他完全OK。2.使用Shell脚本获取公网IP至此我有了一个新的思路,就是先使用dig命令快速获取公网IP,如果失败则切换到cURL,以避免cURL单机失败,使用轮询或者随机的方式,尽可能的提高成功率。使用BashShell脚本做它,比如获取公网IPv4的脚本如下:#!/bin/bash#ThisscripttrytoensuregetsthecurrentIPaddress(asassignedbytheISP)from#OpenDNSandotheronlineservicesasfallbackshosts=(“checkip.amazonaws.com”“api.ipify.org”“ifconfig.me/ip”“icanhazip.com”“ipinfo.io/ip”“ipecho.net/plain”“checkipv4.dedyn.io”)CURL=`whichcurl`DIG=`whichdig`check=$($DIG+shortmyip.opendns.com@resolver1.opendns.comA)if[!$?-eq0]||[-z“$检查”]||[[!$check=~^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$]];然后回显“无法通过OpenDNS服务获取您的公共IP地址,请尝试其他方式。”count=${#hosts[@]}while[-z"$check"]&&[[$count-ne0]];做selectedhost=${hosts[$RANDOM%${#hosts[@]}]}check=$($CURL-4shttps://$selectedhost|grep'[^[:blank:]]')&&{如果[-n"$check"]&&[[$check=~^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$]];然后打破其他check=""count=$(expr$count-1)echo"主机$selectedhost返回了一个无效的IP地址。"}||{check=""count=$(expr$count-1)echo"主机$selectedhost没有响应。"}doneif[-z"$check"];然后回显“无法获取您的公共IP地址。请检查您的互联网连接。”exit1fiecho"YourpublicIPaddressis$check"exit0上面的脚本可以看到,首先我通过dig查询OpenDNS。如果查询失败或者返回为空或者不是IP地址,则进入cURL模式,将可用的服务器添加到hosts列表中,cURL随机选择一台。这里使用curl-4s参数-4s表示只使用IPv4连接(确保获取到IPv4地址),并抑制进度条和错误信息。如果提取的服务出现错误,则进入循环再提取一个,直到循环满,最大数量的主机停止。3.总结有些脚本甚至一些程序只使用一种方法获取公网IP,但是这些在互联网上的服务往往是不可靠的。如果你选择的服务出现故障,将会影响你后续的业务开展,所以本文的核心思想仍然是多备份。另外随机使用cURL的方式来保证所谓的“负载均衡”,避免回退时对某个服务的请求过多,导致IP被封禁。