伺服器維運

SSH 連接埠號是多少?預設 22、檢視與修改步驟及改連接埠的影響

SSH 連接埠預設是 TCP 22,由服務端配置檔案 sshd_config 裡的 Port 決定,可以改成任何空閒連接埠,也可以同時監聽多個。改連接埠能讓日誌裡的自動掃描明顯減少,但擋不住全連接埠掃描;動手前要把防火牆、SELinux、安全組、堡壘機和指令碼里的連接埠一起改掉。

作者 頂聯產品團隊發布於 7 分鐘閱讀

SSH 連接埠號是多少?預設是 TCP 22。22 是 IANA 為 SSH 登記的連接埠,OpenSSH 服務端 sshd 不做任何配置時就在 22 上監聽,客戶端不指定連接埠時也去連 22。這個值由伺服器上 /etc/ssh/sshd_config(或 /etc/ssh/sshd_config.d/ 下的檔案)裡的 Port 決定,可以改成任何沒被佔用的連接埠,也可以同時監聽多個連接埠。改連接埠本身只要改一行,麻煩在它牽動的東西:系統防火牆、SELinux、雲安全組、機房 ACL、堡壘機裡登記的資產、各種指令碼和監控,漏掉一處就可能把自己關在門外或者讓自動化任務失敗。下面依次講連接埠怎麼選、怎麼檢視當前連接埠、按發行版修改的完整步驟、改完不生效的排查,以及改連接埠到底帶來什麼影響。

SSH 連接埠號可以改成多少

SSH 只用 TCP,不需要放行 UDP 22。客戶端一側使用的是系統隨機分配的臨時連接埠,防火牆規則只需按伺服器的監聽連接埠來寫。新連接埠從下面幾個範圍裡挑:

範圍 名稱 用作 SSH 連接埠
0–1023 系統連接埠 只有 root 能監聽,大多已有固定用途(80、443、873 等),除 22 外一般不佔用
1024–49151 註冊連接埠 常見選擇,挑一個本機和所在網路裡都沒有用到的
32768–60999 Linux 預設的臨時連接埠範圍 避開:本機對外發起連線時會隨機佔用這段連接埠,sshd 重啟時可能正好撞上而繫結失敗
49152–65535 動態連接埠 同樣容易和臨時連接埠衝突

幾條選擇上的經驗:

  • 先確認空閒。 ss -tlnp 'sport = :22022' 沒有輸出,說明本機沒有程式在用;grep -w 22022 /etc/services 看它是否是某個知名服務的連接埠。本機臨時連接埠的實際範圍用 sysctl net.ipv4.ip_local_port_range 檢視。
  • 不要挑“像 SSH”的連接埠。 2222、22222 這類連接埠常被掃描器順帶探測,降噪效果會打折扣。
  • 1024 以下的空閒連接埠也是一種選擇。 有人主張這樣選,理由是普通使用者無法監聽 1024 以下的連接埠,即使 sshd 意外停止,也沒有非 root 程序能冒充它佔住這個連接埠。兩種做法都可以,關鍵是全機房統一,並記錄在資產資訊裡。

怎麼檢視伺服器當前的 SSH 連接埠

“配置裡寫的連接埠”和“實際在監聽的連接埠”可能不一致,比如改了配置還沒重啟。所以按這個順序看:

# 1. 實際在監聽的連接埠(需要 root 才能看到程序名)
ss -tlnp | grep -E 'sshd|systemd'

# 2. sshd 按當前配置檔案算出來的連接埠和監聽位址
sshd -T | grep -E '^(port|listenaddress) '

# 3. 是哪個檔案裡寫的
grep -rn -i '^\s*Port' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

# 4. Ubuntu 新版本:是否由 ssh.socket 代為監聽
systemctl is-active ssh.socket && systemctl show ssh.socket -p Listen

第 1 條的輸出類似下面這樣,0.0.0.0:22022 和 [::]:22022 分別是 IPv4 和 IPv6 的監聽,最後一列是程序:

