之前的文章里面讲了一些在悟空派上的一些使用,但是无疑这些操作只能做到局域网进行访问,但是在日常生活中,超出局域网的限制,我们依旧想访问悟空派的服务就需要想一些办法了。
办法一共有三种,分别是:内网穿透,公网IPv4,以及现在广为普及的IPv6。
先说内网穿透,其实这个方案相对来讲适用性更广,直接花钱购买就可以了,但是带宽稍大花销也就越大,所以并不推荐。
接下来就是我着重要讲的IPv4和IPv6的方法,先说IPv4,需要和带宽的运营商进行沟通,看看是否可以给IPv4的公网IP地址,一般来讲联通是没问题,移动没有,电信不知道,第二种方案是采用IPv6地址,IPv6目前已经普及了,所以使用起来还是很方便的,但是也不排除刚好使用的设备没有IPv6地址,这个没有办法保证。对于IPv4来讲,可以使用一些老牌的DDNS服务商,然后直接使用CURL的方式即可更新DDNS,但是一般是只支持IPv4的地址,不可以更新IPv6的地址,而且有时候更新会出现一些问题,所以我更加推荐在阿里云上购买一个域名,开销非常小,TECH域名我买的时候一年才19,然后通过脚本去更新DDNS,官方已经给出SDK,我在往上找了大佬开源的脚本,并进行了升级,我忘了大佬的源地址了,我先把我的也开源出来。
#!/bin/bash
echo "######Aliyun DDNS Start `date '+%Y-%m-%d %H:%M:%S'`######" >> /opt/ddns/aliyun.log
ali_id=""
ali_key=""
ali_name1=''
ali_domain=''
ali_ttl="600"
dns_server="120.76.107.43"
if [ "$ali_name1" = "@" ]
then
ali_name=$ali_domain
else
ali_name=$ali_name1.$ali_domain
fi
now=`date`
ipv4=`curl -s 4.ipw.cn`
current_ipv4=`nslookup -q=A $ali_name $dns_server | grep 'Address: ' | tail -n1 | awk '{print $NF}'`
timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`
urlencode() {
out=""
while read -n1 c
do
case $c in
[a-zA-Z0-9._-]) out="$out$c" ;;
*) out="$out`printf '%%%02X' "'$c"`" ;;
esac
done
echo -n $out
}
enc() {
echo -n "$1" | urlencode
}
send_request() {
local args="AccessKeyId=$ali_id&Action=$1&Format=json&$2&Version=2015-01-09"
local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$ali_key&" -binary | openssl base64)
curl -s "https://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
}
get_recordid() {
grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
}
query_recordid() {
send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$ali_name&Timestamp=$timestamp&Type=A"
}
update_record() {
send_request "UpdateDomainRecord" "RR=$ali_name1&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$ali_ttl&Timestamp=$timestamp&Type=A&Value=$(enc $ipv4)"
}
add_record() {
send_request "AddDomainRecord&DomainName=$ali_domain" "RR=$ali_name1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$ali_ttl&Timestamp=$timestamp&Type=A&Value=$(enc $ipv4)"
}
###############################################
echo "当前记录: $current_ipv4 >>> $ali_name" >> /opt/ddns/aliyun.log
if [[ $ipv4 != "" ]]; then
if [[ $ipv4 != $current_ipv4 ]]; then
if [[ "$current_ipv4" = "" ]] ;then
ali_record_id=`add_record | get_recordid`
echo "添加新记录: ${ipv4} >>> $ali_name" >> /opt/ddns/aliyun.log
else
ali_record_id=`query_recordid|get_recordid`
update_record $ali_record_id >/dev/null
echo "更新记录: ${ipv4} >>> $ali_name " >> /opt/ddns/aliyun.log
fi
else
echo "无需更新: $current_ipv4 >>> $ali_name" >> /opt/ddns/aliyun.log
fi
else
echo "未取得IPV4" >> /opt/ddns/aliyun.log
fi
echo "
我的这个是IPv4的更新脚本,IPv6和IPv4基本一样,主要修改几个地方,一个是curl -s 6.ipw.cn,另外一个就是nslookup -q=AAAA,最后还有几个Type=AAAA,如果可以看明白就可以自己动手修改,下次有空我把IPv4和IPv6的结合版也PO出来。
最后,我们还要把他放在定时任务里,进行自动检测,我一般设计的是每小时更新一次,就不必再管了。
首先,我们要输入sudo crontab -e 来编辑定时任务,使用的时候一般让选择编辑器,第一种nano和第二种vim都可以,看自己平常使用什么就用什么就可以。
在这个地方设置的时候要注意一些,其中M代表分,H代表小时,后面的分别代表啥,上面其实都有解释,很简单的英文,分别是天、月以及周几,其实并不怎么用到,然后如果不考虑的话,就要写*号,就像我设置的就是每个点的40分执行一次,也就是每小时执行一次,例如10:40,11:40,依次类推,如果你写的是10 * 1 * * ,就是每个月1号的每小时10分执行一次,例如1月1号的1:10,1月1号的2:10,2月1号的1:10,以此类推。
设置好以后,我们使用sudo crontab -l 查询一下,确定没问题后,然后重启cron。
接下来我们要做的就是等待,等到过任意一个小时的40分后,就可以查看一下更新记录啦。
我们尝试ping一下,看看是否可以ping通。
然后就没问题啦。
output
|