SSH 服務 (埠 22) 長期暴露在公網,極易遭受自動化暴力破解攻擊 (字典撞庫、撞庫)。DenyHosts 是一款經典的 Python 守護程式,監控 /var/log/secure (或 auth.log),偵測失敗登入嘗試超過閾值的 IP,自動將其寫入 /etc/hosts.deny 封禁。本文提供 CentOS 7/8、Ubuntu 20.04/22.04 的標準化部署與調優流程。
fail2ban (更強大、支援 iptables/nftables) 可構建多層防護yum -y install epel-release
yum -y install denyhosts
systemctl enable denyhosts
systemctl start denyhosts
apt-get update
apt-get -y install denyhosts
systemctl enable denyhosts
systemctl start denyhosts
/etc/denyhosts.conf 詳細調優# ========== 日誌來源 ==========
SECURE_LOG = /var/log/secure # RedHat/CentOS
# SECURE_LOG = /var/log/auth.log # Ubuntu/Debian
# ========== 封禁目標與機制 ==========
HOSTS_DENY = /etc/hosts.deny # 封禁寫入檔案 (TCP Wrappers)
BLOCK_SERVICE = sshd # 封禁服務名 (對應 /etc/hosts.deny 格式)
# 也可設為 ALL 封禁所有 TCP Wrappers 保護的服務
# ========== 封禁閾值 (核心調優) ==========
# 無效用戶 (不存在的用戶名) - 最嚴格
DENY_THRESHOLD_INVALID = 3
# 一般用戶
DENY_THRESHOLD_VALID = 5
# root 用戶 - 最嚴格,建議 1-3
DENY_THRESHOLD_ROOT = 1
# 受限用戶 (如 /etc/hosts.deny 已有記錄)
DENY_THRESHOLD_RESTRICTED = 1
# ========== 工作目錄與鎖檔 ==========
WORK_DIR = /var/lib/denyhosts # 資料庫、快取目錄
LOCK_FILE = /var/lock/subsys/denyhosts
# ========== 郵件通知 ==========
ADMIN_EMAIL = admin@example.com
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_USERNAME =
SMTP_PASSWORD =
SMTP_FROM = DenyHosts
# ========== 自動解封 (PURGE) ==========
# 封禁多久後自動移除 (防止誤封永久生效)
PURGE_DENY = 7d # 7 天
# 清理間隔
DAEMON_PURGE = 1h
# ========== 日誌與除錯 ==========
DAEMON_LOG = /var/log/denyhosts.log
DAEMON_LOG_LEVEL = INFO
# DAEMON_LOG_LEVEL = DEBUG # 除錯時開啟
# ========== 其他 ==========
HOSTNAME_LOOKUP = NO # 不做反向 DNS 解析,加速
AGE_RESET_VALID = 5d # 成功登入後重置失敗計數
AGE_RESET_ROOT = 25d
AGE_RESET_INVALID = 10d
RESET_ON_SUCCESS = YES
# 編輯 /var/lib/denyhosts/allowed-hosts (或 WORK_DIR 下)
echo "1.2.3.4" >> /var/lib/denyhosts/allowed-hosts # 公司固定 IP
echo "192.168.1.0/24" >> /var/lib/denyhosts/allowed-hosts # 內網段
echo "my-vpn.example.com" >> /var/lib/denyhosts/allowed-hosts # 域名 (需 HOSTNAME_LOOKUP=YES)
# 重新載入
systemctl restart denyhosts
systemctl status denyhostscat /etc/hosts.denay (應看到 sshd: 1.2.3.4 格式)hosts.deny 並拒絕連線。tail -f /var/log/denyhosts.logDenyHosts 僅操作 TCP Wrappers (hosts.deny),**不支援 iptables/nftables**,且對無 TCP Wrappers 支援的服務 (如純 systemd socket 激活的服務) 無效。fail2ban 直接操作防火牆規則,功能更強:
# CentOS
yum -y install fail2ban
# Ubuntu
apt-get -y install fail2ban
# 配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
findtime = 600
action = iptables-multiport[name=sshd, port="ssh", protocol=tcp]
sendmail-whois[name=sshd, dest=admin@example.com]
systemctl enable fail2ban
systemctl start fail2ban
最佳組合: DenyHosts (TCP Wrappers 層、輕量、快速封禁) + fail2ban (防火牆層、支援所有服務、豐富 action) = **纏深防禦**。
| 問題 | 解決 |
|---|---|
| 封禁不生效 | 確認服務啟動、日誌路徑正確、TCP Wrappers 支援 (sshd_config 有 UsePAM yes)、/etc/hosts.deny 格式正確 |
| 自己被封 | 立即加入 allowed-hosts 白名單,手動從 hosts.deny 移除該 IP,systemctl restart denyhosts |
| 日誌格式不匹配 | 查看 DAEMON_LOG_LEVEL=DEBUG 日誌,對比 SECURE_LOG 實際格式,調整 FAIL_REGEX (進階) |
| 大量攻擊導致 hosts.deny 巨大 | 啟用 PURGE_DENY 自動清理,或改用 fail2ban + ipset (效能更好) |
SSH 暴力破解防護三板斧:**修改非預設埠 + 禁用密碼登入 (強制金鑰) + DenyHosts/fail2ban 自動封禁**。DenyHosts 部署簡單、效果立竿見影,是每台 Linux 伺服器上線前的必裝組件。