Welcome to Sysnet Board คู่มือ การใช้งานอุปกรณ์ Network. Please log in or sign up.
สมาชิกทั้งหมด
17,949
กระทู้ทั้งหมด
9,945
หัวข้อทั้งหมด
4,633

  • ให้ Mikrotik ส่งค่า Wan IP Address ผ่าน URL Parameter เข้า Webserver
    เริ่มโดย yod
    Read 247,594 times
0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้
yod

ให้ Mikrotik ส่งค่า Wan IP Address ผ่าน URL Parameter เข้า Webserver



บทความนี้ค่อนข้างจะ advance ซักนิดนึง แต่อยากให้ลองเล่นดูครับ จะมีประโยชน์ในการนำไปพัฒนาต่อได้อีกครับ  ;D ;D


จะเป็นการทดสอบใช้ Script ที่สามารถเขียนเพิ่มเติมได้ของอุปกรณ์ Mikrotik Routerboard ครับ ทำให้เราสามารถเขียนภาษา script เข้าไปฝังในอุปกรณ์ Mikrotik ได้ แล้วก็ใช้ Event ต่างๆในการ Run script ขึ้นมา หรือจะใช้ Schedule ตั้งเวลาให้สั่งทำงานทุกๆกี่นาทีหรือทุกๆกี่เวลาก็ได้ครับ


ภาษา script ถ้าใครเคยเขียนโปรแกรมมาก่อน จะไม่ยากครับโครงสร้างภาษาคล้ายๆภาษา C ไม่ต้องใช้ oop ใดๆทั้งสิ้น (นึกถึงเมื่อก่อน ต้องไปอบรม object oriented programming เป็นเดือน  :P) การอ้างอิง function หรือ procedure ต่างๆ ก็เรียกตาม path ของ function ที่มีใน mikrotik นั้นๆ คู่มือจะมีอยู่ใน wiki ของทาง mikrotik ครับ


ตัวอย่างจะเป็นการใช้งาน funtion Fetch ใน function นี้จะเป็นคำสั่งเพื่อการ download/upload file จากอุปกรณ์ network (web server, ftp server) ผ่านทาง protocol http หรือ ftp ที่มีใช้งานกันบ่อยๆคือ update ค่า IP Address ไปยัง Dynamic DNS Server ผ่านทาง URL Query string หรือจะนำไปประยุกตใช้งานโดยการส่งค่า parameter ไปยัง webserver เพื่อนำไปประมวลผลต่อไป เช่น http://www.sysnetcenteer/test.php?val1=aaa จะเป็นการส่งค่า aaa ไปยัง web server ผ่าน parameter val1 ซึ่งผมอาจจะนำค่า aaa นี้ไปทำอะไรต่ออีกก็ได้ครับ


ok ทีนี้ผมลองนั่งคิดเล่นๆว่า ถ้าผมมี mikrotik router อยู่หลายๆ site ซึ่งไม่ได้เป็น Internet แบบ Fix IP เวลาผมต้องการจะ remote เข้าไป ผมก็ต้องสมัครบริการ Dynamic DNS ซึ่งมีทั้งฟรีและไม่ฟรี ถ้าฟรีก็ Update IP ช้าหน่อย ถ้าไม่ฟรีก็เร็วหน่อย แต่ผมก็ต้องสร้าง dynamic host name ไว้ทุกๆ site งาน


แต่ผมมี hosting ที่ไว้วาง web ของทางร้านอยู่แล้ว ก็อาศัย function fetch ให้มัน update ค่า wan ip ของแต่ละ site งาน บันทึกลงไฟล์ แล้วใช้ internet explorer ดู ip และ bookmark ไว้เลยจะดีกว่า  ;D ;D


ตัวอย่างนะครับตัวอย่าง ถ้าพอเข้าใจ concept แล้ว จะไปประยุกต์ใช้กับลักษณะงานอื่นๆก็ได้ครับ เช่นส่ง SMS เพราะเดี๋ยวนี้มีผู้ให้บริการส่ง sms ในราคาถูก และมี webservice ให้ใช้ด้วย  (ยังไม่เคยลองกับ mikrotik นะครับ แต่ผมใช้วิธีเขียนโปรแกรมเพื่อแจ้ง SMS สถานะสินค้าเคลมให้ลูกค้าครับ)



จาก code ผมสร้างไฟล์ getip-zeer.php ขึ้นมา เพื่อรับค่า ip parameter และบันทึกลงไฟล์ที่ชื่อ site-zeer.txt (สีแดง)

