最近拿到了自家寬帶光貓的超管權(quán)限,通過光貓、小米路由器,把 20~10000 這個(gè)范圍內(nèi)的端口全映射到了 NAS 上面;簡(jiǎn)單測(cè)試一下,除了 80、443 端口不能用以外,其它均正常。
目前我還沒搞清楚這個(gè)光貓換公網(wǎng) IP 的時(shí)間機(jī)制,于是乎我寫個(gè)簡(jiǎn)單的 PHP 腳本,配合 DNSpod,實(shí)現(xiàn)域名動(dòng)態(tài)解析,方便我不在家時(shí)遠(yuǎn)程控制。
DNSpod 免費(fèi)版 TTL 最短時(shí)間是 10 分鐘,配合寶塔的計(jì)劃任務(wù),掛個(gè)間隔 10 分鐘的任務(wù)剛剛好。
計(jì)劃任務(wù)
把腳本放到合適的路徑,添加一個(gè) 10 分鐘的計(jì)劃任務(wù)
/usr/bin/php /www/wwwroot/dnspod/main.php
![圖片[1]-使用DnsPod簡(jiǎn)單實(shí)現(xiàn)域名DDNS](http://www.oilmaxhydraulic.com.cn/wp-content/uploads/2022/02/8-1.png)
源代碼
<?php
// Dnspod token,獲取地址 https://console.dnspod.cn/account/token/token
$token = '235678,f485d8729df9397c719e0fe8f5802xxx';
// 需要解析的域名
$domain = 'xxx.com';
// 解析記錄
$record = 'panel.nas';
$api = 'https://dnsapi.cn/Record.List';
$post = [
'login_token' => $token,
'format' => 'json',
'lang' => 'cn',
'domain' => domain,
];
$record_id = null;
$res = getCurl($api, ['post' => $post]);
$data = json_decode($res, true);
// 獲取記錄ID
foreach ($data['records'] as $itm) {
if ($record == $itm['name']) {
$record_id = $itm['id'];
}
}
if (empty($record_id)) {
exit("記錄 [$record] 未找到,請(qǐng)檢查!\n");
}
// 獲取公網(wǎng)IP
$ip = file_get_contents('https://www.bt.cn/Api/getIpAddress');
if (empty($ip)) {
exit("公網(wǎng)IP獲取失敗 \n");
}
echo "當(dāng)前公網(wǎng)IP:$ip \n";
// 修改域名A記錄
$api = 'https://dnsapi.cn/Record.Modify';
$post = [
'login_token' => $token,
'format' => 'json',
'lang' => 'cn',
'domain' => $domain,
'record_id' => $record_id,
'sub_domain' => $record,
'record_type' => 'A',
'record_line' => '默認(rèn)',
'value' => $ip,
'mx' => 20,
];
$res = getCurl($api, ['post' => $post]);
$data = json_decode($res, true);
if ($data['status']['code']) {
echo "修改成功:{$data['status']['message']} \n";
}
function getCurl($url, $opt = [])
{
$cookie = '';
if (is_array($opt['cookie'])) {
foreach ($opt['cookie'] as $k => $v) {
$cookie .= $k . '=' . $v . '; ';
}
}
$cookie = (mb_substr($cookie, 0, mb_strlen($cookie) - 2));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Expect:"]);
curl_setopt($ch, CURLOPT_NOBODY, $opt['nobody']);
curl_setopt($ch, CURLOPT_HEADER, $opt['header'] ?? false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $opt['headers'] ?? []);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, $opt['rtime'] ?? 10000);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $opt['ctime'] ?? 10000);
curl_setopt($ch, CURLOPT_REFERER, $opt['refer'] ?? 'https://user.qzone.qq.com/');
curl_setopt($ch, CURLOPT_USERAGENT,
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36');
if (isset($opt['post'])) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, is_array($opt['post']) ? http_build_query($opt['post']) : $opt['post']);
}
if (isset($opt['proxy']) && is_array($opt['proxy'])) {
curl_setopt($ch, CURLOPT_PROXY, $opt['proxy']['ip']);
curl_setopt($ch, CURLOPT_PROXYPORT, $opt['proxy']['port']);
}
$res = curl_exec($ch);
$error = curl_error($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($opt['detail']) {
return ['code' => $code, 'error' => $error, 'resp' => $res,];
}
return $res;
}
? 版權(quán)聲明
THE END
暫無評(píng)論內(nèi)容