วิธีตรวจสอบพอร์ตเปิดบน Ubuntu: คำสั่งสำคัญและเคล็ดลับด้านความปลอดภัย

目次

1. บทนำ

ในการจัดการเครือข่ายและการดำเนินงานเซิร์ฟเวอร์ การเข้าใจสถานะของพอร์ตอย่างแม่นยำเป็นสิ่งสำคัญ โดยเฉพาะเมื่อใช้ Ubuntu การตรวจสอบว่าพอร์ตใดเปิดอยู่และกระบวนการใดกำลังใช้พอร์ตเหล่านั้นช่วยเสริมความปลอดภัยและทำให้การแก้ไขปัญหาเป็นไปได้เร็วขึ้น

บทความนี้อธิบายคำสั่งและเครื่องมือพื้นฐานที่ใช้ตรวจสอบพอร์ตบน Ubuntu โดยให้ขั้นตอนที่เป็นประโยชน์และเข้าใจง่ายสำหรับผู้เริ่มต้นและผู้ใช้ระดับกลาง ดังนั้นอย่าลืมอ่านจนจบ

2. พอร์ตคืออะไร?

2.1 แนวคิดพื้นฐานของพอร์ต

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

ตัวอย่างเช่น เว็บเซิร์ฟเวอร์ใช้พอร์ต 80 สำหรับการรับส่งข้อมูล HTTP หากเซิร์ฟเวอร์เดียวกันอนุญาตการเข้าถึง SSH จะใช้พอร์ต 22 เนื่องจากบริการต่าง ๆ แยกแยะด้วยหมายเลขพอร์ต การตรวจสอบสถานะพอร์ตจึงเป็นสิ่งสำคัญในการจัดการเครือข่าย

2.2 ประเภทและบทบาทของพอร์ต

พอร์ตจะแบ่งออกเป็นสามกลุ่มหลัก:

  1. Well-Known Ports (0–1023)
  • Globally standardized port numbers assigned to commonly used services. wp:list /wp:list

    • ตัวอย่าง:
    • HTTP: 80
    • HTTPS: 443
    • SSH: 22
  1. Registered Ports (1024–49151)
  • Ports used by specific applications or companies. wp:list /wp:list

    • ตัวอย่าง:
    • MySQL: 3306
    • PostgreSQL: 5432
  1. Dynamic Ports (49152–65535)
  • พอร์ตที่ใช้ชั่วคราวโดยแอปพลิเคชันทั่วไป มักใช้ในการสื่อสารจากฝั่งไคลเอนต์

การเข้าใจการจัดประเภทนี้ทำให้เราสามารถระบุได้ง่ายว่าหมายเลขพอร์ตแต่ละตัวใช้เพื่ออะไร

3. วิธีตรวจสอบพอร์ตบน Ubuntu

Ubuntu มีเครื่องมือหลายอย่างสำหรับตรวจสอบสถานะพอร์ต ส่วนนี้จะอธิบายสี่คำสั่งที่เป็นประโยชน์เป็นพิเศษ

3.1 การใช้คำสั่ง ss

คำสั่ง ss เป็นเครื่องมือจัดการเครือข่ายที่ทรงพลังสำหรับระบบ Linux ทำงานเร็วและให้ข้อมูลการเชื่อมต่ออย่างละเอียด

คำสั่งพื้นฐาน:

sudo ss -ltn

รายละเอียดตัวเลือก:

  • -l : แสดงพอร์ตที่อยู่ในสถานะ LISTEN เท่านั้น
  • -t : แสดงเฉพาะโปรโตคอล TCP
  • -n : แสดงที่อยู่และหมายเลขพอร์ตในรูปแบบตัวเลข

ตัวอย่างผลลัพธ์:

State       Recv-Q Send-Q      Local Address:Port        Peer Address:Port  
LISTEN      0      128              0.0.0.0:22               0.0.0.0:*

3.2 การใช้คำสั่ง netstat

คำสั่ง netstat ถูกใช้เป็นเครื่องมือจัดการเครือข่ายมานานหลายปี แม้ว่าจะค่อย ๆ ถูกแทนที่ด้วย ss แต่ยังคงมีอยู่ในระบบหลายเครื่อง

คำสั่งพื้นฐาน:

sudo netstat -ltn

ตัวอย่างผลลัพธ์:

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

3.3 การใช้คำสั่ง lsof

lsof มีประโยชน์ในการระบุกระบวนการที่กำลังใช้พอร์ตเฉพาะ

ตรวจสอบพอร์ตเฉพาะ:

sudo lsof -i :80

ตัวอย่างผลลัพธ์:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1234  www    4u   IPv4  12345 0t0      TCP *:http (LISTEN)

