วันอังคารที่ 24 พฤศจิกายน พ.ศ. 2563

MQTT - Message Queuing Telemetry Transport

อินเทอร์เน็ตทุกวันนี้เราอาจจะมองแทบทุกอย่างเป็นเว็บไปได้เพราะการสื่อสารส่วนมากบนอินเทอร์เน็ตส่งข้อมูลผ่านโปรโตคอล HTTP แต่ในโลกยุค Internet of Things (IoT) อีกโปรโตคอลที่กำลังมีการใช้งานมากขึ้นเรื่อยๆ คือ MQTT หรือ MQ Telemetry Transport โปรโตคอลสำหรับการเชื่อมต่อแบบ machine-to-machine หรือคอมพิวเตอร์สู่คอมพิวเตอร์


MQTT คืออะไร
MQTT ย่อมาจาก Message Queuing Telemetry Transport เป็นโปรโตคอลสำหรับใช้ในสื่อสารข้อมูลระหว่าง Machine to Machine (M2M) ถูกคิดค้นขึ้นในปี ค.ศ. 1999 โดย Dr Andy Stanford-Clark จาก IBM และ Arlen Nipper จาก Arcom (now Eurotech) ออกแบบมาเพื่อใช้สื่อสารในระบบเครือข่ายที่มีทรัพยากรค่อนข้างจำกัด ใช้งานแบนด์วิธต่ำ สามารถ publish-subscribe ข้อมูลระหว่าง Device เพื่อสื่อสารกันระหว่างอุปกรณ์ และถ้ามองในด้านที่เกี่ยวกับ Internet of Things จะสามารถประยุกต์ให้อุปกรณ์ต่างๆเชื่อมต่อกันผ่านเครือข่ายของอินเทอร์เน็ตได้ ทำให้เราสามารถสร้างสรรค์โครงงานที่เกี่ยวกับการติดตามอุปกรณ์ เช่น มอนิเตอร์อุปกรณ์ผ่านอินเทอร์เน็ต ควบคุมอุปกรณ์ผ่านอินเทอร์เน็ต เป็นต้น

สำหรับระบบ IoT นั้น การติดต่อสู่ Internet นั้นเป็นสิ่งสำคัญอย่างยิ่งเพราะอินเทอเน็ตทำให้อุปกรณ์ IoT ต่าง ๆสามารถติดต่อสื่อสารและแลกเปลี่ยนข้อมูลกันได้ MQTT (Message Queue Telemetry Transport) ซึ่งพัฒนาต่อมาจาก TCP/IP อีกทีนั้นได้กลายเป็น protocol มาตรฐานสำหรับระบบ IoT และเนื่องจากมันสร้างมาจาก TCP/IP นั้นทำให้ MQTT ประกันว่าข้อมูลที่ส่งกันระหว่างอุปกรณ์ IoT นั้นไม่มีการหล่นหายระหว่างทาง

MQTT ประกอบด้วย อะไรบ้าง

– MQTT Client เป็นส่วน publish ข้อมูลต่างๆ ขึ้นไปยัง MQTT Broker และสามารถ Subscribe ข้อมูลต่างๆจาก MQTT Broker ผ่านทาง TCP/IP Protocol ถ้ามองในมุมมองของ Internet of Things (IoT) อุปกรณ์จำพวกนี้จะเป็น Device ที่สามารถเชื่อมต่อกับระบบเครือข่ายได้ เช่น บอร์ด Arduino Uno Wifi 2, Arduino MKR Wifi 1010, บอร์ด ESP32, บอร์ด ESP8266, บอร์ด Raspberry Pi, เว็ปไซต์, สมาร์ทโฟน

– MQTT Broker หรือ MQTT Server เป็นซอฟต์แวร์สำหรับรับข้อมูลจาก MQTT Client ที่ได้ publish เข้ามาและสามารถ publish ข้อมูลจาก MQTT Broker ไปยัง MQTT Client ที่ได้ Subscribe ข้อมูลไว้ได้ หากมองในมุมมองของ Internet of Things อุปกรณ์นี้อาจจะเป็น Cloud Server ของค่ายต่างๆ เช่น CloudMQTT, NETPIE, Azure, AWS เป็นต้น หรือใช้ Single Board Computer เช่นบอร์ด Raspberry Pi, LattePanda, Beagle Bone, nanoPi, อื่นๆ แล้วติดตั้งซอฟต์แวร์เพิ่มเติมก็สามารถใช้งานได้เช่นกัน

