เจาะทะลุ Router หอพัก! เปิดพอร์ตด้วยตัวเองผ่าน UPnP บน Linux (ไม่ต้องง้อ Admin)

Linux Terminal Configuration

เมื่ออยากเปิดเซิร์ฟเวอร์เล่นเกม... แต่เข้าตั้งค่า Router ไม่ได้?

ถ้าคุณเคยเปิดเซิร์ฟเวอร์เกมเล่นกับเพื่อน หรือเป็นสายโหลด BitTorrent น่าจะรู้ดีว่าชีวิตจะง่ายขึ้นเยอะถ้าระบบอินเทอร์เน็ตที่บ้านรองรับ UPnP (Universal Plug and Play) มันเป็นเทคโนโลยีเก๋าๆ ตั้งแต่ปี 1999 ที่ยอมให้โปรแกรมในคอมพิวเตอร์ของเรา สั่งให้ Router "เปิดประตู (Port)" รับข้อมูลจากภายนอกเข้ามาในเครือข่ายบ้านเราได้เอง

ปกติเราก็แค่ล็อกอินเข้าหน้าเว็บของ Router แล้วไปตั้งค่า Port Forwarding เอาเองใช่ไหมครับ? แต่ถ้าเกิดเราไปอยู่ในสถานการณ์ที่ไม่มีรหัสผ่านเข้า Router ล่ะ? (เช่น เน็ตหอพัก หรือเน็ตแชร์) คำถามคือ ในเมื่อโปรแกรมมันสั่งเปิดพอร์ตเองได้ ทำไมเราจะเขียนสคริปต์สั่งมันเปิดบ้างไม่ได้ล่ะ?

รู้จัก UPnP: ฟีเจอร์ลับที่เกมเมอร์และสายโหลดบิตคุ้นเคย

UPnP มีหน้าที่หลายอย่าง แต่ส่วนที่เราสนใจคือการทำ NAT Traversal อธิบายง่ายๆ คือ Router จะประกาศตัวว่าเป็น Internet Gateway Device เพื่อให้โปรแกรมอื่นๆ ในวงแลนรู้ว่า ฉันคือทางออกไปสู่อินเทอร์เน็ตนะ ใครอยากเปิดพอร์ตมาบอกได้

เมื่อโปรแกรมติดต่อกับ Router มันจะได้รับไฟล์ XML ที่อธิบายคุณสมบัติของ Router ตัวนั้นๆ กลับมา เพื่อใช้ในการตกลงกันว่าจะเปิดพอร์ตไหน

สิ่งที่ต้องระวัง (Caveats) ก่อนเริ่มเจาะระบบ

ก่อนจะลุย มีสองเรื่องที่ต้องทำความเข้าใจก่อนครับ:

  • Firewall ต้องเป็นใจ: การที่ UPnP สั่งเปิดพอร์ตได้ ไม่ได้แปลว่า Firewall ของ Router จะยอมปล่อยผ่านเสมอไป ขึ้นอยู่กับความฉลาด (หรือบั๊ก) ของเฟิร์มแวร์ Router ล้วนๆ
  • Router ต้องเปิดฟีเจอร์ UPnP ไว้: ถ้าแอดมินเครือข่ายเขาปิดฟีเจอร์นี้ไว้ตั้งแต่แรก วิธีนี้ก็จบข่าวครับ โชคดีที่เคสนี้ Router ที่ผู้เขียนใช้งานดันเปิด UPnP ทิ้งไว้พอดี

นอกจากนี้ UPnP ยังแอบมีชื่อเสียเรื่องความปลอดภัยมานานแล้ว เพราะมันเคยมียุคที่แฮกเกอร์ใช้เครื่องมือสั่งเปิดพอร์ตจากนอกเน็ตเวิร์กเข้ามาได้เลย ดังนั้นถ้าคุณเป็นเจ้าของ Router เอง การเปิด Port Forwarding แบบแมนนวลจะปลอดภัยที่สุดครับ