3.4 การใช้คำสั่ง nmap

nmap เป็นเครื่องมือสแกนเครือข่ายที่มักใช้สำหรับการวินิจฉัยด้านความปลอดภัย

สแกน localhost:

sudo nmap localhost

ตัวอย่างผลลัพธ์:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-12-21 18:00 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http

ประเด็นสำคัญ:

  • พอร์ตที่เปิดและบริการที่เกี่ยวข้องจะถูกแสดง
  • สามารถสแกนเซิร์ฟเวอร์ภายนอกได้ แต่ต้องได้รับอนุญาตที่เหมาะสม

4. การตรวจสอบการตั้งค่าไฟร์วอลล์

บน Ubuntu ไฟร์วอลล์มักถูกใช้เพื่อเพิ่มความปลอดภัย ufw (Uncomplicated Firewall) โดยเฉพาะเป็นเครื่องมือการจัดการที่เรียบง่ายแต่ทรงพลังซึ่งใช้กันอย่างแพร่หลายเพื่อวัตถุประสงค์นี้ ส่วนนี้อธิบายวิธีตรวจสอบสถานะของพอร์ตและแก้ไขการกำหนดค่าโดยใช้ ufw.

4.1 ตรวจสอบสถานะของ ufw

คำสั่งเพื่อตรวจสอบสถานะไฟร์วอลล์:

sudo ufw status verbose

ตัวอย่างผลลัพธ์:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere

คำอธิบาย:

  • Status: active — แสดงว่าไฟร์วอลล์ถูกเปิดใช้งาน.
  • Logging: on — การบันทึกถูกเปิดใช้งานและกิจกรรมของไฟร์วอลล์กำลังถูกบันทึก.
  • Default: deny (incoming), allow (outgoing) — การเชื่อมต่อขาเข้าถูกปฏิเสธโดยค่าเริ่มต้น ส่วนการเชื่อมต่อขาออกจะได้รับอนุญาต.
  • ALLOW — แสดงพอร์ตหรือบริการที่ได้รับอนุญาตโดยชัดเจน (เช่น SSH และ HTTP).

เคล็ดลับ:
หากไฟร์วอลล์ถูกปิด (Status: inactive) ให้เปิดใช้งานด้วยคำสั่งต่อไปนี้:

sudo ufw enable

4.2 การอนุญาตหรือบล็อกพอร์ต

คำสั่งเพื่ออนุญาตพอร์ต:

sudo ufw allow 22/tcp

คำอธิบาย:

  • อนุญาตการเชื่อมต่อ TCP บนพอร์ต 22 (SSH).

คำสั่งเพื่อบล็อกพอร์ต:

sudo ufw deny 80/tcp

คำอธิบาย:

  • บล็อกการเข้าถึงพอร์ต 80 (HTTP).

ตัวอย่าง: อนุญาตการเข้าถึงจากที่อยู่ IP เฉพาะเท่านั้น

sudo ufw allow from 192.168.1.100 to any port 22 proto tcp

คำอธิบาย:

  • อนุญาตการเชื่อมต่อ SSH จากที่อยู่ IP 192.168.1.100 เท่านั้น.

4.3 การรีเซ็ตและตรวจสอบการตั้งค่า

เพื่อรีเซ็ตการกำหนดค่าไฟร์วอลล์และเริ่มต้นใหม่ ให้รันคำสั่งต่อไปนี้:

sudo ufw reset

คำสั่งนี้จะลบกฎทั้งหมดและคืนค่าไฟร์วอลล์ไปสู่สถานะเริ่มต้น หากคุณรีเซ็ตการตั้งค่า อย่าลืมตรวจสอบและกำหนดกฎที่จำเป็นใหม่.

5. ตัวอย่างการปฏิบัติ: ตรวจสอบสถานะของพอร์ตเฉพาะ

ส่วนนี้ให้ตัวอย่างการปฏิบัติโดยใช้ SSH (พอร์ต 22) เพื่อแสดงวิธีตรวจสอบสถานะของพอร์ต.

5.1 ตรวจสอบสถานะพอร์ต

คำสั่งตัวอย่าง:

sudo ss -ltn | grep ':22'

ผลลัพธ์ตัวอย่าง:

LISTEN      0      128        0.0.0.0:22            0.0.0.0:*

ประเด็นสำคัญ:

  • หาก LISTEN ปรากฏในผลลัพธ์ พอร์ตจะเปิดและรอการเชื่อมต่อ.
  • 0.0.0.0 แสดงว่าการเชื่อมต่อได้รับการยอมรับจากทุกที่อยู่ IP.