ตัวอย่างการสื่อสารเบื้องต้นของ MQTT

1. กำหนดให้ Client Device ในตัวอย่างนี้จะเป็นสมาร์ทโฟน ทำการ Subscribe MQTT Broker ตาม Topic ที่ต้องการ ตัวอย่างนี้ติดตาม Topic “temp” ไว้

2. กำหนดให้ Client Device (Device ที่ต่อกับเซ็นเซอร์วัดอุณหภูมิ) แล้วทำการ Publish ค่าขึ้นไปยัง MQTT Broker

3. MQTT Broker Publish ไปยังอุปกรณ์ที่ Subscribe ไว้ ดังนั้นในตัวอย่างนี้สมาร์ทโฟนจะได้รับข้อมูลจาก Client ที่ต่ออยู่กับเซ็นเซอร์เรียบร้อย

จากตัวอย่างการสื่อสารเบื้องต้นของ MQTT จะเห็นได้ว่าการสื่อสารระหว่างอุปกรณ์นั้นสามารถเชื่อมต่อกันได้อย่างกว้างขวาง ไม่จำกัดในเรื่องชนิดอุปกรณ์ว่าจำเป็นต้องเป็นอุปกรณ์ชนิดเดียวกัน สามารถสื่อสารกันได้หลากหลายแพลตฟอร์ม มีตัวอย่างการใช้งานสำหรับการพัฒนาโปรแกรมด้วยภาษาต่างๆ มากมายเช่น ภาษา C, Python และอื่นๆ ทำให้การเชื่อมต่อแบบ MQTT นี้น่าสนใจสำหรับการนำมาประยุกต์ใช้เป็นงานพอสมควร

สรุปประโยนชน์ของ MQTT

1. แค่เขียนโค้ดง่ายๆจากอุปกรณืของเราก็สามารถ เข้าถึงการทำงานของ MQTT ได้แล้ว

2. ประหยัดพลังงานในการส่งข้อมูล ซึ่งใช่กับอุปกรณ์ที่ใช่แค่ ถ่ายแบตเตอร์รี่ หรือ มีขนาด CPU น้อยๆ ได้

3. ติดตั้งระบบง่ายไม่ว่าจะเป็นฝั่ง broker หรือ client ซึ่งใน Python ก็มี library แล้ว

4. เป็น ระบบแบบ event-driven หรือก็คือสามารถรับข้อมูลได้ตลอดเวลาที่ topic นั้นๆ ถูก publish

5. เพิ่มความเร็วในการส่งข้อมูล เนื่องจาก headers ของข้อมูลนั้นมีขนาดเล็ก

6. สามารถแชร์ข้อมูลจาก อุปกรณ์ ไปยังอุปกรณ์อื่นๆได้ง่าย

ก็จบไปแล้วสำหรับบทความนี้หวังว่าจะเป็นประโยชน์ต่อหลายๆคนที่กำลังตั้งใจจะศึกษาเกี่ยวกับระบบ IoT ซึ่งความรู้ตรงนี้จะเอาไปต่อยอดเวลาตอนที่เราจะ ดีไซน์ ระบบของเราได้

วันอาทิตย์ที่ 22 พฤศจิกายน พ.ศ. 2563

SNMP - Simple Network Management Protocol


