阿里云设置DDNS(动态域名解析)(阿里巴巴拟在新加坡建设全球总部)
阿里云設置DDNS(動態域名解析)
搭建內網服務器時,因為運營商分配的公網ip地址是動態的。在一段時間后或者重啟路光貓后,會導致公網ip變化,此時阿里云設置DNS將失效。因此需要進行動態域名解析。
阿里云沒有像花生殼一樣的內置到路由器的動態域名解析服務。所以,我們沒辦法在路由器段進行動態域名解析設置。但是,阿里云提供了DNS的API,各個語言的API都有,因此我們可以在服務器端來實現這個動態域名解析服務。
下面講一下我實現的整個過程,我是通過go語言完成的。如下。
1. 設置DNS域名解析服務
進入阿里云的DNS服務頁面,設置域名解析。這個頁面,相當于是手動操作,來實現域名解析設置。這里我們根據阿里云的教程來添加解析記錄。這里我設置不是真實的服務器外網IP,真實的是211,這里我設置的212,以便后面測試DDNS是否生效。
2. 下載SDK
然后我們打開阿里云的幫助文檔,找到API文檔。文檔里面有詳細的說明和SDK下載鏈接,找到對應的go鏈接下載,并安裝到系統。因為里面沒有go語言的SDK,不過還是讓我找到了,他的教程估計是很久沒有更新了。
go語言SDK,在下面的界面可以找到。
我是通過proxychains go get github.com/aliyun/alibaba-cloud-sdk-go進行安裝的。
因為我們已經添加過解析記錄了,所以這里要完成的代碼僅僅是修改解析記錄。如果是沒有添加解析記錄,也可以通過go語言的API來完成解析記錄的添加。我最開始是測試的添加解析記錄API,直接復制代碼,然后運行就行了。
這里需要accessKeyId和accesssKeySecret。這個可以通過點擊右上角的頭像進行獲取。
然后recordID通過這個鏈接進行獲取。這個教程比較老了,現在阿里云將這個參數進行更新了,不過方法還是一樣的,在updateRrValue.json這個http請求的某個參數里面能找到RecordID。
找到修改解析記錄的教程。這里點擊調試按鈕,右邊的API調用窗口就能出來,可以進行生成代碼和調試。
生成的代碼復制到我們的工程,然后在代碼里面填入accessKeyId和accesssKeySecret,編譯運行,只要沒有報錯,僅僅是一行返回。并在設置域名解析能看到我們的新增的解析記錄,說明整個環境搭建成功了。
3. 設置DDNS
有了上面的這段代碼,實現DDNS就很簡單了。只需要拿到我們服務器端的公網IP,對阿里云的DNS解析解析記錄進行修改就可以了。最后,寫成一個服務,定時獲取wanip,如果變化了,就對我們DNS解析記錄進行修改即可。
這里貼出我的代碼。代碼里面沒有域名參數項,我猜測是通過RecordID來和我們的解析記錄進行對應的,這樣隊能對應到我們解析記錄的域名了。
ppackage main
import (
"bytes"
"fmt"
"os/exec"
"strings"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/services/alidns"
log "github.com/sirupsen/logrus"
)
/* 在這里添加自己的訪問秘鑰 */
var accessKeyId string = ""
var accessSecret string = ""
var recordId string = ""
func main() {
go SetDDNSService()
for {
time.Sleep(time.Duration(60) * time.Second)
}
}
func SetDDNSService() {
var WanIP string
var RecordIP string = GetAliRecordIP() // 服務器啟動時,從阿里云獲取一次
for {
WanIP = GetWanIPStr()
log.Info("Get WAN IP: ", WanIP)
if WanIP != "" && WanIP != RecordIP {
log.Info("Wan IP changed. Will change the record IP.")
err := SetDDNS(WanIP)
if err == nil {
RecordIP = WanIP
}
} else {
//log.Info("Wan IP hold.")
}
time.Sleep(time.Duration(60) * time.Second)
}
}
func SetDDNS(wanIP string) (err error) {
client, err := alidns.NewClientWithAccessKey("cn-hangzhou", accessKeyId, accessSecret)
request := alidns.CreateUpdateDomainRecordRequest()
request.Scheme = "https"
request.RecordId = recordId
request.RR = "@"
request.Type = "A"
request.Value = wanIP //GetWanIPStr() //"118.123.37.212"
request.Lang = "en"
request.UserClientIp = wanIP // "118.123.37.211"
request.TTL = "600"
request.Priority = "1"
request.Line = "default"
response, err := client.UpdateDomainRecord(request)
if err != nil {
fmt.Print(err.Error(), response)
return err
}
fmt.Printf("response is %#v\n", response)
return nil
}
func GetAliRecordIP() (recordIP string) {
client, err := alidns.NewClientWithAccessKey("cn-hangzhou", accessKeyId, accessSecret)
request := alidns.CreateDescribeDomainRecordInfoRequest()
request.Scheme = "https"
request.RecordId = recordId
request.Lang = "en"
request.UserClientIp = "118.123.37.211"
response, err := client.DescribeDomainRecordInfo(request)
if err != nil {
fmt.Print(err.Error())
return ""
}
log.Info("Record IP: ", response.Value)
return response.Value
}
func GetWanIPStr() (wanip string) {
cmd := exec.Command("wsl", "curl", "ident.me")
cmd.Stdin = strings.NewReader("some input")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Error("error: ", err)
return ""
}
//fmt.Printf("in all caps: %q\n", out.String())
wanip = out.String()
if wanip != "" {
//log.Info("Get WAN IP ok: ", wanip)
} else {
log.Warn("Get WAN IP failed")
}
return wanip
}
運行結果:
上面圈出來的一行,即是官方生成的這段代碼運行成功后的反饋。只要沒有報錯,并且有這行代碼,設置域名解析上能查看到我們解析記錄已經修改成功了,118.123.37.212變成了118.123.37.211說明我們的工作完成了。
騰訊服務器域名解析
將上面的程序跑在騰訊云服務器上,即可將阿里云的域名解析為騰訊云服務器對應的IP地址。
總結
以上是生活随笔為你收集整理的阿里云设置DDNS(动态域名解析)(阿里巴巴拟在新加坡建设全球总部)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java在容器中导入图片_Java程序员
- 下一篇: java 解析日期 t z_date