SSH 連接埠號是多少?預設 22、檢視與修改步驟及改連接埠的影響
SSH 連接埠預設是 TCP 22,由服務端配置檔案 sshd_config 裡的 Port 決定,可以改成任何空閒連接埠,也可以同時監聽多個。改連接埠能讓日誌裡的自動掃描明顯減少,但擋不住全連接埠掃描;動手前要把防火牆、SELinux、安全組、堡壘機和指令碼里的連接埠一起改掉。
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 為例。
- 先在外層放行新連接埠。 雲伺服器在安全組裡加入方向 TCP 22022,源位址儘量填辦公出口或堡壘機的 IP;機房伺服器上游有 ACL 的,提前提交變更。這一層不放行,後面全部做對也連不上。
- 讓 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。
- 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,或者換一個連接埠。
- 系統防火牆放行新連接埠。 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
- 檢查語法並重啟。
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 ' # 兩個連接埠都應在監聽
- 另開視窗測試新連接埠。
ssh -p 22022 維運帳號@伺服器IP,登入後再執行一次sudo -i,確認提權也正常。 - 關閉舊連接埠。 刪掉配置裡的
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 主程序不影響它們。但改連接埠時仍應保留當前視窗,另開一個視窗測試新連接埠,確認能登入之後再關閉舊連接埠。