ในปัจจุบันนี้เราปฎิเสธไม่ได้ว่าระบบเครือข่ายและอินเทอร์เน็ตมีส่วนสำคัญในการดำเนินชีวิตของเรา ไม่องค์กรหรือธุรกิจไหนต่างก็ต้องมีระบบเครือข่ายเป็นตัวเอง แต่ว่าสิ่งเรามักละเลยกับมันนั้นก็คือ การดูแลรักษาระบบเครือข่ายของเราให้ใช้ได้อยู่อย่างสม่ำเสมอ บริษัทหรือองค์กรขนาดใหญ๋มักจะมีการว่าจ้างผู้ดูแลระบบเพื่อมาดูแลในส่วนระบบเครือข่ายนี้ แต่ว่าหากอุปกรณ์เหล่านั้นมีจำนวนมาก ก็เป็นเรื่องยากที่คนหนึ่งคนจะตามไปซ่อมบำรุงรักษาให้ทั้งหมดดังนั้นจึงมีการคิดค้นโปรโตคอลตัวหนึ่ง เพื่อใช้ในการเฝ้าระวังและติดตามผลการทำงานของอุปกรณ์ เพื่อให้เราสามารถทราบตำแหน่งของอุปกรณ์ที่มีปัญหาเหล่านั้น และเข้าไปซ่อมบำรุงแก้ไขได้ทันที และในวันนี้เราจะพาทุกท่านไปรู้จักโปรโตคอลตัวนั้น เพื่อให้เข้าใจหลักการทำงานและเพื่อเป็นประโยชน์ต่อการดูแลระบบ ซึ่งโปรโตคอลนั้นก็คือ SNMP

SNMP คืออะไร
SNMP เป็นคำย่อมาจาก Simple Network Management Protocol เป็นโปรโตคอลที่ใช้รวบรวมจัดเรียงข้อมูลเกี่ยวกับอุปกรณ์เครือข่าย เมื่อมีการเปลี่ยนแปลงข้อมูลไปจากเดิมโดยผ่าน IP Address ขอซึ่ง อาทิเช่น Router, Modems, Switch, Server, Workstations, Printer ฯลฯSNMP มีการใช้งานกันอย่างแพร่หลายสำหรับทำ network management หรือระบบการ monitoring โดน SNMP จะเก็บข้อมูลในรูปแบบตัวแปรและจัดการโดย management information base (MIB) ซึ่งเป็นที่เก็บข้อมูลหรือ database สำหรับการจัดการหรือเปลี่ยนแปลงค่าต่างๆบนอุปกรณ์ใน networkณ

ในปัจจุบัน SNMP ได้มีการพัฒนาเพื่อเพิ่มขีดความสามารถ และความยืดหยุ่นในการใช้งานแบ่งออกได้เป็น 3 เวอร์ชั่น คือ SNMPv1, SNMPv2, SNMPv3 ตามลำดับ

หลักการทำงานของ SNMP
เมื่อทราบแล้วว่า SNMP คืออะไร มาดูกันต่อว่าแล้ว SNMP ทำงานอย่างไร โดยส่วนมากแล้วเราใช้ SNMP สำหรับการบริหารจัดการระบบ computer จำนวนมาก ซึ่งมีความสามารถในการ monitor หรือจัดการกลุ่ม host หรือ อุปกรณ์ใน network โดยอุปกรณ์ในระบบจะ agent ที่คอยทำงานเพื่อตรวจสอบตอดลเวลา และก็จะส่ง report กลับไปหาตัว manger ที่เป็นฝั่ง server

SNMP จะมีส่วนประกอบด้วยกัน 3 ตัวหลักคือ
- ตัวอุปกรณ์ที่อยู่ใน network
- Agent — เป็น software ที่ต้องติดตั้งอยุ่บนอุปกรณ์เพื่อทำการตรวจสอบและ report สิ่งผิดปกติ
- Network management station (NMS) — เป็น software ของฝั่ง SNMP server หรือที่เรียกว่า manger คอยรับและเก็บรวบรวมข้อมูลจาก agent
โครงสร้างของ Protocol SNMP
SNMP ทำงานในระดับ Application Layer ในรูปแบบ Internet Protocol Suit ซึ่ง SNMP agent จะรับคำสั่งผ่านทาง UDP port 161 โดยตัว manager จะส่งคำสั่งไปยัง port 161 บนอุปกรณ์ฝั่ง agent จากนั้น agent จะส่งข้อมูลกลับไปยัง manager ตามที่ร้องขอมา ส่วนฝั่ง manager จะมีการรับ notification หรือที่เรียกกันว่า Traps (SNMP Traps) ที่ port 162 โดยฝั่ง agent จะเป็นคนส่ง notification เมื่อพบสิ่งผิดปกติตามที่ตั้ง rule เอาไว้ เพื่อส่งข้อมูลดังกล่าวไปยัง manager port 162 แต่ถ้าใช้เป็น secure port หรือ Transport Layer Security (TLS) สำหรับ agent จะเป็น port 10161 และ ฝั่ง manager trap จะเป็น port 10162

