คำตอบสั้น ๆ: ย้าย SSH จาก Port 22 ไปยัง Port ใหม่โดยเปิด Firewall และ SELinux ก่อน ทดสอบคู่กับ Port เดิม แล้วจึงปิด Port 22 เพื่อไม่ให้ถูกล็อกออกจากเซิร์ฟเวอร์
คู่มือนี้อธิบาย SSH Port ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
SSH ใช้ Port 22 เป็นค่าเริ่มต้น บอตที่สแกนอินเทอร์เน็ตจึงยิงไปที่ Port นี้ตลอดเวลา การย้าย SSH ไปใช้ Port อื่นไม่ได้ทำให้เซิร์ฟเวอร์ปลอดภัยขึ้นโดยตรง แต่ช่วยลดปริมาณการเดารหัสผ่านอัตโนมัติและทำให้ Log สะอาดขึ้นมาก ควรใช้ร่วมกับ SSH Key และ Fail2ban ไม่ใช่ใช้แทน
การเปลี่ยน Port เป็นงานที่เสี่ยงต่อการล็อกตัวเองออกจากเซิร์ฟเวอร์ หากลืมเปิด Firewall หรือ SELinux คู่มือนี้จึงใช้วิธีเปิด Port ใหม่ควบคู่กับ Port 22 ก่อน ทดสอบจนแน่ใจ แล้วจึงปิด Port 22 ภายหลัง
สิ่งที่ต้องเตรียม (SSH Port)
- สิทธิ์ root หรือผู้ใช้ที่ใช้
sudoได้ บน Ubuntu 22.04/24.04 หรือ AlmaLinux/Rocky Linux 8-9 - เลข Port ใหม่ที่ยังไม่มีโปรแกรมใช้ แนะนำช่วง 1024-65535 เช่น 2222 หรือ 49222 ตรวจได้ด้วย
sudo ss -tlnp | grep :2222ถ้าไม่มีผลลัพธ์แปลว่าว่าง - ช่องทางสำรองกรณีเข้า SSH ไม่ได้ เช่น Console Server ผ่าน Web UI
หมายเหตุ: เปิด SSH Session ปัจจุบันค้างไว้ตลอดทุกขั้นตอน และทดสอบด้วยหน้าต่างใหม่เสมอ Session ที่เชื่อมต่ออยู่แล้วจะไม่หลุดเมื่อเปลี่ยนค่า จึงใช้แก้กลับได้หากผิดพลาด
ตัวอย่างในคู่มือนี้ใช้ Port 2222 ให้เปลี่ยนเป็นเลขที่คุณเลือก
ขั้นตอนที่ 1: เปิด Port ใหม่ที่ Firewall ก่อน (SSH Port)
ทำขั้นตอนนี้ก่อนแก้ SSH เสมอ
Ubuntu ที่ใช้ UFW (SSH Port)
sudo ufw allow 2222/tcp
sudo ufw status
ต้องเห็นบรรทัด 2222/tcp ALLOW Anywhere หาก UFW ยังไม่ได้เปิดใช้งาน (Status: inactive) ข้ามขั้นตอนนี้ได้
AlmaLinux / Rocky Linux ที่ใช้ firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
ผลลัพธ์ควรมี 2222/tcp
หากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ตนั้นเพิ่มด้วย
ขั้นตอนที่ 2: อนุญาต Port ใหม่ใน SELinux (เฉพาะ AlmaLinux / Rocky)
SELinux อนุญาตให้ SSH ฟังได้เฉพาะ Port ที่ติดป้าย ssh_port_t ถ้าไม่เพิ่ม Port ใหม่ SSH จะเริ่มทำงานไม่ได้ ตรวจสถานะ SELinux ก่อน
getenforce
ถ้าได้ Enforcing หรือ Permissive ให้เพิ่ม Port ดังนี้ (คำสั่ง semanage อยู่ในแพ็กเกจ policycoreutils-python-utils)
sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t
ผลลัพธ์บรรทัดสุดท้ายควรเป็น ssh_port_t tcp 2222, 22 Ubuntu ไม่ได้ใช้ SELinux ข้ามขั้นตอนนี้ได้
ขั้นตอนที่ 3: เพิ่ม Port ใหม่ในการตั้งค่า SSH
ตรวจก่อนว่ามีการกำหนด Port ไว้ที่ใดบ้าง
sudo grep -ri '^ *port' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
ถ้าไม่มีผลลัพธ์ แปลว่าใช้ค่าเริ่มต้น 22 อยู่ เปิดไฟล์หลัก
sudo nano /etc/ssh/sshd_config
หาบรรทัด #Port 22 แล้วแก้เป็นสองบรรทัด เพื่อให้ SSH ฟังทั้งสอง Port ในช่วงทดสอบ
Port 22
Port 2222
ถ้าคำสั่ง grep ด้านบนพบ Port ในไฟล์ใต้ sshd_config.d/ ให้แก้ที่ไฟล์นั้นแทน เพื่อไม่ให้ค่าซ้ำซ้อนกัน ตรวจไวยากรณ์
sudo sshd -t
ไม่มีข้อความแสดงออกมาแปลว่าถูกต้อง