Linux VPS 修改 SSH 連接埠與 root 密碼教學(安全不斷線)

11 分鐘閱讀 4 次閱讀 0
本文目錄

把 SSH 從 22 埠移走雖然擋不住有心的攻擊者,卻能讓日誌裡大部分自動掃描消失;而任何新伺服器的第一件事,就是換一組新的 root 密碼。本文說明如何在 Linux VPS 修改 SSH 連接埠與 root 密碼且不斷線:修改 sshd_config、在 Rocky Linux / AlmaLinux 為新連接埠設定 SELinux 標籤、開放防火牆、處理 Ubuntu 22.10 與 24.04 的 ssh.socket,以及出錯時透過 VNC 主控台回復。適用於 JUSTG 雲端伺服器與獨立伺服器上的 Debian、Ubuntu、CentOS 7 與 Rocky/AlmaLinux 8、9。

步驟 1:修改 root 密碼

請趁現在還能正常連線時先完成。日後若需要用 VNC 主控台救援,輸入的也是這組 root 密碼,建議存放在密碼管理工具中,長度至少 16 個隨機字元。

# Generate a random 24-character password (optional)
openssl rand -base64 18
# Set the new root password (type it twice)
passwd root

若要修改其他帳號的密碼,改執行 passwd 使用者名稱 即可。

步驟 2:選擇新的 SSH 連接埠

在 1024 到 49151 之間挑一個未使用的連接埠,例如 2222 或 22022,並確認沒有其他服務佔用。以下範例使用 2222。

# Nothing should be listening on the new port yet
ss -tlnp | grep ':2222' || echo "port 2222 is free"

步驟 3:在 sshd_config 加入新的 SSH 連接埠

先備份,再讓 sshd 同時監聽舊連接埠與新連接埠。變更期間保留 22 埠,後續步驟即使出錯也不會被鎖在外面。

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
nano /etc/ssh/sshd_config
# Replace the "#Port 22" line with BOTH ports during the change:
Port 22
Port 2222

步驟 4:在 SELinux 允許新的 SSH 連接埠(Rocky Linux / AlmaLinux / CentOS)

Red Hat 系列系統的 SELinux 只允許 sshd 綁定標記為 ssh_port_t 的連接埠。少了這一步,sshd 會因「Permission denied」綁定錯誤而無法在新連接埠啟動。Debian 與 Ubuntu 預設未啟用 SELinux,可略過。

# Rocky Linux / AlmaLinux 8, 9
dnf install -y policycoreutils-python-utils
# CentOS 7
yum install -y policycoreutils-python

semanage port -a -t ssh_port_t -p tcp 2222
semanage port -l | grep ssh_port_t

步驟 5:在防火牆開放新的 SSH 連接埠

# Debian / Ubuntu with UFW
ufw allow 2222/tcp
ufw status

# CentOS / Rocky / AlmaLinux with firewalld
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
firewall-cmd --list-ports
若您使用自訂的 iptables 或 nftables 腳本而非 UFW / firewalld,請在其中加入 TCP 2222 的允許規則。另外,JUSTG 每台雲端伺服器都免費提供 IPv6,UFW 與 firewalld 會自動把規則套用到 IPv6。

步驟 6:重新啟動 SSH(含 Ubuntu 22.10+ / 24.04 的 ssh.socket)

先檢查語法再重新啟動服務,目前的連線不會中斷。

sshd -t                         # syntax check, no output = OK

# Debian, Ubuntu 22.04 and older
systemctl restart ssh
# CentOS / Rocky / AlmaLinux
systemctl restart sshd

# Confirm sshd is listening on both ports
ss -tlnp | grep sshd

Ubuntu 22.10 之後改用 systemd socket activation 啟動 SSH:監聽埠由 ssh.socket 掌管,只重新啟動 ssh 並不會改變連接埠。請依版本選擇做法:

# Is socket activation in use?
systemctl is-active ssh.socket

# Ubuntu 24.04 (and 23.10+): the Port lines in sshd_config are read
# by a systemd generator, so reload and restart the socket
systemctl daemon-reload
systemctl restart ssh.socket

# Ubuntu 22.10 / 23.04: add the ports to a socket override instead
mkdir -p /etc/systemd/system/ssh.socket.d
cat > /etc/systemd/system/ssh.socket.d/listen.conf <<'EOF'
[Socket]
ListenStream=
ListenStream=22
ListenStream=2222
EOF
systemctl daemon-reload
systemctl restart ssh.socket
# Alternative on any of these Ubuntu releases: go back to the classic service
systemctl disable --now ssh.socket
systemctl enable --now ssh.service

步驟 7:用第二個連線測試新的 SSH 連接埠

保持原本的連線不要關閉。從新的終端機以新連接埠連線,確認登入成功後再繼續。
# From a SECOND terminal on your computer
ssh -p 2222 [email protected]

# Optional ~/.ssh/config entry so you can just type "ssh myvps"
Host myvps
    HostName 203.0.113.40
    Port 2222
    User root

出現「Connection timed out」通常是防火牆仍在阻擋;「Connection refused」代表 sshd 沒有監聽該連接埠,請檢查 SELinux、ssh.socket 與 ss -tlnp。

步驟 8:關閉 22 埠

新連接埠可正常使用後,從 SSH 設定與防火牆移除舊連接埠,再重新啟動一次,並從新終端機再次測試。

# Remove "Port 22" from sshd_config (and from listen.conf on Ubuntu 22.10/23.04)
sed -i '/^Port 22$/d' /etc/ssh/sshd_config
sshd -t && systemctl restart sshd      # use "ssh" on Debian/Ubuntu
# Ubuntu 22.10+ with ssh.socket: systemctl daemon-reload && systemctl restart ssh.socket

# UFW
ufw delete allow 22/tcp
ufw delete allow OpenSSH
# firewalld
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload

步驟 9:透過 VNC 主控台回復設定

萬一被鎖在外面,VNC 主控台不經過網路與 SSH,仍然可以使用。請登入 JUSTG 客戶中心 → 我的產品與服務 → 選擇 VPS → 管理/控制面板開啟主控台;如找不到可提交工單。以步驟 1 設定的 root 密碼登入後還原:

# In the VNC console, logged in as root
cp /etc/ssh/sshd_config.bak.* /etc/ssh/sshd_config   # or re-add "Port 22"
ufw allow 22/tcp                       # Debian / Ubuntu
firewall-cmd --add-service=ssh         # CentOS / Rocky / AlmaLinux (runtime)
systemctl restart ssh || systemctl restart sshd

常見問題

修改 SSH 連接埠就能讓伺服器安全嗎?

它能減少機器人造成的日誌雜訊,但本身不算真正的防護。請搭配 SSH 金鑰登入、停用密碼登入與防火牆,才是完整的安全強化。

為什麼改了 sshd_config,Ubuntu 24.04 仍在監聽 22 埠?

因為連接埠由 ssh.socket 掌控。請執行 systemctl daemon-reload 再執行 systemctl restart ssh.socket,或依步驟 6 停用 socket 改用 ssh.service。

Rocky Linux 改了連接埠後 sshd 起不來,怎麼辦?

幾乎都是 SELinux 造成。執行 journalctl -u sshd -n 20,若看到綁定錯誤,用 semanage port -a -t ssh_port_t -p tcp 2222 加入連接埠後重新啟動。

如修改 SSH 連接埠後仍無法連線,請至 https://www.justg.com/submitticket.php 提交工單,JUSTG 技術支援團隊會協助您處理。

这篇文章有帮助吗?