Linux

MaxSessions/MaxStartups 會修復 ssh “連接被拒絕”消息嗎?

  • July 4, 2020

在底部更新 –>

我在大約 20 名學生的作業系統課程中使用Red Hat Enterprise Linux Server 版本 7.4 (Maipo) VM,他們通常使用自己的特定使用者 ID 啟動到這台機器的兩個 ssh 連接。當學生逐漸進入教室時,這似乎工作得很好。

但是,在大多數學生嘗試登錄的課程開始時,我有學生無法通過一條“ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused”消息登錄系統。等待 20 分鐘左右似乎最終讓更多人進入。 sshd 肯定正在執行。被拒絕的使用者群各不相同,有時也包括我。我可能在幾分鐘前通過 ssh 成功連接,但隨後無法啟動第二個會話。

我們所有的傳出流量都使用多對一 NAT 設置,因此伺服器上的所有傳入 ssh 連接都將顯示為來自相同的 IP 號。查看文件並進行一些探勘後,我更改了sshd_config文件中的以下兩個參數:

#MaxSessions 10
MaxSessions 500

#MaxStartups 10:30:100
MaxStartups 75:10:200

據我了解,MaxSessions控制與伺服器的活動 ssh 連接的數量 - 即使僅來自一個 IP 號碼,而MaxStartups與初始連接嘗試有關(例如,嘗試登錄但尚未提供密碼的人)所以在這種情況下,我可以在啟動時容納 75,然後費率會增加 10%,直到達到 200 的限制(所以我應該設置 MaxSessions 並且這個數字相同嗎?)

我正在使用密碼身份驗證,並且禁用了 root 登錄。我們通常使用 git bash shell 從 Windows 10 機器登錄(儘管我也使用 putty 來查看是否會有所作為,但沒有)。

無論如何,我在處理有問題的登錄時是否在正確的軌道上?問題是我不能隨意可靠地重現它。這個問題似乎只有在課堂上同時有一堆連接嘗試時才會出現,我在其他時間登錄和退出沒有任何問題,並且沒有學生在其他時間報告這個問題。

我還能嘗試什麼來幫助診斷和解決此問題?我知道這似乎是許多人都會遇到的一種錯誤,我在這裡讀了很多,但還沒有找到一個有效的修復方法。


更新

所以當我嘗試用這個小腳本重現這個問題時(感謝@RobbieMckennie 給了我這個想法)

LIMIT=5

for i in $(seq $LIMIT)
do
   echo 
   echo "============================= ${i} ==================="
   ssh -vvv userid@xx.xx.xxx.xx
   echo 
done

我會在 3 次登錄嘗試後得到這個:

$ ssh -vvv useridl@xx.xx.xxx.xx
OpenSSH_7.5p1, OpenSSL 1.0.2k  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolving "xx.xx.xxx.xx" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to xx.xx.xxx.xx [xx.xx.xxx.xx] port 22.
debug1: connect to address xx.xx.xxx.xx port 22: Connection refused
ssh: connect to host xx.xx.xxx.xx port 22: Connection refused

事實上,如果我一個接一個地快速登錄 3 次,我可以“手動”重現這個,第 4 次嘗試會導致這個結果。原始 ip 號在我的 fail2ban ( jail.local) 中的 ignoreip 列表中,據我所知似乎可以工作

2017-10-12 07:38:04,481 fail2ban.filter         [52845]: WARNING Determined IP using DNS Lookup: c-yy-yy-yy-yyy.hsd1.il.comcast.net = ['yy.yy.yy.yyy']
2017-10-12 07:38:04,482 fail2ban.filter         [52845]: INFO    [sshd] Ignore yy.yy.yy.yyy by ip

雖然我不確定警告是否意味著什麼。

所以,兩個問題:

  1. 是什麼導致了這種拒絕?據我所知,我什至沒有進入系統。是否有我需要調整的配置設置?
  2. 更重要的是,當我的 22 個學生都嘗試從校園登錄時,由於我們的多對一 NAT,所有這些連接都來自同一個 IP 號,這可以解釋嗎?在我看來它可能(?)

唯一不同的是,發生這種拒絕時,學生大約需要 15 分鐘左右才能登錄,而在我上面的實驗中,我會在幾秒鐘內重新登錄。這可能是由於某種積壓嗎?

特別是這個條目,我剛剛在 IPtables 中發現了這個條目

Chain INPUT_direct (1 references)
target     prot opt source               destination
          tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW recent: SET name: DEFAULT side: source mask: 255.255.255.255

REJECT     tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW recent: UPDATE seconds: 30 **hit_count: 4** name: DEFAULT side: source mask: 255.255.255.255 reject-with tcp-reset

這可以解釋 3 次登錄的限制,但同樣,我不確定這是否可以解釋當我們遇到這種情況時在校園內等待 15 分鐘左右才能重新登錄。

我知道我遲到了 ;-) 但我猜你有 fail2ban 執行,或類似的東西?

Fail2ban 可以幫助保護各種守護程序免受暴力攻擊。對於 sshd,fail2ban 會暫時阻止 IP 地址重複登錄失敗的埠。有幾種方法可以解決這種情況:停止fail2ban,將學校的IP列入白名單,……

我遇到了類似的問題,結果是一些討厭的機器人佔用了預設情況下可用的所有幾個連接插槽。

與我們從手冊頁中可以理解的不同,MaxStartups 不會在達到限制時按 FIFO 順序丟棄掛起的連接,而是會忽略所有新連接。因此,如果您有預設值 10 並且有 10 個人連接而不發送任何內容,您將無法再登錄。基本上,如果您不希望有人通過打開大量連接(預設設置的高 DoS 潛力)輕鬆地將您鎖定在系統之外,則您希望該數字非常高。

還有另一個設置:LoginGraceTime。這是未經身份驗證的使用者被伺服器踢出之前的時間,預設為 600 秒。這解釋了為什麼 OP 在學生實際登錄之前看到大約 15 分鐘的延遲。您希望此設置盡可能低,以便可以快速丟棄虛擬連接。

我可能會聯繫 debian 的 openssh 維護者來討論這個問題。預設配置不應該那麼容易受到 DoS 攻擊。

編輯:我查看了錯誤報告、CVE 和 openssh 原始碼。增加 MaxStartups 對 RAM 使用有直接和持續的影響,因為連接是以單次分配方式處理的。基本上有一些“malloc(MAX_STARTUPS*sizeof(connection))”。實際上解決這個問題需要對 openssh 處理記憶體分配的方式進行一些重大的修改,這需要沒人有的時間。

引用自:https://serverfault.com/questions/877517