5.2 ตรวจสอบกระบวนการที่ทำงานอยู่

คำสั่งตัวอย่าง:

sudo lsof -i :22

ผลลัพธ์ตัวอย่าง:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1234  root   3u   IPv4  56789 0t0      TCP *:ssh (LISTEN)

ประเด็นสำคัญ:

  • sshd คือกระบวนการดีมอนที่จัดการการเชื่อมต่อ SSH.
  • คุณสามารถหยุดหรือรีสตาร์ทกระบวนการโดยใช้รหัสกระบวนการ (PID) ของมัน.

ตัวอย่างการหยุดกระบวนการ:

sudo kill 1234

5.3 ตัวอย่างการแก้ไขปัญหา

ปัญหา: วิธีการจัดการเมื่อพอร์ตถูกปิดหรือไม่สามารถเข้าถึงได้.

ขั้นตอน:

  1. ตรวจสอบการตั้งค่าไฟร์วอลล์.
    sudo ufw status verbose
    
  1. หากพอร์ตถูกบล็อก ให้อนุญาต.
    sudo ufw allow 22/tcp
    
  1. ตรวจสอบสถานะของบริการและรีสตาร์ทหากจำเป็น.
    sudo systemctl restart ssh
    

6. การจัดการพอร์ตและความปลอดภัย

การจัดการพอร์ตเชื่อมโยงโดยตรงกับความปลอดภัยของเครือข่าย ส่วนนี้อธิบายประเด็นสำคัญเกี่ยวกับการเปิดและปิดพอร์ตและการรักษาการกำหนดค่าที่ปลอดภัย.

6.1 ปิดพอร์ตที่ไม่ได้ใช้

พอร์ตที่ไม่ได้ใช้งานควรปิดเพื่อ ลดความเสี่ยงของการเข้าถึงโดยไม่ได้รับอนุญาต.

ตัวอย่าง: ปิดพอร์ต 80

sudo ufw deny 80/tcp

6.2 มาตรการป้องกันการสแกนพอร์ต

การสแกนพอร์ตเป็นเทคนิคที่ผู้โจมตีใช้เพื่อระบุช่องโหว่ในระบบ วิธีต่อไปนี้ช่วยปกป้องเซิร์ฟเวอร์ของคุณ:

  1. เสริมกฎไฟร์วอลล์:
    sudo ufw default deny incoming
    
  1. ตรวจสอบบันทึก:
    sudo tail -f /var/log/ufw.log
    
  1. ติดตั้งเครื่องมือการตรวจจับการสแกนพอร์ต: ใช้เครื่องมือเช่น fail2ban เพื่อบล็อกการเข้าถึงที่ไม่ได้รับอนุญาตโดยอัตโนมัติ.

7. สรุป

บทความนี้อธิบายวิธีและคำสั่งเฉพาะเพื่อเช็คพอร์ตบน Ubuntu รวมถึงการจัดการไฟร์วอลล์ด้วย ufw และมาตรการความปลอดภัยเชิงปฏิบัติ.

7.1 ประเด็นสำคัญ

  • แนวคิดพื้นฐานและประเภทของพอร์ต: พอร์ตทำหน้าที่เป็นจุดเข้าการสื่อสารและถูกจัดประเภทเป็นพอร์ตที่รู้จักกันดี (well‑known), พอร์ตที่ลงทะเบียน (registered) และพอร์ตแบบไดนามิก (dynamic)
  • วิธีการตรวจสอบพอร์ต: คำสั่งเช่น ss, netstat, lsof และ nmap ให้ข้อมูลเชิงลึกเกี่ยวกับสถานะของพอร์ตและกระบวนการ
  • การจัดการไฟร์วอลล์: ด้วย ufw คุณสามารถอนุญาตหรือบล็อกพอร์ตเพื่อเพิ่มความปลอดภัยของระบบ
  • ความสำคัญของความปลอดภัย: การปิดพอร์ตที่ไม่ได้ใช้, การตรวจสอบบันทึก, และการใช้เครื่องมือความปลอดภัยช่วยรักษาสภาพแวดล้อมเครือข่ายให้ปลอดภัย

7.2 การประยุกต์ใช้งานจริง

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

คำถามที่พบบ่อย: คำถามทั่วไปเกี่ยวกับการตรวจสอบพอร์ตบน Ubuntu

Q1. ควรทำอย่างไรหากพอร์ตไม่เปิดบน Ubuntu?

A:
ลองทำตามขั้นตอนต่อไปนี้:

  1. ตรวจสอบการตั้งค่าไฟร์วอลล์:
    sudo ufw status verbose
    