Step-by-Step: ลงมือเปิดพอร์ตด้วยคำสั่ง upnpc

บน Linux มีเครื่องมือหลายตัวที่จัดการเรื่องนี้ได้ แต่ตัวที่ใช้ง่ายและไม่ต้องขอสิทธิ์ Root คือไลบรารี miniupnpd ซึ่งมาพร้อมกับเครื่องมือที่ชื่อว่า upnpc

  • พิมพ์ upnpc -l เพื่อดูรายการพอร์ตที่ Router เปิดไว้ด้วย UPnP ทั้งหมด (ถ้ากดดูแล้วตอนจบมี Error Code 713 เด้งขึ้นมา ไม่ต้องตกใจครับ เป็นเรื่องปกติของโปรแกรมนี้)
  • พิมพ์ upnpc -a เพื่อเพิ่มพอร์ต
  • พิมพ์ upnpc -d เพื่อลบพอร์ต

ทดสอบเจาะทะลุกำแพงด้วย socat และ telnet

สมมติว่า IP ภายในเครื่องเราคือ 192.168.1.133 และเราอยากเปิดพอร์ต 8022 ให้คนนอกเข้ามาได้ผ่านพอร์ต 8023 เป็นเวลา 1 ชั่วโมง (3600 วินาที) ลองมาดูโค้ดกันครับ!

View more (ดูคำสั่ง Linux / Copy Code)

หมายเหตุ: ผู้เขียนพบว่า Router บางตัว (ที่ไม่ได้รันเซิร์ฟเวอร์ UPnP ด้วยสิทธิ์ Root) จะไม่อนุญาตให้เปิดพอร์ตที่ต่ำกว่า 1024 ได้ จึงต้องใช้พอร์ตเลขสูงๆ แทน


# 1. สั่งเปิดพอร์ตผ่าน UPnP
# -e คือการตั้งชื่อให้พอร์ตนี้ (ในที่นี้ตั้งว่า HADTEST)
# เปิดพอร์ตภายนอก 8023 ชี้มาที่ IP เครื่องเราพอร์ต 8022 (TCP) เป็นเวลา 3600 วินาที
upnpc -e HADTEST -a 192.168.1.133 8022 8023 tcp 3600

# 2. จำลองเซิร์ฟเวอร์ง่ายๆ บนเครื่องเราด้วย socat
# เพื่อรอรับการเชื่อมต่อที่พอร์ต 8022
socat readline TCP-LISTEN:8022,reuseaddr,fork

# 3. ให้เพื่อน (ที่อยู่นอกเครือข่าย) ลองเชื่อมต่อเข้ามาผ่าน Telnet
# โดยใช้ IP สาธารณะ (Public IP) ของเรา เช่น 198.37.197.21 และพอร์ต 8023
telnet 198.37.197.21 8023

ถ้าทุกอย่างถูกต้อง สิ่งที่เพื่อนคุณพิมพ์ใน Telnet จะต้องมาโผล่ที่หน้าจอ socat ของคุณ ถือเป็นการเจาะทะลุ Firewall ได้สำเร็จ! (ออกจาก Telnet ด้วยการกด Control-] แล้วพิมพ์ q)

แม้ว่าวิธีนี้อาจจะมีข้อจำกัดบ้าง เช่น เปิดพอร์ต SSH ต่ำๆ ไม่ได้ (ต้องเลี่ยงไปใช้พอร์ตสูงๆ แทน) แต่อย่างน้อย Linux ก็มีทางออกให้เราเสมอในยามคับขันครับ

อัปเดตทริคสาย Tech และ Networking

ชอบแก้ปัญหาเน็ตเวิร์ก หรือกำลังหาไอเทมเจ๋งๆ ไปปรับแต่งระบบที่บ้าน? เข้ามาดูบทความและพูดคุยกับเพื่อนๆ สาย Tech ได้เลย!

คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา
อ้างอิงจาก (References):

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี