Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > PHP > PHP Forum > มีปัญหาหงุดหงิดกับ Server ที่ตั้งอยู่ใน router ที่เป็น dynamic IP ใช่ไหม มีโปรแกรมมาช่วยแก้ปัญหา



 

มีปัญหาหงุดหงิดกับ Server ที่ตั้งอยู่ใน router ที่เป็น dynamic IP ใช่ไหม มีโปรแกรมมาช่วยแก้ปัญหา

 



Topic : 137151



โพสกระทู้ ( 9,587 )
บทความ ( 2 )



สถานะออฟไลน์




พอดี ลง 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
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2024-02-12 11:20:02 By : Chaidhanan View : 287 Reply : 3
 

 

No. 1



โพสกระทู้ ( 9,587 )
บทความ ( 2 )



สถานะออฟไลน์


ปล. database เป็น MsSql เปลี่ยนเอาตาม สดวก
หวังว่าจะได้ประโยชน์กับ ผู้ตั้ง server มือใหม่






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2024-02-12 11:31:57 By : Chaidhanan
 


 

No. 2



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


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
 

 

No. 3



โพสกระทู้ ( 9,587 )
บทความ ( 2 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 2 เขียนโดย : mr.v เมื่อวันที่ 2024-02-13 13:45:26
รายละเอียดของการตอบ ::
ผมใช้ 3bb reset router ทุกสัปดาห มันมี ฟังก์ชั่น กำหนดวัน reset ได้ อยู่ได้ 7 วัน
จะใช้ domain จากไหนก็ได้ แค่มี api ไว้เปลี่ยน dns ชี้ IP มาที่่ router ที่ใช้งาน

แต่เขียนไว้แค่ 2 ตัวเพราะใช้ 2 ตัวนี้


ไม่ต้องมานั่งเปลี่ยนเอง ปล่อยยาวเลย

ส่วน AIS โปรแกรมนี้ ก็ใช้ได้คร้บ แต่ มัน reset ทุกวัน ต้องซื้อเพิ่ม fix ip แต่ถือว่าถูก กว่า เจ้าอื่น แค่ 200 บาท( 5 ปีที่แล้ว)
แต่ผมไม่ใช้ เพราะ ความเร็วไม่ได้ แถมหมกเม็ด มีโปรใหม่มาถูกกว่า พี่แกเงียบกริบ แถม ยังให้แค่ 10 port เลย เลิกใช้

3BB ให้ ทั้ง 65535 1000/1000 1280/ด
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2024-02-13 15:31:10 By : Chaidhanan
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : มีปัญหาหงุดหงิดกับ Server ที่ตั้งอยู่ใน router ที่เป็น dynamic IP ใช่ไหม มีโปรแกรมมาช่วยแก้ปัญหา
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่