LISTEN 0      128          0.0.0.0:22022      0.0.0.0:*    users:(("sshd",pid=812,fd=3))
LISTEN 0      128             [::]:22022         [::]:*    users:(("sshd",pid=812,fd=4))

程序顯示為 systemd 而不是 sshd,說明這台機器用的是 socket 啟用,監聽連接埠由 ssh.socket 決定,第 4 條能看到它的 Listen 設定。

從外部確認連接埠,在你的電腦上執行 nc -v 伺服器IP 22022,連上後應立刻返回一行以 SSH-2.0-OpenSSH_ 開頭的版本資訊。完全不知道連接埠被改成了多少、又登入不進去,可以對自己的伺服器做一次全連接埠掃描 nmap -Pn -p- --open -sV 伺服器IP,-sV 會識別出哪個連接埠上跑的是 ssh,65535 個連接埠掃完需要一些時間。客戶端這邊,ssh -G web01 | grep '^port ' 顯示按 ~/.ssh/config 計算後,連 web01 時實際會用的連接埠。Windows Server 自帶的 OpenSSH 服務端,配置檔案在 C:\ProgramData\ssh\sshd_config,同樣是 Port 一項。

修改 SSH 連接埠的完整步驟

先確認你的系統屬於哪一類,幾個關鍵差別都在這張表裡:

發行版 服務名 誰負責監聽連接埠 常用防火牆 SELinux
RHEL、Rocky、AlmaLinux 8/9,CentOS 7 sshd sshd firewalld 預設開啟,非 22 連接埠要登記
Debian,Ubuntu 22.04 及更早 ssh sshd ufw、nftables 或 iptables 預設沒有
Ubuntu 24.04 及以後 ssh ssh.socket(systemd 代為監聽) ufw 預設沒有

