<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何在命令行快速獲取公網(wǎng)動(dòng)態(tài) IP 地址

          共 3555字,需瀏覽 8分鐘

           ·

          2022-03-11 05:09

          來(lái)源:https://tinyurl.com/2p95wpue

          如何確定公網(wǎng)IP地址是一個(gè)讓很多家用寬帶朋友們經(jīng)常遇到的問(wèn)題,畢竟固定IP地址總是價(jià)格不菲因而不適用于家庭寬帶,而我們的電信寬帶運(yùn)營(yíng)商(ISP)往往給我們分配的是動(dòng)態(tài)IP地址,之所以稱(chēng)作為動(dòng)態(tài)IP地址,是因?yàn)槊看螕芴?hào)得到的IP地址可能會(huì)不一樣,還有更騷的操作就是有的運(yùn)營(yíng)商每天或不定期在某個(gè)時(shí)間刷新IP地址池,這樣已經(jīng)獲得的IP地址將會(huì)被強(qiáng)制釋放并分配新的IP地址。


          這對(duì)于我們一些運(yùn)行在家用帶寬下的服務(wù)帶來(lái)了影響——需要重新設(shè)置服務(wù)端 IP 地址,比如監(jiān)控、網(wǎng)絡(luò)存儲(chǔ)等等,這時(shí)候 DDNS 就發(fā)揮作用的,現(xiàn)在大部分路由器內(nèi)置了 DDNS 客戶(hù)端,比如花生殼等服務(wù)客戶(hù)端,但是這些客戶(hù)端存在收費(fèi)、不穩(wěn)定以及刷新間隔小等問(wèn)題,對(duì)于自己有域名的朋友可以使用 DNS 服務(wù)商的 API 自己實(shí)現(xiàn) IP 更新操作,比如阿里云(Aliyun)、Cloudflare 均可以實(shí)現(xiàn)。

          對(duì)于 DDNS 如何使用 API 更新不在本文敘述范圍內(nèi),但調(diào)用 API 有個(gè)關(guān)鍵參數(shù)那就是公網(wǎng)IP地址,如何獲取當(dāng)前運(yùn)營(yíng)商分配的公網(wǎng) IP地址呢?除了問(wèn)路由器外(打開(kāi)路由器管理界面找到 WAN 口信息)我們還可以通過(guò)一些網(wǎng)絡(luò)服務(wù)進(jìn)行檢測(cè)。

          1使用 Shell 命令獲取公網(wǎng) IP 地址

          瀏覽器方式

          如果我們使用瀏覽器打開(kāi)這個(gè)地址checkip.amazonaws.com你就會(huì)發(fā)現(xiàn)你的公網(wǎng)IP地址赫然在目,互聯(lián)網(wǎng)上的服務(wù)器總是能夠知道是什么 IP地址的客戶(hù)端發(fā)起了連接,當(dāng)然就可以通過(guò)這種方式獲取公網(wǎng) IP,同樣功能的網(wǎng)站有很多,這里列舉部分我收集到的:

          https://checkip.amazonaws.com
          https://api.ipify.org
          https://ifconfig.me/ip
          https://icanhazip.com
          https://ipinfo.io/ip
          https://ipecho.net/plain
          https://checkipv4.dedyn.io

          cURL 方式

          在命令行下我們當(dāng)然不能為這點(diǎn)小事隨便啟動(dòng)瀏覽器,我們可以請(qǐng)出另外一個(gè)功能強(qiáng)大的工具,那就是curl,cURL 是一個(gè)利用URL語(yǔ)法在命令行下工作的文件傳輸工具,關(guān)于cURL的快速用法可以參考阮一峰的網(wǎng)絡(luò)日志《curl 的用法指南》,這里不再詳述,最簡(jiǎn)單的用法就是curl 你要請(qǐng)求的網(wǎng)址,比如curl checkip.amazonaws.com。

          使用 dig 命令

          首次在別人腳本中看到這個(gè)方式獲取公網(wǎng)IP覺(jué)得比較新奇,命令如下:

          [email protected]

          這個(gè)是由OpenDNS提供的服務(wù),如果你的主機(jī)上沒(méi)有安裝dig命令,對(duì)于Debian系列系統(tǒng)可以通過(guò)apt-get install dnsutils安裝,這個(gè)命令的原理是指定resolver1.opendns.com為域名myip.opendns.com的解析服務(wù)器,為什么要指定,主要是避免 DNS 下游服務(wù)器緩存,另外這個(gè)指定的解析服務(wù)器被 OpenDNS 進(jìn)行了特殊配置,其始終將域名myip.opendns.com解析為發(fā)起 DNS 請(qǐng)求的客戶(hù)端 IP 地址,這樣也就實(shí)現(xiàn)了查找公網(wǎng) IP的功能。

          這個(gè)和 cURL 方式比有什么優(yōu)勢(shì)呢?當(dāng)然是數(shù)據(jù)量更小傳輸更快,畢竟使用 cURL 發(fā)起 HTTP 請(qǐng)求必然會(huì)導(dǎo)致協(xié)議頭等無(wú)關(guān)信息的交換,如果啟用了 HTTPS/TLS 那么還要進(jìn)行加密協(xié)商,效率會(huì)比較低,當(dāng)然這種方式的缺點(diǎn)就是 DNS 查詢(xún)?nèi)菀妆贿\(yùn)營(yíng)商審計(jì)和過(guò)濾,穩(wěn)定性略差,不過(guò)我測(cè)試下來(lái)除了偶爾查詢(xún)失敗外其余情況是完全 OK 的。

          2使用 Shell 腳本獲取公網(wǎng) IP 地址

          至此我有個(gè)新的主意,那就是首先采用 dig 命令快速檢索公網(wǎng) IP 地址,如果失敗則切換到 cURL 的方式,為了避免 cURL 單一服務(wù)器失敗,采用輪詢(xún)或者隨機(jī)的方式,盡可能提高成功率。

          使用 Bash Shell 腳本 do it,比如獲取公網(wǎng) IPv4 的腳本如下:

          #!/bin/bash

          #?This?script?try?to?ensure?gets?the?current?IP?address?(as?assigned?by?the?ISP)?from
          #?OpenDNS?and?other?online?services?as?fallbacks

          hosts=("checkip.amazonaws.com"?"api.ipify.org"?"ifconfig.me/ip"?"icanhazip.com"?"ipinfo.io/ip"?"ipecho.net/plain"?"checkipv4.dedyn.io")

          CURL=`which?curl`
          DIG=`which?dig`

          check=$($DIG[email protected]?A)?

          if?[?!?$??-eq?0?]?||?[?-z?"$check"?]?||?[[?!?$check?=~?^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$?]];?then
          ????echo?"Unable?to?get?your?public?IP?address?by?OpenDNS?service,?try?to?another?way."
          ????count=${#hosts[@]}

          ????while?[?-z?"$check"?]?&&?[[?$count?-ne?0?]];?do
          ????????selectedhost=${hosts[?$RANDOM?%?${#hosts[@]}?]}
          ????????check=$($CURL?-4s?https://$selectedhost?|?grep?'[^[:blank:]]')?&&?{
          ????????????if?[?-n?"$check"?]?&&?[[?$check?=~?^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$?]];?then
          ????????????????break
          ????????????else
          ????????????????check=""
          ????????????????count=$(expr?$count?-?1)
          ????????????????echo?"The?host?$selectedhost?returned?an?invalid?IP?address."
          ????????????fi
          ????????}?||?{
          ????????????check=""
          ????????????count=$(expr?$count?-?1)
          ????????????echo?"The?host?$selectedhost?did?not?respond."
          ????????}
          ????done
          fi

          if?[?-z?"$check"?];?then
          ????echo?"Unable?to?get?your?public?IP?address.?Please?check?your?internet?connection."
          ????exit?1
          fi

          echo?"Your?public?IP?address?is?$check"

          exit?0

          上述腳本可以看出首先我使用 dig 方式查詢(xún) OpenDNS,如果查詢(xún)失敗或者返回為空或者不是 IP 地址,那么進(jìn)入cURL模式,這里將可用服務(wù)器添加到 hosts 列表,并且隨機(jī)抽取一個(gè)進(jìn)行cURL,這里使用了curl -4s參數(shù)-4s分別表示僅使用 IPv4 方式連接(確保獲取 IPv4 地址)和抑制進(jìn)度條和錯(cuò)誤信息,如果抽取的服務(wù)發(fā)生錯(cuò)誤,那么進(jìn)入循環(huán)再抽取一個(gè),直到循環(huán)滿(mǎn)最大 hosts 數(shù)停止。

          3總結(jié)

          大部分腳本甚至一些程序僅使用了一種方式獲取公網(wǎng) IP,但是互聯(lián)網(wǎng)上這些服務(wù)往往是不可靠的,如果你所選用的服務(wù)出現(xiàn)故障,那么將會(huì)影響到你后續(xù)業(yè)務(wù)的開(kāi)展,所以本文的核心思想還是多個(gè)備份,另外對(duì)于 cURL 方式采用隨機(jī)確保所謂的“負(fù)載平衡”,避免 fallback 時(shí)過(guò)度請(qǐng)求某個(gè)服務(wù)導(dǎo)致 IP 被 Ban。


          Linux學(xué)習(xí)指南

          有收獲,點(diǎn)個(gè)在看?

          瀏覽 27
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人妻人人澡欧美91精品 | 色秘 乱码一区二区三区唱戏 | 操碰在线| 九九九色视频 | 成人福利视频在线 |