PDU 8 ชนิด

1. GetRequest (manager to agent)
เป็นการที่ฝั่ง manger ส่งคำขอดูข้อมูลไปยัง agent โดยจะกำหนดข้อมูลที่ต้องการไปใน object ภายใน message หรือที่เรียกว่า object identifier เช่น 1.3.6.1.2.1.1.1.0 หมายถึงต้องการทราบข้อมูล sysDescr หรือ ข้อมูลรายละเอียดของอุปกรณ์ที่ agent ติดตั้งอยู่ ซึ่งทาง agent เองก็จะตอบข้อมูลรายละเอียดดังกล่าวกลับไป

2. GetNextRequest (manager to agent)
เป็น PDU ที่ทาง manager ส่งไปหา agent เพื่อเอาข้อมูลตัวแปร โดยค่าของ object ตัวต่อจาก object ID ที่กำหนดใน MIB ส่วนใหญ่จะใช้ในการเอาค่าเข้าสู่ตาราง เพราะถ้า Manager ไม่ทราบ index ที่จะดึงก็จะไม่สามารถดึงค่าออกมาได้ แต่สำหรับ GetNextRequest จะกำหนด Object ID ในตารางของตัวถัดไปเรื่อยๆเอง

3. SetRequest (manager to agent)
เป็นฝั่ง manager ส่งคำสังไปยัง agent เพื่อกำหนด set ค่าของตัวแปร หรือเปลี่ยนแปลงค่าที่ configure ไว้ใน MIB ของอุปรณ์นั้นๆ

4. Response (agent to manager)
เป็นฝั่ง agent ส่งหา manager เพื่อตอบกลับข้อมูลจากคำสั่ง PDU GetRequest หรือ GetNextRequest โดยจะส่งข้อมูลของตัวแปรที่ร้องขอกลับไปหา manager

5. Trap (agent to manager)
เป็นฝั่ง agent ส่งหา manager เพื่อแจ้งหรือ notify เหตุการณ์ที่เกิดขึ้นบนฝั่ง agent เอง เช่นเกิดการ reboot server หรือมีค่าบางอย่างที่สูงถึง trigger ที่กำหนด

6. GetbulkRequest (manager to agent)
ถูกเพิ่มเข้ามาหลังจากพัฒนา Version 2 เป็นการที่ manager ส่งคำสั่งไปหา agent เพื่อเอาชุดข้อมูลขนาดใหญ่ แทนการ GetRequest หรือ GetNextRequest หลายๆครั้ง

7. InFormRequest (manager to manager)
ถูกเพิ่มเข้ามาหลังจากพัฒนา Version 2 เช่นเดียวกันเป็นฝั่ง manager ส่งหา manager กันเอง เพื่อรับค่าตัวแปรบางอย่างจาก agent ที่อยู่ภายใต้การควบคุมของ manger อีกตัวซึ่งจะต้องต้อบกลับด้วย Response PDU เช่นกัน

8. Report (manager to manager)
เป็นการส่งรายงานข้อผิดพลาดในระบบระหว่าง manager ด้วยกันเอง เป็นส่วนที่เพิ่มขึ้นมาเมื่อพัฒนาเป็น Version 3

วันอังคารที่ 10 พฤศจิกายน พ.ศ. 2563

NPAT Network Port Address Translation

ในบทความที่แล้วเราได้รู้จักเกี่ยวกับ NAT (Network Address Translation) กันไปแล้วว่า NAT นั้นมีไว้ทำอะไรและมีประโยชน์อย่างไร และในบทความนี้เราจะมาพูดถึง NAPT (Network Address Port Translation) ซึ่งเป็นอีกส่วนหนึ่งของ NAT ที่มีลักษณะหน้าที่การทำงานที่เหมือนกัน แต่ว่ามีประสิทธิภาพและความปลอดภัยที่ดีกว่าการทำ NAT แบบที่เรารู้จักกัน


NAPT คืออะไร

NAPT เป็นคำศัพท์ที่ย่อมาจาก Network Address Port Translation กระบวนการที่คล้ายกับการทำ NAT แต่จะมีการเปลี่ยนแปลงข้อมูลในชั้น transport ด้วย หรือก็คือจะเราสามารถกำหนด Port ที่ต้องการรับส่งข้อมูลไปยัง Public Network ได้นั้นเอง ซึ่งกระบวนการดังกล่าวจะช่วยให้ Private IP หลายๆ ตัว สามารถทำ NAT โดยใช้หมายเลข IP Address ที่จดทะเบียนเพียงหมายเลขเดียวได้

