SSD Nodes Learn
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24

Port คืออะไร และบริการใน Linux ทำงานอย่างไร

ทำความเข้าใจหน้าที่ของ Port ในการคัดแยก Traffic เข้าสู่บริการต่างๆ พร้อมวิธีการใช้คำสั่ง ss เพื่อตรวจสอบสถานะการ Listening ของ Service ใน Linux

ความหมายที่แท้จริงของ port

Port คือหมายเลขที่ช่วยให้เซิร์ฟเวอร์หนึ่งเครื่องสามารถรันหลายบริการพร้อมกันได้โดยที่ข้อมูลไม่ปะปนกัน VPS ของคุณมี IP address เพียงหนึ่งเดียว แต่สามารถรัน web server, SSH server และ database ไปพร้อมกันได้ เมื่อมี packet ส่งมาถึง ระบบปฏิบัติการจำเป็นต้องทราบว่า packet นั้นเป็นของบริการใด หมายเลข port คือคำตอบ ข้อมูลเว็บจะส่งไปยัง port 443 และ SSH จะส่งไปยัง port 22 โดย IP address ทำหน้าที่นำทาง packet มายังเซิร์ฟเวอร์ ส่วน port ทำหน้าที่นำทาง packet ไปยังโปรแกรมที่ถูกต้องบนเซิร์ฟเวอร์นั้น

Port คือหมายเลขขนาด 16-bit: 16 bits ให้ค่าตั้งแต่ 0 ถึง 65535 โดยหมายเลข 0 ถูกสำรองไว้ ดังนั้นในทางปฏิบัติ port จะเริ่มตั้งแต่ 1 ถึง 65535 Port ที่ต่ำกว่า 1024 คือ "well-known" ports ซึ่งต้องใช้สิทธิ์ root ในการเปิดใช้งาน จึงเป็นเหตุผลที่บริการมาตรฐานทำงานบน port เหล่านี้ เช่น 22 สำหรับ SSH, 80 สำหรับ HTTP, 443 สำหรับ HTTPS และ 53 สำหรับ DNS ส่วนหมายเลขที่สูงกว่า 1024 สามารถใช้กับโปรแกรมทั่วไปได้

Port มีสองประเภทคือ TCP และ UDP โดยหมายเลข port ในโปรโตคอลหนึ่งจะแยกจากหมายเลขเดียวกันในอีกโปรโตคอลหนึ่ง TCP เป็นโปรโตคอลแบบ connection-based ที่บริการส่วนใหญ่ใช้งาน เช่น SSH, HTTP และ database ส่วน UDP เป็นแบบ connectionless ซึ่งใช้สำหรับบริการอย่าง DNS และ VPN บางประเภท เมื่อคุณตั้งค่า firewall คุณมักจะต้องระบุประเภทโปรโตคอล เช่น 22/tcp

การ listening หมายถึงโปรแกรมกำลังรอรับข้อมูลบน port

โปรแกรมที่ต้องการรับการเชื่อมต่อจะสั่งให้ kernel ทำการ "listen" บน port เมื่อถึงจุดนั้น port จะถูกเปิดบนเครื่อง และโปรแกรมจะตอบสนองต่อข้อมูลใดๆ ที่ส่งมายัง port นั้น ทั้งนี้ขึ้นอยู่กับการตั้งค่าของ firewall หาก port ไม่มีโปรแกรมใดกำลัง listen อยู่ ระบบจะปฏิเสธการเชื่อมต่อ ดังนั้นคำถามแรกในการตรวจสอบความปลอดภัยคือ: มีอะไรกำลัง listen อยู่ และที่ไหน

คำสั่งสำหรับตรวจสอบเรื่องนี้คือ ss:

sudo ss -tlnp

flag ต่างๆ มีความหมายดังนี้: TCP (t), listening sockets เท่านั้น (l), แสดงหมายเลข port (n ทำให้เห็นเป็น 22 แทนที่จะเป็น ssh) และแสดง process ที่เป็นเจ้าของ (p) ผลลัพธ์ตัวอย่าง:

State   Recv-Q  Local Address:Port   Process
LISTEN  0       0.0.0.0:22           sshd
LISTEN  0       127.0.0.1:5432       postgres
LISTEN  0       [::]:80              nginx

คอลัมน์ Process จะบอกว่าโปรแกรมใดเป็นเจ้าของแต่ละ port ซึ่งช่วยให้คุณตรวจสอบได้ว่ามีโปรแกรมใดที่คุณไม่ได้ตั้งใจเปิดทิ้งไว้หรือไม่

คอลัมน์ Local Address คือส่วนที่สำคัญที่สุด

ควรตรวจสอบ address ที่อยู่หน้าแต่ละ port อย่างละเอียด เพราะเป็นตัวกำหนดว่าใครสามารถเข้าถึงบริการนั้นได้บ้าง โดยจะมี 3 กรณีที่คุณจะพบได้บ่อย

0.0.0.0:22 หมายถึง "listen บนทุก IPv4 address ที่เครื่องนี้มี" รวมถึง public IP ด้วย บริการนี้จะสามารถเข้าถึงได้จากอินเทอร์เน็ตผ่าน IPv4 หาก firewall อนุญาต

[::]:80 หมายถึงสิ่งเดียวกันสำหรับ IPv6 คือ listen บนทุก IPv6 address รวมถึง public address ด้วย โปรแกรมจำนวนมากจะ bind ค่านี้เป็นค่าเริ่มต้น และบน Linux socket แบบ :: มักจะรองรับ IPv4 ด้วย

