SSH暴力破解攻擊太煩人了,所以...

4 min

language: ja bn en es hi pt ru zh-cn zh-tw

你好,我是無能。
當我用tail -f查看託管Gitea的/var/log/auth.log時,發現了一些可疑的嘗試。
例如,像這樣:

2024-12-07T16:57:39.486624+00:00 hostname sshd[392231]: Received disconnect from WireGuardSrvIP port 42552:11: Bye Bye [preauth]

有來自VPN伺服器端的SSH登入嘗試。之所以會發生這種情況,是因為我正在使用Nginx對這個Gitea伺服器進行Stream代理。

stream {
    server {
        listen 2222; 
        proxy_pass GiteaSrvIP:2222; 
        proxy_timeout 1m;
        proxy_connect_timeout 1s;
    }
}

這樣一來,在Port 2222接收到的IP會被轉發到GiteaSrvIP,但我老實說還不明白為什麼日誌中會顯示另一個端口42552,而且來自這個我暫時用作內部IP的登入嘗試大量湧入,讓我感到不舒服。
從機制上來說,最終我想用SSH協定推送到Gitea,但在使用Stream代理時,需要以IP:port的形式進行代理,所以我認為這是因為所有在2222端口上的SSH嘗試都被轉發到了GiteaSrvIP。

即使我自己說,也變得一團糟了,所以...


壞蛋:我要ssh到git.domain.tld的2222端口!
WireGuardSrv:喔喔,你是在嘗試登入2222端口嗎?
WireGuardSrv:那麼,所有對2222端口的請求都會轉發給GiteaSrv!
GiteaSrv:不,我好像只能看到WireGuardSrv的IP,而且有很多SSH登入嘗試過來...


我只能想像出這種流程,才能理解來自WireGuardSrvIP的SSH嘗試...
但奇怪的是,我只設定了在2222端口接收並轉發到2222端口,卻不知道它是如何變成port 42552的。如果說是要從全球IP透過這個端口SSH到只存在於VPN上的IP位址,那我還能理解...
當然,SSH登入本身禁止root登入,並且只允許公開金鑰認證,所以如果被突破了,我會很好奇他們是怎麼做到的。

作為對策

如果留下雜亂的auth.log,日誌文件會很難查看,而且最重要的是,日誌文件可能會瘋狂膨脹,所以我想在前端就將其阻止。
這是因為我已經用fail2ban阻止了多次SSH登入嘗試,但這樣一來,透過Wireguard對GiteaSrvIP的SSH嘗試也會混在其他日誌中被阻止。
因此,我想在寫入auth.log之前就將其阻止。

FreeBSD (WireGuard伺服器) 端

將pf的預設阻擋策略設定為drop
PF: 執行時選項
因此,將其設定為預設策略Drop

set block-policy drop

這樣一來,如果觸發了FreeBSD端的阻擋策略,封包就會直接被丟棄。

Debian (WireGuard客戶端兼Gitea伺服器) 端

首先,GiteaHTTP伺服器以及SSH的22號和2222號端口,明顯有來自WireGuardSrvIP的其他端口號的存取嘗試,這本身就很奇怪。
特別是2222號以上的端口,例如3000號,作為預設的本地HTTP端口,本來不應該開放,但我也不想讓Gitea在80號端口監聽,所以暫時在測試期間開放了3000號端口。
因為我說得一團糟,所以用ufw限制了端口,如下所示。

ufw deny proto tcp from WireGuardSrvIP to any port 2223:65535
ufw reload

因為我想將其用作一個玩樂的VPS伺服器,所以暫時拒絕了2223:65535的範圍,並另外明確開放了3000/tcp

成功地阻止了那些莫名其妙的SSH嘗試日誌

多虧了這個,我不知道是FreeBSD端的阻擋策略生效了,還是因為我同時用ufw明確地deny了,總之,那些像鬼一樣不斷湧入auth.log的登入嘗試已經消失了。
我想,大概是因為FreeBSD端原本就設定了一定程度的防火牆,所以被阻擋的封包不是被REJECT而是被drop,因此所有封包在FreeBSD階段就被丟棄了。我希望是這樣。

重新設定fail2ban

因此,編輯/etc/fail2ban/jail.conf
在預設監控設定中設定排除的IP

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 WireGuardSrvIP

之後,再修改sshd的設定

[sshd]
enabled = true
port    = all
logpath = /var/log/auth.log
bantime = 10w  
findtime = 1d  
maxretry = 2

我嘗試將設定變得比WireGuardSrv更嚴格。
更改的原因如下:

port    =  all
maxretry = 2

WireGuardSrv明確地將端口設定為ssh,所以只監控用於ssh的端口,但這個設定是監控所有端口上的SSH嘗試。
重試次數也限制在嚴格的2次。
更改的原因是我好奇會捕捉到多少次,如果這樣會捕捉到很多次,我打算在WireGuardSrv上也設定相同的級別。
那麼。
我很期待結果。

Related Posts