มีปัญหาหงุดหงิดกับ Server ที่ตั้งอยู่ใน router ที่เป็น dynamic IP ใช่ไหม มีโปรแกรมมาช่วยแก้ปัญหา
พอดี ลง linux server แล้วมีปัญหา ดัง caption นั่้นแหล่ะ เลยคิดหาวิธีแก้ปัญหา แบบอัตโนมัติ
โดยใช้ CI3 เขียนโปรแกรมนี้ขึ้นมา เอา API ที่เขามี document ให้ เอามาเขียน
ได้เฉพาะเจ้า cloudflare และ google เท่านั้นนะ เพราะใช้งานอยู่ 2 เจ้านี้
Code (PHP)
<?php
// filename DynamicIp
defined('BASEPATH') OR exit('No direct script access allowed');
define('cf_email','??????'); // email reference เอา ที่ลงทะเบียนกับ ผู้ให้บริการ cloudflare
define('cf_key','?????'); // cloudflare: secure-key เอามาจากผู้ให้บริการ cloudflare
function SetGG_Curl($user,$psw,$host,$ip){
$data_post = ['hostname'=>$host,'myip'=>$ip];
$fields_string = http_build_query($data_post);
$ch = curl_init();
$url = 'https://'.$user.':'.$psw.'@domains.google.com/nic/update';
//echo $url; exit;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 ");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$rsp = curl_exec($ch); curl_close($ch);
return (object)['url'=>$url, 'fld'=>$fields_string, 'rs'=>$rsp];
}
function CF_GetZone($zone){
$ch = curl_init();
$url='https://api.cloudflare.com/client/v4/zones?name='.$zone.'&status=active';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-Auth-Email: ' . cf_email,
'X-Auth-Key: '. cf_key,
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 0);
$rsp = json_decode(curl_exec($ch)); curl_close($ch);
return $rsp->result[0]->id;
}
function CF_DnsID($zoneid, $dns,$ty='AAAA'){ //cloudflare
$ch = curl_init();
$url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records?type=$ty&name=$dns";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Auth-Email: '.cf_email,'X-Auth-Key: '.cf_key,'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 0);
$rsp = curl_exec($ch); curl_close($ch);
$js=json_decode($rsp>''? $rsp : '[]');
//print_r($js); die();
return $js->result[0]->id??'';
}
function CF_DnsPut($dns, $zoneid, $dns_id, $ip, $prox, $ty='AAAA'){ //cloudflare
$ar=(object)['type'=>$ty, 'name'=>$dns,'content'=>$ip,'ttl'=>1,'proxied'=>$prox? true : false];
$fields_string = http_build_query($ar);
$url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dns_id";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Auth-Email: ' . cf_email, 'X-Auth-Key: '. cf_key, 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$rsp = curl_exec($ch); curl_close($ch);
return [$url, $fields_string, json_decode($rsp)];
}
class DynamicIp extends CI_Controller {
public function __construct(){
parent::__construct();
define('IPv4',file_get_contents('https://checkip.amazonaws.com'));
define('IPv6',file_get_contents('https://ifconfig.me'));
}
public function IP4(){ echo IPv4; }
public function IP6(){ echo IPv6; }
public function Index(){
$mip=['A'=>IPv4, 'AAAA'=>IPv6];
//************************************ Google Dns
$rs=$this->db->get_where('domains',['uid'=>1])->result();
foreach($rs as $ro){
$gip=$mip[$ro->ty]??IPv4;
if($ro->ip != $gip){
$ro->old_ip=$ro->ip??'-'; $ro->ip=$gip;
SetGG_Curl($ro->uname, $ro->passwd,($ro->sub>''? $ro->sub.'.':'').$ro->domain, $gip);
$this->db->update('domains', ['old_ip'=>$ro->old_ip, 'ip'=>$mip[$ro->ty], 'up2date'=>cur_date_time],['id'=>$ro->id]);
}
}
//************************************
$rs=$this->db->order_by('domain')->get_where('domains',['uid'=>2])->result();
$old_domain='';
foreach($rs as $ro){
$gip=$mip[$ro->ty]??IPv4;
if($ro->ip != $gip){
if($old_domain!=$ro->domain){
$zoneid = CF_GetZone($ro->domain);
$old_domain=$ro->domain;
}
$dns=($ro->sub ? $ro->sub.'.' : '').$ro->domain;
$dns_id=CF_DnsID($zoneid, $dns, $ro->ty);
CF_DnsPut($dns, $zoneid, $dns_id, $gip, $ro->prox, $ro->ty);
$this->db->update('domains',['old_ip'=>$ro->ip??'', 'ip'=>$gip, 'up2date'=>cur_date_time],['id'=>$ro->id]);
}
}
$this->parser->parse('sh', ['loop'=>$ar, 'zoneid'=>$zone, 'em'=>cf_email, 'ky'=>cf_key, 'gg'=>$gg]);
}
}
Code (SQL)
-- ตัวอย่าง ข้อมูล table "domains"
create table domains (
Id int primary key identity(1, 1),
uid int,
domain nvarchar(100),
sub nvarchar(100),
uname varchar(32),
paswd varchar(64),
ip varchar(64) NULL,
old_ip varchar(64) NULL,
up2date datetime NULL,
prox tinyint NULL,
ty varchar(4)
);
insert into domains (uid,domain,sub,uname,paswd,ip,old_ip,up2date,prox,ty)
values (1,"????.com","","????","????","","",getdate(),0,"A");
insert into domains (uid,domain,sub,uname,paswd,ip,old_ip,up2date,prox,ty)
values (2,"????.com","","email@????.com","??????","","","",1,"AAAA");
เปลี่ยนเครื่องหมายคำถามให้ถูกต้องตามที่มีด้วยนะครับ
*******************************************
uid:1 = google dns
uid:2 = cloudflare dns
*******************************************
*/
เสร็จแล้วก็ ตั้ง crontab ให้ตรวจสอบ IP
เป็น ราย นาที ขั่วโมง เอาตามสดวก
Code
#/bin/bash
log=/var/www/log # สร้างไว้ด้วยนะ ที่ไหนก็ได้ ใฟ้ php อ่านได้
oip4=-
if [ -f $log/IP4 ]; then
oip4=$(head -n1 $log/IP4)
fi
ip4=$(curl -s https://checkip.amazonaws.com)
if [ ! "$oip4" == "$ip4" ]; then
tmp=$(curl -s localhost/DynamicIp)
#url ที่ตั้งโปรแกรม จากด้านบน
echo $ip4 > $log/IP4
fi
Tag : PHP
ประวัติการแก้ไข 2024-02-12 11:28:16 2024-02-12 11:29:14
Date :
2024-02-12 11:20:02
By :
Chaidhanan
View :
265
Reply :
3
ปล. database เป็น MsSql เปลี่ยนเอาตาม สดวก
หวังว่าจะได้ประโยชน์กับ ผู้ตั้ง server มือใหม่
Date :
2024-02-12 11:31:57
By :
Chaidhanan
dynamic ip, dynamic dns เมื่อก่อนตอนแรกเลย ใช้ no-ip
ต่อมารำคาญที่ต้องต่ออายุ(ฟรี)ทุกๆเดือนหรือไงเนี่ย เลยเปลี่ยนมาใช้ duckdns
ตอนหลังมีอุปกรณ์ mikrotik มันมี dynamic host name ให้ก็ใช้แล้วเอาชื่อยาวๆที่มันให้มาไปพ่วงใส่ cname กับโดเมนจริงเอา
จากที่ทดลองวัดดู โดยใช้พวก uptime monitor.
duckdns เน่าบ่อยสุด host ล่มบ่อยสุด ขณะที่ของ mikrotik ล่มน้อยกว่า ส่วนของ no-ip ตั้งแต่เลิกใช้ไม่เคยสมัครอีกเลยไม่รู้ว่าล่มบ่อยมั้ย
ส่วนกรณีใช้เน็ต AIS ถือว่าปิดฉาก เพราะใช้ไม่ได้ทั้งหมด ไม่ว่า ddns ค่ายไหน
เพราะมันไม่ให้ public ip มาเลย ต้องใช้งานผ่าน thddns ของมันอย่างเดียว.
Date :
2024-02-13 13:45:26
By :
mr.v
Load balance : Server 01