通告 欢迎访问爱刷机(原爱搜网、爱搜啊博客aisoa.cn)

Shell脚本获取公网动态IP地址光猫开启桥接模式IPV6 DDNS阿里云脚本

2022-02-26
0评论
/
阅读
爱搜啊

如何确定公网IP地址是一个让很多家用宽带朋友们经常遇到的问题,毕竟固定IP地址总是价格不菲因而不适用于家庭宽带,而我们的电信宽带运营商(ISP)往往给我们分配的是动态IP地址,之所以称作为动态IP地址,是因为每次拨号得到的IP地址可能会不一样,还有更骚的操作就是有的运营商每天或不定期在某个时间刷新IP地址池,这样已经获得的IP地址将会被强制释放并分配新的IP地址,这对于我们一些运行在家用带宽下的服务带来了影响——需要重新设置服务端IP地址,比如监控、网络存储等等,这时候DDNS就发挥作用的,现在大部分路由器内置了DDNS客户端,比如花生壳等服务客户端,但是这些客户端存在收费、不稳定以及刷新间隔小等问题,对于自己有域名的朋友可以使用DNS服务商的API自己实现IP更新操作,比如阿里云API实现动态域名解析ddns脚本基于CloudFlare API的纯Shell动态DNS(DDNS)脚本均可以实现。

OPENWRT固件路由器上实现内网设备的IPV6 ddns(支持阿里云),使用IPV6需要开启光猫桥接模式,然后使用路由器拨号上网光猫开启Bridge桥接模式lede/openwrt固件中配置IPv6上网

Shell脚本获取公网动态IP地址

1 、使用Shell命令获取公网IP地址

使用Shell脚本获取公网IP地址

至此我有个新的主意,那就是首先采用dig命令快速检索公网IP地址,如果失败则切换到cURL的方式,为了避免cURL单一服务器失败,采用轮询或者随机的方式,尽可能提高成功率。

使用Bash Shell脚本do it,比如获取公网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 +short myip.opendns.com @resolver1.opendns.com 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方式查询OpenDNS,如果查询失败或者返回为空或者不是IP地址,那么进入cURL模式,这里将可用服务器添加到hosts列表,并且随机抽取一个进行cURL,这里使用了curl -4s参数-4s分别表示仅使用IPv4方式连接(确保获取IPv4地址)和抑制进度条和错误信息,如果抽取的服务发生错误,那么进入循环再抽取一个,直到循环满最大hosts数停止。

3 总结

大部分脚本甚至一些程序仅使用了一种方式获取公网IP,但是互联网上这些服务往往是不可靠的,如果你所选用的服务出现故障,那么将会影响到你后续业务的开展,所以本文的核心思想还是多个备份,另外对于cURL方式采用随机确保所谓的“负载平衡”,避免fallback时过度请求某个服务导致IP被Ban。


本站附件分享,如果附件失效,可以去找找看

诚通网盘附件百度网盘附件


饿了么红包

饿了么红包

于2022-02-26发布