嘗試使用 SSH 連線至 EC2 執行個體時,收到「連線遭拒」或「連線逾時」錯誤。如何解決此問題?
嘗試使用 SSH 連線至 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體時,收到「連線遭拒」或「連線逾時」錯誤。
簡短描述
錯誤訊息:"ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection timed out"。此錯誤訊息來自 SSH 用戶端。該錯誤表示伺服器沒有回應用戶端,且用戶端程式放棄 (逾時)。以下是導致此錯誤的常見原因:
- 安全群組或網路 ACL 不允許存取。
- 執行個體的作業系統上有防火牆。
- 用戶端與伺服器之間有防火牆。
- 主機不存在。
錯誤訊息:"ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection refused"。此訊息來自遠端主機。以下是導致此錯誤的常見原因:
- 主機已到達執行個體,但 SSH 連接埠上沒有接聽的服務。
- 防火牆已封鎖,並設定為拒絕套件,而非捨棄套件。
解決方法
「連線逾時」錯誤
對於「連線逾時」錯誤,請檢查下列事項:
- 執行個體的 IP 地址或主機名稱正確。
- 執行個體正在通過運作狀態檢查。
- 執行個體的安全群組允許 TCP 連接埠 22 上的傳入流量。
- 執行個體子網路的網路 ACL 允許 TCP 連接埠 22 上的傳入流量,並允許傳出流量的暫時性連接埠。
- 執行個體子網路的路由表已正確設定,可提供 EC2 執行個體與 SSH 用戶端之間的連線。
- 沒有防火牆封鎖 SSH 用戶端與 EC2 執行個體之間的連線。
- 執行個體的 TCP 包裝函式 (在 Red Hat 網站上) 不會封鎖 SSH。
**注意:**最後兩個驗證步驟需要執行個體的作業系統層級存取權。
「連線遭拒」錯誤
對於「連線遭拒」錯誤,請驗證下列事項:
- 執行個體上沒有防火牆拒絕 SSH 連線。
- SSH 常駐程式 (sshd) 正在連接埠 22 上執行並接聽。
**注意:**這兩個驗證步驟需要執行個體的作業系統層級存取權。
如果執行個體通過這兩種運作狀態檢查,請將下列四種方法之一與您的組態搭配使用
- 方法 1: 使用適用於 Linux 的 EC2 序列主控台。
- 方法 2: 使用 AWS Systems Manager Session Manager。
- 方法 3: 執行 AWSSupport-TroubleshootSSH 自動化執行手冊。
- 方法 4: 使用使用者資料指令碼。
方法 1: 使用適用於 Linux 的 EC2 序列主控台
如果已設定,您可以使用適用於 Linux 的 EC2 序列主控台對支援的 Nito 型執行個體類型的作業系統層級問題進行疑難排解。序列主控台可協助您對開機問題、網路組態及 SSH 組態問題進行疑難排解。使用 Amazon EC2 主控台或 AWS Command Line Interface (AWS CLI) 可存取序列主控台。
使用序列主控台之前,先在帳戶層級授予主控台存取權。然後,建立 AWS Identity and Access Management (IAM) 政策,將存取權授予 IAM 使用者。
**注意:**每個使用序列主控台的執行個體都必須包含至少一個具有 sudo 存取權的以密碼為基礎的 Linux 使用者。
如需設定適用於 Linux 的 EC2 序列主控台的詳細資訊,請參閱設定 EC2 序列主控台的存取權。如果沒有設定登入密碼的 Linux 帳戶,您必須執行 ssm-user 來重設具有 sudo 存取權限的帳戶的密碼。如需有關執行 ssm-user 命令的詳細資訊,請參閱 在 Linux 和 macOS 上管理 ssm-user sudo 帳戶許可。
設定後,使用設定密碼的 Linux 使用者透過 EC2 序列主控台連線至 EC2 執行個體。
接下來,執行下列命令。這些命令會驗證 SSH 連線不會被作業系統防火牆或 TCP 包裝函式封鎖。這些命令也會驗證 sshd 服務是否正在連接埠 22 上執行並接聽。
1. 如果您已設定 iptables 規則,則執行下列命令以在 iptables 中新增規則以接受預設連接埠 22 上的所有 SSH 連線:
$ sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
由於最佳實務是使用安全群組而非作業系統型防火牆,因此可以完全停用防火牆。若要停用作業系統型防火牆,請視您的作業系統而定,使用下列其中一組命令:
重要:下列命令會排清所有主要的 iptables 規則。它們還會新增一個允許傳入 SSH 連線的規則。此外,它們將主要鏈結的預設政策變更為接受,以便排清 iptables 規則不會影響執行個體網路連線。由於這些命令會排清所有主要 iptables,因此它們也會排清任何現有規則。
使用 UFW 的發行版 (Ubuntu、Debian)
$ sudo iptables -F $ sudo iptables -P INPUT ACCEPT $ sudo ufw disable
使用 firewalld 的發行版 (Red Hat、CentOS)
$ sudo iptables -F $ sudo iptables -P INPUT ACCEPT $ sudo systemctl disable firewalld
**注意:**重新取得執行個體的存取權之後,請檢閱防火牆組態 (UFW、firewalld、iptables)。
2. 驗證 SSH 是否正在執行,並驗證 SSH TCP 連接埠 (22) 是否處於接聽狀態:
$ sudo systemctl restart sshd $ sudo ss -tpln | grep -iE '22|ssh' LISTEN 0 128 *:22 *:* users:(("sshd",pid=1901,fd=3)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1901,fd=4))
**注意:**如果您的系統沒有 ss 命令,可以將舊版 netstat 命令與上述範例中顯示的相同語法搭配使用。
3. 確保 TCP 包裝函式未封鎖 SSH 連線:
$ if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\ then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi
4. 接下來,使用 SSH 連線至執行個體。
5. 如果不再需要 EC2 序列主控台工作階段,請中斷其連線。
方法 2: 使用 AWS Systems Manager Session Manager
注意:若要使用此方法,執行個體必須是 SSM 受管執行個體,且其 SSM 代理程式 ping 狀態必須為線上。如需 Session Manager 和完整的先決條件清單,請參閱設定 Session Manager。
若要確認 SSH 連線未被防火牆或 TCP 包裝函式封鎖,且 sshd 服務正在連接埠 22 上執行並接聽:
1. 開啟 AWS Systems Manager。
2. 使用 Session Manager 啟動執行個體的工作階段。
3. 執行「方法 1: 使用適用於 Linux 的 EC2 序列主控台」中的步驟 1-4。
4. 如果不再需要 Session Manager 工作階段,請關閉它。
方法 3: 執行 AWSSupport-TroubleshootSSH 執行手冊
AWSSupport-TroubleshootSSH 自動化執行手冊會在執行個體上安裝適用於 Linux 的 Amazon EC2Rescue 工具。此工具會檢查並嘗試修正阻止透過 SSH 遠端連線 Linux 主機的問題。
若要執行 AWSSupport-TroubleshootSSH 執行手冊,請執行以下操作:
1. 開啟 AWSSupport-TroubleshootSSH 頁面。
2. 選取 執行此自動化 (主控台)。
如需詳細資訊,請參閱我在嘗試使用 SSH 連線至 EC2 執行個體時收到錯誤。如何使用 AWSSupport-TroubleshootSSH 自動化工作流程對 SSH 連線問題進行疑難排解?
方法 4: 使用使用者資料指令碼
如果所述的方法都不適合您的環境,則使用 EC2 使用者資料指令碼。EC2 使用者資料指令碼會關閉作業系統層級防火牆和 TCP 包裝函式,然後重新啟動 sshd 服務。
重要:
- 此程序需要停止並啟動 EC2 執行個體。如果執行個體具有儲存在執行個體儲存體磁碟區上的任何資料,該資料會在停止執行個體後刪除。
- 如果執行個體屬於 Amazon EC2 Auto Scaling 群組,則終止執行個體也可能會停止 Auto Scaling 群組內的執行個體。
- 如果執行個體由使用 AWS Auto Scaling 的服務啟動,則終止執行個體也可能會停止 Auto Scaling 群組內的執行個體。
- 執行個體終止取決於 Auto Scaling 群組的執行個體縮減保護設定。如果執行個體屬於 Auto Scaling 群組,請先暫時從 Auto Scaling 群組中移除該執行個體,然後再開始解決方法步驟。
- 停止和啟動執行個體會變更執行個體的公有 IP 地址。將外部流量路由至執行個體時,最佳實務是使用 Elastic IP 地址,而非公有 IP 地址。
請依照以下步驟設定執行個體的使用者資料:
1. 開啟 Amazon EC2 主控台。
2. 從導覽窗格中選擇執行個體,然後選取您打算連線的執行個體。
3. 停止執行個體。
4. 選擇動作、執行個體設定、編輯使用者資料。
5. 將下列使用者資料指令碼複製到編輯使用者資料對話方塊中,然後選擇儲存。
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [scripts-user, always] --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash iptables -P INPUT ACCEPT iptables -F systemctl restart sshd.service || service sshd restart if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\ then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi --//
6. 使用 SSH 連線至執行個體。
7. 上述使用者資料指令碼設定為在每次重新啟動執行個體時執行。重新取得執行個體的存取權之後,移除使用者資料指令碼。
**注意:**上述命令會排清所有主要的 iptables 規則。重新取得執行個體的存取權之後,請檢閱防火牆組態的準確性 (例如 UFW、firewalld、iptables)。
若要移除使用者資料,請執行以下操作:
1. 完成方法 4: 使用使用者資料指令碼區段中的步驟 1-4。
2. 刪除編輯使用者資料對話方塊中的使用者資料指令碼。
相關資訊
如何對來自網際網路的 Amazon EC2 執行個體連線逾時錯誤進行疑難排解?
相關內容
- 已提問 8 個月前lg...
- 已提問 10 個月前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 7 個月前