同一發行版也可能被改過,以 systemctl is-active ssh.socket 的實際結果為準。動手之前準備好退路:保留當前的 SSH 視窗不關,並確認能開啟伺服器的 BMC 控制檯或雲平台的 VNC 控制檯。下面以把連接埠從 22 改為 22022 為例。

  1. 先在外層放行新連接埠。 雲伺服器在安全組裡加入方向 TCP 22022,源位址儘量填辦公出口或堡壘機的 IP;機房伺服器上游有 ACL 的,提前提交變更。這一層不放行,後面全部做對也連不上。
  2. 讓 sshd 同時監聽新舊兩個連接埠。 Port 和大多數 sshd 選項不同,不遵循“先讀到的為準”,寫幾行就監聽幾個連接埠。主配置開頭有 Include /etc/ssh/sshd_config.d/*.conf 的系統,新建一個檔案:
# /etc/ssh/sshd_config.d/10-port.conf
Port 22
Port 22022

寫之前用 grep -n '^\s*Port' /etc/ssh/sshd_config 看一眼主配置:裡面已經有一行沒註釋的 Port 22,就不要在新檔案裡重複寫 22。沒有 Include 行的系統(CentOS 7、RHEL 8),直接在主配置裡把 #Port 22 改成 Port 22,下面再加一行 Port 22022。注意改的是服務端的 sshd_config,不是客戶端的 ssh_config。

  1. SELinux 登記新連接埠(RHEL 系):
getenforce                                   # Enforcing 時必須做這一步
semanage port -l | grep -w ssh_port_t        # 預設只有 tcp 22
semanage port -a -t ssh_port_t -p tcp 22022

semanage 由 policycoreutils-python-utils 軟體包提供(CentOS 7 上是 policycoreutils-python)。如果提示 Port tcp/22022 already defined,說明這個連接埠已經登記給了別的型別,把 -a 換成 -m 改為 ssh_port_t,或者換一個連接埠。

  1. 系統防火牆放行新連接埠。 firewalld 有兩種寫法,第二種直接修改 ssh 服務的定義,所有引用了 ssh 服務的區域會一起生效:
# firewalld 寫法一:單獨放行連接埠
firewall-cmd --permanent --add-port=22022/tcp
# firewalld 寫法二:給 ssh 服務加上新連接埠
firewall-cmd --permanent --service=ssh --add-port=22022/tcp
firewall-cmd --reload && firewall-cmd --list-all

# ufw
ufw allow 22022/tcp

# 直接用 iptables 的系統,加完要儲存,否則重啟後丟失
iptables -I INPUT -p tcp --dport 22022 -j ACCEPT
service iptables save          # RHEL 系的 iptables-services
netfilter-persistent save      # Debian 系的 iptables-persistent
  1. 檢查語法並重啟。
sshd -t                                                    # 沒有輸出就是語法正確
systemctl restart sshd                                     # RHEL 系
systemctl restart ssh                                      # Debian,Ubuntu 22.04 及更早
systemctl daemon-reload && systemctl restart ssh.socket    # Ubuntu 24.04 及以後
ss -tlnp | grep -E ':22 |:22022 '                          # 兩個連接埠都應在監聽
  1. 另開視窗測試新連接埠。 ssh -p 22022 維運帳號@伺服器IP,登入後再執行一次 sudo -i,確認提權也正常。
  2. 關閉舊連接埠。 刪掉配置裡的 Port 22,再重啟一次;撤掉 22 的放行規則:firewalld 用寫法一的執行 firewall-cmd --permanent --remove-service=ssh,用寫法二的執行 firewall-cmd --permanent --service=ssh --remove-port=22/tcp,然後 reload;ufw 用 ufw status numbered 找到 22 的規則編號後 ufw delete 編號;安全組裡刪掉 22。最後從外部確認:nmap -Pn -p 22,22022 伺服器IP 顯示 22 為 closed 或 filtered、22022 為 open,才算改完。

改完不生效或連不上:對照排查

現象 原因 處理
日誌裡有 Bind to port 22022 on 0.0.0.0 failed: Permission denied. SELinux 沒有登記新連接埠 執行第 3 步後重啟 sshd;用 journalctl -u sshd -n 20 檢視日誌
sshd -T 顯示新連接埠,ss 裡仍然只有 22 改完沒有重啟;或者是 socket 模式,只重啟了 ssh 服務 按上表的發行版執行對應的重啟命令
sshd -T 裡看不到新連接埠 改錯了檔案,比如改成了客戶端配置 /etc/ssh/ssh_config;或寫在了沒有被 Include 的目錄裡 確認改的是 sshd_config,主配置裡有對應的 Include 行
伺服器上監聽正常,外部連線 Connection timed out 安全組、機房 ACL 沒放行;或者你所在的辦公網只允許存取外部的常用連接埠 逐層核對;用手機熱點連一次對比
Connection refused 連接埠上沒有 sshd 在監聽,或者 iptables 用 REJECT 拒絕了連線 在伺服器上核對 ss 的輸出和防火牆規則
No route to host,但 ping 得通 firewalld 對沒有放行的連接埠預設回覆“管理禁止”,客戶端顯示為這條錯誤 回到第 4 步,用 firewall-cmd --list-all 確認新連接埠在列表裡
啟動失敗,日誌提示 Address already in use 新連接埠已被別的程式佔用 用 ss -tlnp 'sport = :22022' 找出佔用者,換一個連接埠
連線新連接埠時又要求確認主機指紋 known_hosts 對非 22 連接埠按 [位址]:連接埠 單獨記錄 核對指紋與原來一致後確認即可

改 SSH 連接埠有什麼影響

改連接埠不是越改越安全,它的作用是降噪,代價是所有相關的地方都要同步。逐項看:

方面 影響 要做什麼
自動掃描 只盯 22 連接埠的批次指令碼掃不到,登入日誌裡的失敗記錄通常會明顯減少,排查真正的異常更容易 —
定向攻擊 全連接埠掃描很快就能找到新連接埠,連上後返回的 SSH-2.0- 版本資訊直接表明這是 SSH 安全仍然靠金鑰登入、禁用密碼和限定來源
安全組與 ACL 每一層都要加新連接埠;雲平台常見的預設安全組範本放行的是 22 改連接埠前先放行,確認後刪除 22
堡壘機 堡壘機裡登記的資產是“IP 加連接埠”,連接埠不同步,經堡壘機發起的會話會連線失敗;會話審計本身不受影響 先在堡壘機裡新增新連接埠的資產或修改連接埠,驗證後再關舊連接埠
自動化與客戶端 ssh、scp、rsync、git、Ansible、監控、備份指令碼里的連接埠都要跟著改 見下表
伺服器主動連出去 不受影響,改的只是本機 sshd 的監聽連接埠 —
帶外控制檯 BMC 控制檯、雲平台 VNC 不經過 sshd,不受影響 留作改錯時的退路

需要同步連接埠的常見位置:

工具 指定連接埠的寫法
ssh ssh -p 22022 user@host
~/.ssh/config 在對應的 Host 下寫 Port 22022,之後 ssh、scp、rsync、git 用別名連線都會自動帶上
scp、sftp 大寫的 -P 22022
rsync rsync -av -e 'ssh -p 22022' 源 目標
git ssh://git@host:22022/ops/app.git;git@host:路徑 這種簡寫不能帶連接埠
Ansible 清單裡寫 ansible_port=22022
Zabbix 簡單檢查 net.tcp.service[ssh,,22022]
fail2ban jail 裡寫 port = 22022,過渡期寫成 22,22022

關於堡壘機多說一句:如果伺服器的 SSH 已經只對堡壘機的位址開放,外人連 TCP 握手都完成不了,這時再改連接埠幾乎沒有額外收益,反而增加了資產資訊出錯的機會。這種架構下保持 22、把來源限定死,比改連接埠更實在;真正暴露在公網上的是堡壘機自己的入口,該加固的是它。

在機房裡怎麼統一管理

機房裡的伺服器多了,SSH 連接埠最怕“每台不一樣、只有當初改的人知道”。定一個統一的連接埠,寫進裝機後的初始化指令碼,再把連接埠和管理位址一起記在資產資訊裡,後來的人才不會對著一台機器逐個連接埠去試。

改錯了也不要慌,帶外控制檯就是為這種時候準備的。Toplink DCIM 的 IPMI 遠端管理在瀏覽器裡開啟 VNC 控制檯,走的是 BMC 通道,不依賴 sshd 的連接埠和系統防火牆,登入後把配置改回來即可;透過它發起的 SSH 會話全程錄影,並記錄命令級日誌,經這些會話改過 sshd_config 的操作可以追溯。租用伺服器的客戶自己改連接埠把自己鎖在外面時,可以在客戶自助端開啟 VNC 控制檯自行修復,不必等工單。

常見問題

能不能讓 SSH 只在內網位址上監聽?

能。在 sshd_config 裡寫 ListenAddress 10.10.0.5,sshd 就只在這個位址上監聽,公網位址上連連接埠都不存在;寫成 ListenAddress 10.10.0.5:22022 還能指定連接埠。這個位址必須在 sshd 啟動時已經配在網路卡上,否則 sshd 會因為繫結不到位址而啟動失敗。

改了 SSH 連接埠,SFTP 和 SCP 的連接埠也會變嗎?

會。SFTP、SCP 都跑在 SSH 連線裡,和登入共用 sshd 的連接埠,沒有單獨的連接埠。FileZilla、WinSCP 等圖形工具要在站點設定裡把連接埠改成新值,協議仍然選 SFTP。

改 SSH 連接埠會斷開當前的連線嗎?

一般不會。已經建立的會話由各自的子程序維持,重啟或過載 sshd 主程序不影響它們。但改連接埠時仍應保留當前視窗,另開一個視窗測試新連接埠,確認能登入之後再關閉舊連接埠。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88