จากนั้นก็ upload สองไฟล์นี้ขึ้น Webserver ครับ

ไฟล์ site-zeer.txt ผมสร้างเป็นไฟล์เปล่าๆ หลังจาก Upload ขึ้น webserver แล้ว ให้แก้ permission เป็น read/write (666) ได้ด้วยนะครับ


<html>
<body>
<?php
     $myFile = "site-zeer.txt";
   $fh = fopen($myFile, 'w') or die("can't open file");
   $stringData = $_GET["ipval"];
   fwrite($fh, $stringData);   
   fclose($fh);
?>
</body>
</html>



ที่นี้ก็เป็น Script สำหรับส่ง Wan ip parameter ไปยัง Web server จะใช้ function fetch ในการ get ครับ


Property หลักๆของ function fetch ก็จะมีดังนี้ครับ
address (string) IP Address หรือ Hostname ที่ต้องการเชื่อมต่อ
dst-path (string) Destination filename and path
mode (ftp|http|tftp; Default: http) Protocol ที่ใช้ในการเชื่อมต่อ http, ftp หรือ tftp (ไม่มี https นะครับ)
keep-result (yes|no) ให้มีการเก็บ content ใน routerboard



Code Script Update Wan ip ครับ

แก้ไขชื่อ host ที่ใช้งานจริงนะครับ ในตัวอย่าง จะเป็น host ของทางผมเอง

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++#
#ประกาศตัวแปลเป็น global เพื่อให้ค่าที่อยู่ในตัวแปลไม่หายไปเมื่อ run script เสร็จ
:global previousIP

# อ่านค่า Wan IP จาก checkip.dyndns.org ซึ่งในกรณีที่ Routerboard ต่ออยู่หลัง Router อีกที
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"

:delay 1
:local result [/file get dyndns.checkip.html contents]
:local resultLen [:len $result]
:local startLoc [:find $result ": " -1]
:set startLoc ($startLoc + 2)
:local endLoc [:find $result "</body>" -1]
:local currentIP [:pick $result $startLoc $endLoc]
:log info "Current wan ip: currentIP = $currentIP"