ทำไม PublicIP เดียวจึงสามารถใช้กับ Private IP ได้หลายตัว

ก็อื่นเรามาทำความเข้าใจก่อนว่า การสื่อสารผ่านระบบเครือข่ายอินเตอร์เน็ต โดยใช้ช่องทางสื่อสาร TCP/IP จะองค์ประกอบอยู่ด้วยกัน 4 อย่าง ดังต่อไปนี้

1. Source IP Address คือ IP Address ของต้นทางหรือฝั่งผู้ส่ง

2. Source Port คือหมายเลข Port ของฝั่งผู้ส่ง

3. Destination IP Addrss คือ IP Address ของปลายทางหรือฝั่งผู้รับ

4. Destination Port คือหมายเลข Port ของฝั่งผู้รับ

ซึ่งทั้งหมดนี้เรียกรวมๆ กันว่า Socket และตัว Socket นี้เองจะเป็นตัวกำหนดว่าการสื่อสารนั้นยังคงดำเนินการต่ออยู่หรือไม่ และเนื่องจากจำนวน Port ใน Firewall จะมีจำนวน ports ถึง 65,535 (สำหรับเครื่อง Server จะมีเพียง 1024 ports) ดังนั้นจะมี ports คงเหลือ 64,511 ทำให้เราสามารถต่ออินเตอร์เน็ตภายในองค์กร โดยใช้ Registred IP เพียงไม่กี่หมายเลข และนี่คือความสามารถพิเศษในการใช้งานในส่วนของ NAPT นั่นเอง

รูปแบบการทำ PAT

หากพูดเรื่องถึงเรื่องของการทำ NPAT ศัพท์นี้หลายคนอาจจะไม่ค่อยคุ้นหูกันเท่าไหร่ แต่ว่าจริงๆ แล้ว NPAT ก็คือการทำ PAT นั้นเอง ซึ่งหลักการทำ PAT นั้นมีด้วยกันอยู่ 2 ชนิด ดังต่อไปนี้

PAT (Port Address Translation) หรือที่เรียกว่า Overloading เป็นการแปลงหมายเลข IP Address แบบ many to one คือ IP Address ของเครื่องภายในเครือข่ายหลาย ๆ เครื่องจะทำการแปลงไปเป็น IP Address ของเครือข่ายภายนอกเพียง IP Address เดียวเท่านั้น โดยในการแปลงหมายเลข IP Address จะทำการแปลงหมายเลข Port ต้นทางไปด้วย ซึ่งในส่วนกระบวนการทำงานของ PAT จะคล้ายๆ กับการแปลง IP ของ Dynamic NAT

จากรูปจะเห็นว่าการทำ PAT นั้นจะทำการแปลง Private IP Address ไปเป็น Public IP Address เพียง IP Address เดียวเท่านั้น แต่จะแตกต่างกันที่หมายเลข Port ที่ใช้ เช่น Private IP Address 192.168.1.21 อาจจะถูกแปลงไปเป็น 201.108.10.30 port 1022 เป็นต้น ซึ่งเมื่อใช้งานเสร็จแล้ว หมายเลข port 1022 นี้ก็อาจจะถูกจับคู่กับ Private IP Address อื่น ๆ แทนก็ได้

Static PAT เป็นการแปลงหมายเลข IP Address แบบ one to one คล้าย ๆ กับการทำ Static NAT คือระบุ Public IP ให้แก่ Private IP แต่ละตัว เพียงแต่ Static PAT จะมีการระบุหมายเลขพอร์ตไปด้วย

จากรูปจะเห็นว่าการทำ Static PAT นั้นจะเป็นการจับคู่ระหว่าง Private IP Address และ Port เข้ากับ Public IP Address และ Port โดยจะคล้ายกับการทำ PAT แต่เราจะทำการกำหนด Port ด้วยตนเอง เช่น Private IP Address 192.168.1.21 port 80 จะถูกแปลงเป็น 201.108.10.30 port 80 เสมอ เป็นต้น