ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home วิธีเปลี่ยน SSH Port บน Linux Server

วิธีเปลี่ยน SSH Port บน Linux Server

SSH ใช้ Port 22 เป็นค่าเริ่มต้น บอตที่สแกนอินเทอร์เน็ตจึงยิงไปที่ Port นี้ตลอดเวลา การย้าย SSH ไปใช้ Port อื่นไม่ได้ทำให้เซิร์ฟเวอร์ปลอดภัยขึ้นโดยตรง แต่ช่วยลดปริมาณการเดารหัสผ่านอัตโนมัติและทำให้ Log สะอาดขึ้นมาก ควรใช้ร่วมกับ SSH Key และ Fail2ban ไม่ใช่ใช้แทน

การเปลี่ยน Port เป็นงานที่เสี่ยงต่อการล็อกตัวเองออกจากเซิร์ฟเวอร์ หากลืมเปิด Firewall หรือ SELinux คู่มือนี้จึงใช้วิธีเปิด Port ใหม่ควบคู่กับ Port 22 ก่อน ทดสอบจนแน่ใจ แล้วจึงปิด Port 22 ภายหลัง

สิ่งที่ต้องเตรียม

  • สิทธิ์ 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 เสมอ

Ubuntu ที่ใช้ UFW

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

ไม่มีข้อความแสดงออกมาแปลว่าถูกต้อง

ขั้นตอนที่ 4: รีสตาร์ต SSH

การเปลี่ยน Port ต้องรีสตาร์ต ไม่ใช่แค่ reload และแต่ละ Distro ต่างกันดังนี้

Ubuntu 24.04

Ubuntu 24.04 ใช้ Socket Activation โดย ssh.socket เป็นตัวรับการเชื่อมต่อ และสร้างรายการ Port จาก sshd_config ตอนโหลด systemd จึงต้องสั่ง daemon-reload ก่อน

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

หากเซิร์ฟเวอร์ของคุณปิด Socket Activation ไว้และใช้ ssh.service โดยตรง ให้ใช้คำสั่งเดียวกับ Ubuntu 22.04

Ubuntu 22.04

sudo systemctl restart ssh

AlmaLinux / Rocky Linux

sudo systemctl restart sshd

ตรวจสอบผลลัพธ์

ดูว่ามีการฟังที่ Port ใหม่จริง

sudo ss -tlnp | grep -E ':22 |:2222 '

ควรเห็นทั้ง 0.0.0.0:22 และ 0.0.0.0:2222 (และแบบ IPv6 [::]) จากนั้นเปิดหน้าต่างใหม่บนเครื่องของคุณแล้วเชื่อมต่อด้วย Port ใหม่

ssh -p 2222 [email protected]

ถ้าเข้าได้ ให้กลับไปแก้ไฟล์ /etc/ssh/sshd_config ลบบรรทัด Port 22 ออก เหลือเพียง Port 2222 แล้วรัน sudo sshd -t และรีสตาร์ตตามขั้นตอนที่ 4 อีกครั้ง ทดสอบเข้าด้วย Port 2222 จากหน้าต่างใหม่อีกรอบ เมื่อสำเร็จจึงค่อยปิด Port 22 ที่ Firewall

# Ubuntu (UFW)
sudo ufw delete allow OpenSSH
sudo ufw delete allow 22/tcp

# AlmaLinux / Rocky (firewalld)
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

คำสั่ง ufw delete จะแจ้งว่าไม่พบกฎถ้ากฎนั้นไม่เคยถูกเพิ่มไว้ ซึ่งไม่เป็นปัญหา ใช้ sudo ufw status ดูว่าเหลือกฎใดบ้าง

ตั้งค่าเครื่องของคุณให้จำ Port

เพื่อไม่ต้องพิมพ์ -p 2222 ทุกครั้ง เพิ่มข้อความนี้ในไฟล์ ~/.ssh/config บนเครื่องของคุณ

Host myserver
    HostName 203.0.113.10
    User user
    Port 2222

จากนั้นเชื่อมต่อด้วย ssh myserver ได้เลย สำหรับ scp ใช้ตัวเลือก -P 2222 (P ตัวใหญ่) และ rsync ใช้ -e "ssh -p 2222"

ปัญหาที่พบบ่อย

Connection timed out

Port ใหม่ถูก Firewall ปิดอยู่ ทั้งบนเซิร์ฟเวอร์หรือ Firewall ภายนอก เข้าด้วย Port 22 หรือ Console แล้วตรวจกฎตามขั้นตอนที่ 1

Connection refused

SSH ไม่ได้ฟังที่ Port นั้น บน AlmaLinux/Rocky มักเกิดจากลืมเพิ่ม SELinux ดู Log ด้วย sudo journalctl -u sshd -n 30 หากพบ error: Bind to port 2222 on 0.0.0.0 failed: Permission denied ให้ทำขั้นตอนที่ 2 บน Ubuntu 24.04 ถ้า ss ยังเห็นแค่ Port 22 แปลว่ายังไม่ได้สั่ง systemctl daemon-reload ก่อนรีสตาร์ต ssh.socket

Fail2ban ไม่แบน IP ที่โจมตี Port ใหม่

Jail sshd ยังบล็อกเฉพาะ Port 22 ให้แก้ port = 2222 ในส่วน [sshd] ของ /etc/fail2ban/jail.local แล้วรัน sudo systemctl restart fail2ban

หากทำตามแล้วยังเชื่อมต่อไม่ได้ หรือถูกล็อกออกจากเซิร์ฟเวอร์ ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security