#ตรวจสอบ Wan IP ว่ามีการเปลี่ยนแปลงหรือไม่ ถ้าไม่ก็จะไม่ทำคำสั่งต่อ
:if ($currentIP != $previousIP) do={
:set previousIP $currentIP

#ส่ง Parameter ipval ไปยัง webserver แก้ไข url ตามที่ใช้งานจริง
/tool fetch url="https://www.sysnetcenter.com/getip-zeer.php?ipval=$currentIP" mode=http keep-result=no
:delay 1
:log info ("Update wan ip successfully..")
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++#


ถ้าให้ RouterBoard เป็น Gateway ออก Internet โดยตรง เช่น PPPoE

<< Internet >>=======<< Modem (Bridge Mode) >>=======<< RouterBoard (PPPoE) >>

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++#
#ประกาศตัวแปลเป็น global เพื่อให้ค่าที่อยู่ในตัวแปลไม่หายไปเมื่อ run script เสร็จ
:global previousIP
:local currentIP [/ip address get [find interface="pppoe-out1"] address];
:log info "Current wan ip: currentIP = $currentIP"

#ตรวจสอบ Wan IP ว่ามีการเปลี่ยนแปลงหรือไม่ ถ้าไม่ก็จะไม่ทำคำสั่งต่อ
:if ($currentIP != $previousIP) do={
:set previousIP $currentIP

#ส่ง Parameter ipval ไปยัง webserver แก้ไข url ตามที่ใช้งานจริง
/tool fetch url="https://www.sysnetcenter.com/getip-zeer.php?ipval=$currentIP" mode=http keep-result=no
:delay 1
:log info ("Update wan ip successfully..")
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++#



ใส่ลงใน Script ใน Mikrotik ตั้งชื่อให้สื่อซักหน่อยนะครับ






ทดสอบ

ตรวจสอบ Wan IP ปัจจุบัน




จากนั้นลองทดสอบ Run script ดูครับ โดย click ที่ [Run Script] ที่หน้าจอ Create Script ได้เลย


ใช้ Internet Explorer เปิดไฟล์ขึ้นมา ถ้าเรียบร้อยก็ Favorites เอาไว้ครับ เพื่อไว้เรียกดูง่ายๆ




เมื่อทดสอบเรียบร้อยแล้วก็ตั้ง Schedule ขึ้นมา ให้ทำการ Run script ที่สร้างไว้ทุกๆ 1 นาที





ในกรณีที่มีหลายๆ site ก็เปลี่ยนชื่อ file php เช่น getip-zeer.php เป็น file ชื่ออื่นๆ และ $myFile = "site-zeer.txt"; ก็ต้องเปลี่ยนเช่นกันครับ หรือจะแก้ code php ให้ write ลงไฟล์ทีละบรรทัด และแยกตาม Sitename ก็ได้ครับ


เรียบร้อยครับ เดี๋ยวถ้ามีหัวข้อทดลองอะไรที่น่าจะมีประโยชน์ต่อการใช้งาน ผมจะทยอยนำขึ้น webboard เรื่อยๆครับ และจะแจ้งทาง facebook ของทางร้านไว้ด้วยเช่นกันครับ อย่าลืม click like กันนะครับ  ;D ;D ;D ;D ;D ;D

yod
#1
ตั้งกระทู้ปุ๊บมีลูกค้าถามมาปั๊บ  :D :D :D


"ยอด แล้วถ้าพี่จะให้มันส่งเมล์มาละจะทำยังไง พี่ไม่มี mail server น่ะ"


ถ้าพี่ไม่มี mail server เป็นของตัวเอง พี่ก็ใช้ของชาวบ้านเลยครับ เช่น gmail มันจะให้พี่ใช้ smtp ได้ น่าจะวันนึงให้ส่งได้ไม่เกิน 50-100 ฉบับ

สมัคร gmail account ให้เรียบร้อยก่อนครับ


เข้า Winbox --> Tool --> Email

Server: 173.194.69.109 (เป็น Mail Server ของ gMail)
Port: 587
From: ชื่อ gmail ที่สมัครไว้
User: ชื่อ gmail ที่สมัครไว้
Password: : password ของ gmail ที่สมัครไว้



Click [OK]



จากนั้นแก้ Script ด้านล่างตรงตัวสีแดง ให้ตรงกับ gmail ที่ใช้งานครับ จะเป็นการใช้ tool ในการส่ง email ของ mikrotik จะสามารถ attatch file ได้

ส่วน body ผมไม่ได้ใช้ครับ อ่านแค่ subject ก็พอแล้ว  ;D ;D


#ประกาศตัวแปลเป็น global เพื่อให้ค่าที่อยู่ในตัวแปลไม่หายไปเมื่อ run script เสร็จ
:global previousIP

# อ่านค่า Wan IP จาก checkip.dyndns.org ซึ่งในกรณีที่ Routerboard ต่ออยู่หลัง Router อีกที
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"

:delay 1
:local result [/file get dyndns.checkip.html contents]
:local resultLen [:len $result]
:local startLoc [:find $result ": " -1]
:set startLoc ($startLoc + 2)
:local endLoc [:find $result "</body>" -1]
:local currentIP [:pick $result $startLoc $endLoc]
:log info "Current wan ip: currentIP = $currentIP"

#ตรวจสอบ Wan IP ว่ามีการเปลี่ยนแปลงหรือไม่ ถ้าไม่ก็จะไม่ทำคำสั่งต่อ
:if ($currentIP != $previousIP) do={
:set previousIP $currentIP

/tool e-mail send to="เมล์ที่จะส่งเข้า" password=gmail-password subject=([/system clock get date]." Zeer Wan IP: ".$currentIP) from=gmail ที่สมัครไว้ server=173.194.69.109 tls=yes

:delay 1
:log info ("Update wan ip successfully..")
}


ถ้าให้ RouterBoard เป็น Gateway ออก Internet โดยตรง เช่น PPPoE

<< Internet >>=======<< Modem (Bridge Mode) >>=======<< RouterBoard (PPPoE) >>


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++#
#ประกาศตัวแปลเป็น global เพื่อให้ค่าที่อยู่ในตัวแปลไม่หายไปเมื่อ run script เสร็จ
:global previousIP
:local currentIP [/ip address get [find interface="pppoe-out1"] address];
:log info "Current wan ip: currentIP = $currentIP"

#ตรวจสอบ Wan IP ว่ามีการเปลี่ยนแปลงหรือไม่ ถ้าไม่ก็จะไม่ทำคำสั่งต่อ
:if ($currentIP != $previousIP) do={
:set previousIP $currentIP

/tool e-mail send to="เมล์ที่จะส่งเข้า" password=gmail-password subject=([/system clock get date]." Zeer Wan IP: ".$currentIP) from=gmail ที่สมัครไว้ server=173.194.69.109 tls=yes

:delay 1
:log info ("Update wan ip successfully..")
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++#


ทดสอบ Run Script ครับ





เรียบร้อย