在登入 Nextcloud 網頁時,顯示登入密碼多次錯誤鎖定 IP,而只有在內網連接時才會出現此錯誤,從外部連入卻一切正常。

siteBlocked

錯誤原因

可能在內網中有一個裝置正在嘗試使用錯誤的憑證登入。可以是安裝了的手機或平板電腦,也可以是安裝了桌面用戶端的電腦。

而會有登入失敗 IP 鎖定功能,則是需安裝暴力破解偵測 (nextcloud/bruteforcesettings) 應用程式。

主要造成的原因是 NAT Lookback 用於透過網域存取 Nextcloud 伺服器,因此本地網路內的所有裝置都透過相同的 IP 位址存取伺服器。當一台裝置觸發暴力保護時,該 IP 位址就會被阻止,然後所有其他裝置也會受到影響。導致此問題的第二種可能性是反向代理無法將各個裝置的 IP 位址正確轉送到 Nextcloud 伺服器。

解決方法

如果是反向代理問題,可以檢查 Nextcloud 中的 config.php 是否正確設置 trusted_proxies 值,以及檢查 Nginx 反向代理的 log。
通常 trusted_proxies 沒有正確設置,從外部連入反向代理的 log 也都會顯示路由器的 IP。

NAT Lookback 造成被鎖路由器 IP 只能藉由刪除 Nextcloud 資料庫的 oc_bruteforce_attempts 欄位或等他冷卻結束才能解決。

登入 Nextcloud 資料庫

1
mysql -u dbadmin -p nextcloud

執行 SHOW Databases; 列出當前資料庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dbadmin@localhost [nextcloud]> 
dbadmin@localhost [nextcloud]> SHOW Databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| nextcloud |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)

dbadmin@localhost [nextcloud]>

執行 USE nextcloud; 切換至 nextcloud 資料庫

1
2
3
4
dbadmin@localhost [nextcloud]> 
dbadmin@localhost [nextcloud]> USE nextcloud
Database changed
dbadmin@localhost [nextcloud]>

執行 SELECT * FROM oc_bruteforce_attempts; 列出所有因為暴力破鎖(登入錯誤太多次)被鎖的資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dbadmin@localhost [nextcloud]> 
dbadmin@localhost [nextcloud]> SELECT * FROM oc_bruteforce_attempts;
+-----+----------------------------+------------+-------------+----------------+------------------+
| id | action | occurred | ip | subnet | metadata |
+-----+----------------------------+------------+-------------+----------------+------------------+
| 264 | ShareController::showShare | 1716035235 | 192.168.1.1 | 192.168.1.1/32 | {"token":"null"} |
| 265 | ShareController::showShare | 1716035235 | 192.168.1.1 | 192.168.1.1/32 | {"token":"null"} |
| 266 | ShareController::showShare | 1716035272 | 192.168.1.1 | 192.168.1.1/32 | {"token":"null"} |
| 267 | ShareController::showShare | 1716035274 | 192.168.1.1 | 192.168.1.1/32 | {"token":"null"} |
| 268 | ShareController::showShare | 1716035350 | 192.168.1.1 | 192.168.1.1/32 | {"token":"null"} |
| 269 | ShareController::showShare | 1716035356 | 192.168.1.1 | 192.168.1.1/32 | {"token":"null"} |
+-----+----------------------------+------------+-------------+----------------+------------------+
6 rows in set (0.00 sec)

dbadmin@localhost [nextcloud]>

依照上述內容主要是 NAT Lookback 造成內網中所有請求都是由路由器轉發造成的。

再來依照你要解鎖的 IP 來撰寫刪除 query , DELETE FROM oc_bruteforce_attempts WHERE ip = "x.x.x.x";

1
2
3
4
5
dbadmin@localhost [nextcloud]> 
dbadmin@localhost [nextcloud]> DELETE FROM oc_bruteforce_attempts WHERE ip = "192.168.1.1";
Query OK, 6 rows affected (0.01 sec)

dbadmin@localhost [nextcloud]>

完成後再次查看,沒意外的話都已被刪除了

1
2
3
4
5
dbadmin@localhost [nextcloud]> 
dbadmin@localhost [nextcloud]> SELECT * FROM oc_bruteforce_attempts;
Empty set (0.00 sec)

dbadmin@localhost [nextcloud]>

如果你想以後都不要被誤鎖內網,可以在 管理員 > 管理設置 > 安全性 中設置白名單。
(但建議應該去查 log 看哪個裝置在搞,而不是設白名單)

siteWhitelist

參考連結