หากพอร์ตถูกบล็อก ให้เปิดโดยใช้คำสั่งต่อไปนี้:

sudo ufw allow [portnumber]/tcp
  1. ตรวจสอบว่าบริการกำลังทำงานอยู่หรือไม่:
    sudo systemctl status [servicename]
    

ตัวอย่างสำหรับ SSH:
sudo systemctl status ssh

รีสตาร์ทหากจำเป็น:

sudo systemctl restart [servicename]
  1. ยืนยันว่าพอร์ตที่กำหนดถูกต้อง: ตรวจสอบไฟล์กำหนดค่าบริการ เช่น /etc/ssh/sshd_config สำหรับ SSH เพื่อยืนยันหมายเลขพอร์ตที่เหมาะสม.

Q2. ความแตกต่างระหว่าง ss กับ netstat คืออะไร?

A:
ทั้งสองเครื่องมือใช้ตรวจสอบการเชื่อมต่อเครือข่าย แต่มีความแตกต่างดังนี้:

  • ss: เครื่องมือที่แนะนำสำหรับระบบ Linux สมัยใหม่ เร็วกว่าและให้ข้อมูลละเอียดมากขึ้น ตัวอย่าง: sudo ss -ltn
  • netstat: เครื่องมือเก่า ที่ค่อย ๆ ถูกยกเลิกการใช้งาน แต่ยังคงมีอยู่ในระบบรุ่นเก่า ตัวอย่าง: sudo netstat -ltn

สำหรับระบบใหม่ ๆ แนะนำให้ใช้ ss.

Q3. จะตรวจจับการสแกนพอร์ตได้อย่างไร?

A:
ใช้วิธีต่อไปนี้:

  1. ตรวจสอบบันทึกไฟร์วอลล์:
    sudo tail -f /var/log/ufw.log
    

มองหาที่อยู่ IP ที่น่าสงสัยหรือการพยายามเข้าถึงซ้ำ ๆ.

  1. ติดตั้งเครื่องมือ IDS/IPS:
  • ใช้เครื่องมือเช่น fail2ban หรือ Snort เพื่อบล็อกการเข้าถึงที่ไม่ได้รับอนุญาตโดยอัตโนมัติ.
  1. สแกนเซิร์ฟเวอร์ของคุณเองด้วย nmap:
    sudo nmap localhost
    

ระบุพอร์ตที่เปิดโดยไม่จำเป็นและปิดพอร์ตเหล่านั้น.

Q4. จะตรวจสอบว่ากระบวนการใดใช้พอร์ตเฉพาะได้อย่างไร?

A:
ใช้คำสั่ง lsof:

sudo lsof -i :[portnumber]

ตัวอย่างสำหรับพอร์ต 80:

sudo lsof -i :80

ผลลัพธ์ตัวอย่าง:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1234  www    4u   IPv4  12345 0t0      TCP *:http (LISTEN)

Q5. จะอนุญาตให้เฉพาะ IP address หนึ่งเท่านั้นผ่าน ufw ได้อย่างไร?

A:
ใช้คำสั่งต่อไปนี้:

sudo ufw allow from [IP address] to any port [portnumber] proto tcp

ตัวอย่าง: อนุญาตการเข้าถึง SSH จาก 192.168.1.100:

sudo ufw allow from 192.168.1.100 to any port 22 proto tcp

Q6. จะเปลี่ยนหมายเลขพอร์ตได้อย่างไร?

A:
แก้ไขไฟล์กำหนดค่าของบริการที่เกี่ยวข้อง ตัวอย่างสำหรับ SSH:

  1. แก้ไขไฟล์กำหนดค่า:
    sudo nano /etc/ssh/sshd_config
    
  1. ค้นหา directive Port แล้วตั้งหมายเลขพอร์ตใหม่:
    Port 2222
    
  1. รีสตาร์ทบริการ SSH:
    sudo systemctl restart ssh
    
  1. อนุญาตพอร์ตใหม่ผ่านไฟร์วอลล์:
    sudo ufw allow 2222/tcp
    

Q7. สามารถอนุญาตหลายพอร์ตพร้อมกันได้หรือไม่?

A:
ได้, คุณสามารถอนุญาตหลายพอร์ตพร้อมกันโดยใช้วิธีต่อไปนี้:

  1. การอนุญาตช่วงพอร์ต:
    sudo ufw allow 1000:2000/tcp
    

คำอธิบาย: อนุญาตพอร์ตตั้งแต่ 1000 ถึง 2000.

  1. การอนุญาตพอร์ตแบบแยกแต่ละพอร์ต:
    sudo ufw allow 22/tcp
    sudo ufw allow 80/tcp