127.0.0.1:5432 หมายถึง "listen บน loopback เท่านั้น" 127.0.0.1 คือ address ที่เครื่องใช้สื่อสารกับตัวเอง และไม่สามารถ routable จากที่อื่นได้ บริการที่ bind ไว้ที่นี่จะเข้าถึงได้จากเซิร์ฟเวอร์เครื่องเดียวกันเท่านั้น ไม่สามารถเข้าถึงจากอินเทอร์เน็ตได้ไม่ว่า firewall จะตั้งค่าอย่างไร ดังนั้นบรรทัด Postgres ด้านบนจึงมีความปลอดภัยโดยโครงสร้าง

กฎในการใช้งานจริงคือ: database, cache หรือ admin panel ที่ใช้งานเฉพาะแอปพลิเคชันของคุณเอง ควร bind กับ 127.0.0.1 ไม่ใช่ 0.0.0.0 หากบริการไม่เคย listen บน public address ก็จะไม่มีช่องทางให้ผู้โจมตีเข้าถึงได้

การ listening ไม่เหมือนกับการเข้าถึงได้ (reachable)

ข้อแตกต่างอีกประการหนึ่งจะช่วยลดความสับสน การที่ port ถูกเปิดบนเครื่อง (หมายถึงมีโปรแกรมกำลัง listen อยู่) นั้นต่างจากการที่ port นั้นสามารถเข้าถึงได้จากภายนอก (หมายถึง firewall อนุญาต) ทั้งสองเงื่อนไขต้องเป็นจริงเพื่อให้ client จากระยะไกลสามารถเชื่อมต่อได้

ดังนั้นจึงมีการควบคุมสองระดับ: คุณกำหนดสิ่งที่ listen โดยการตั้งค่า bind address ของแต่ละบริการ และคุณกำหนดสิ่งที่โลกภายนอกเข้าถึงได้ด้วย firewall เซิร์ฟเวอร์ที่มีการจัดการที่ดีจะใช้ทั้งสองอย่าง คือบริการจะ bind เฉพาะจุดที่จำเป็น และ firewall จะปฏิเสธทุกอย่างที่คุณไม่ได้อนุญาตไว้อย่างชัดเจน การตรวจสอบว่ามีอะไรกำลัง listen อยู่ด้วย ss คือขั้นตอนแรก ส่วนการตัดสินใจว่า firewall จะอนุญาตอะไรบ้างคือขั้นตอนที่สอง ซึ่งอธิบายไว้ใน firewalls 101 with UFW

มีจุดที่มักทำให้เกิดปัญหา คือ IPv4 และ IPv6 นั้นแยกจากกัน หาก firewall ครอบคลุมเฉพาะ IPv4 จะทำให้บริการบน [::] เปิดกว้างบน IPv6 ปัญหานี้มีรายละเอียดเฉพาะในบทความ: the IPv6 firewall trap

FAQ

ฉันจะดูได้อย่างไรว่ามี port ใดเปิดอยู่บน Linux server ของฉันบ้าง?

รัน sudo ss -tlnp สำหรับ TCP หรือ sudo ss -ulnp สำหรับ UDP ซึ่งจะแสดงรายการ listening socket ทั้งหมด, port, local address ที่ bind ไว้ และ process ที่เป็นเจ้าของ ให้ดูที่คอลัมน์ Local Address: หากเป็น 0.0.0.0 หรือ [::] หมายถึงบริการนั้นเปิดสู่เครือข่าย แต่ถ้าเป็น 127.0.0.1 หมายถึงบริการนั้น listen เฉพาะบนเครื่องเท่านั้น

0.0.0.0 กับ 127.0.0.1 ต่างกันอย่างไร?

0.0.0.0 หมายถึง "listen บนทุก IPv4 address" รวมถึง public IP ด้วย ดังนั้นบริการจึงสามารถเข้าถึงได้จากเครือข่าย ส่วน 127.0.0.1 คือ loopback ซึ่งเป็น address ที่เครื่องใช้สื่อสารกับตัวเองและไม่สามารถ routable จากที่อื่นได้ ดังนั้นบริการที่ bind ไว้ที่นี่จึงเข้าถึงได้เฉพาะภายในเครื่องเท่านั้น ควร bind บริการภายในกับ 127.0.0.1 เพื่อไม่ให้ถูกเปิดสู่ภายนอก

ฉันจำเป็นต้องเปิด port ใน firewall เพื่อให้บริการทำงานได้หรือไม่?

จำเป็นเฉพาะบริการที่ต้องเข้าถึงจากเครื่องอื่นเท่านั้น บริการที่ bind กับ 127.0.0.1 ไม่จำเป็นต้องมีกฎ firewall เพราะไม่มีสิ่งภายนอกใดเข้าถึงได้ ส่วนบริการบน 0.0.0.0 หรือ [::] จำเป็นต้องมีกฎ firewall เพื่ออนุญาต traffic และควรถูกปฏิเสธ (deny) ไว้เป็นค่าเริ่มต้นจนกว่าคุณจะเพิ่มกฎอนุญาต

TCP port กับ UDP port ต่างกันอย่างไร?

TCP เป็นแบบ connection-based และใช้โดยบริการส่วนใหญ่ เช่น SSH, web servers และ databases ส่วน UDP เป็นแบบ connectionless และใช้โดย DNS และ VPN บางประเภท หมายเลขเดียวกันใน TCP และ UDP ถือเป็นคนละ port กัน ดังนั้น 53/tcp และ 53/udp จึงเป็นคนละอย่างกัน เมื่อคุณเขียนกฎ firewall คุณต้องระบุโปรโตคอล เช่น 22/tcp