高防服务器 SSH 防火墙设置与加固
一、总体策略与原则
- 减少暴露面:将 SSH 从默认端口 22 改为高位端口(如 22022/50022),仅在内网或跳板机侧开放管理通道。
- 最小权限:仅允许受控来源 IP 访问;禁用 root 直登,使用普通用户 + sudo;必要时用 AllowUsers 精确列白名单用户。
- 强认证优先:优先使用 SSH 密钥(推荐 ed25519),在确认可用后再禁用密码登录。
- 纵深防御:在防火墙层做端口与来源限制,配合 Fail2ban 动态封禁,叠加日志监控与告警。
以上做法能显著降低暴力破解与扫描噪音,提升整体抗攻击能力。
二、防火墙配置示例
- firewalld(RHEL/CentOS 7+/Fedora)
- 放行自定义 SSH 端口(示例:50022/tcp),并仅允许可信网段:<br>sudo firewall-cmd --permanent --add-port=50022/tcp<br>sudo firewall-cmd --permanent --add-source=203.0.113.10<br>sudo firewall-cmd --permanent --add-source=198.51.100.0/24<br>sudo firewall-cmd --set-default-zone=drop<br>sudo firewall-cmd --reload<br>
- 如需端口转发(高防回源到本机 22),可添加富规则:<br>sudo firewall-cmd --permanent --zone=public --add-forward-port=port=50022:proto=tcp:toport=22<br>sudo firewall-cmd --reload<br>
- 说明:将默认 zone 设为 drop 后,务必先添加可信来源与必要服务端口,避免锁死。
- UFW(Ubuntu/Debian)
- 仅允许指定 IP 访问高位端口:<br>sudo ufw default deny incoming<br>sudo ufw default allow outgoing<br>sudo ufw allow from 203.0.113.10 to any port 50022 proto tcp<br>sudo ufw allow 80,443/tcp<br>sudo ufw enable<br>
- iptables(通用)
- 仅放行指定来源与端口,并限制新连接速率(示例:58222):<br>sudo iptables -F<br>sudo iptables -P INPUT DROP<br>sudo iptables -P FORWARD DROP<br>sudo iptables -P OUTPUT ACCEPT<br>sudo iptables -A INPUT -i lo -j ACCEPT<br>sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT<br>sudo iptables -A INPUT -p tcp --dport 58222 -m conntrack --ctstate NEW -m limit --limit 1/s --limit-burst 3 -j ACCEPT<br>sudo iptables -A INPUT -p tcp --dport 58222 -j DROP<br># 保存规则(视发行版而定,如 iptables-save > /etc/iptables/rules.v4)<br>
- nftables(新一代防火墙)
- 限制新连接速率并放行高位端口(示例:58222):<br>sudo nft add table inet filter<br>sudo nft add chain inet filter input { type filter hook input priority 0 \; }<br>sudo nft add rule inet filter input tcp dport 58222 ct state new limit rate 1/second accept<br>sudo nft add rule inet filter input tcp dport 58222 drop<br>
以上配置示例覆盖了常见防火墙与端口转发/速率限制场景,可按实际端口与来源网段替换。
三、与 SSH 服务联动的关键设置
- 修改端口并重启服务:<br>sudo sed -i 's/^#Port 22/Port 50022/' /etc/ssh/sshd_config<br>sudo systemctl restart sshd # Debian/Ubuntu<br>sudo systemctl restart ssh # RHEL/CentOS<br>
- 禁用 root 直登与空密码,限制认证尝试:<br>PermitRootLogin no<br>PermitEmptyPasswords no<br>MaxAuthTries 2<br>
- 仅允许密钥登录(务必先放置公钥并本地验证可用):<br>PubkeyAuthentication yes<br>PasswordAuthentication no<br>
- 可选:仅允许特定用户登录<br>AllowUsers your_admin_user<br>
- 可选:关闭不必要功能<br>X11Forwarding no<br>AllowTcpForwarding no<br>UseDNS no<br>Protocol 2<br>
这些设置与防火墙白名单/端口策略配合,可形成“端口隐蔽 + 来源限制 + 强认证”的闭环。
四、自动化封禁与监控告警
- Fail2ban 快速配置(适配自定义端口)<br>sudo apt-get install fail2ban -y # 或 yum/dnf 安装<br>cat >/etc/fail2ban/jail.local <<'EOF'<br>[DEFAULT]<br>ignoreip = 127.0.0.1/8 192.168.0.0/16<br>bantime = 86400<br>findtime = 600<br>maxretry = 3<br>[sshd]<br>enabled = true<br>port = 50022<br>filter = sshd<br>logpath = /var/log/auth.log<br>maxretry = 3<br>bantime = 86400<br>EOF<br>sudo systemctl enable --now fail2ban<br># 查看/解封<br>fail2ban-client status sshd<br>fail2ban-client set sshd unbanip 203.0.113.10<br>
- 日志与告警
- 实时查看登录日志:<br>sudo journalctl -fu sshd<br># 或<br>sudo tail -f /var/log/auth.log<br>
- 建议设置告警:高频失败(如 1 分钟 ≥ 10 次 Failed password)与“非白名单 IP 成功登录”触发高优先级告警。
五、验证与回退
- 变更前准备:保留一条当前会话不退出;在同网段预备一台可达主机用于验证新端口与密钥登录。
- 连接测试(示例端口 50022):<br>ssh -i ~/.ssh/id_ed25519 your_user@your_server_ip -p 50022<br>
- 逐步切换:先双端口运行(22 + 50022),确认无误后关闭 22 并清理防火墙规则;如需回退,按相反顺序恢复端口与规则。
- 高防/网关侧联动:若高防或上游网关已做端口转发(公网 50022 → 内网 22),请确保本机防火墙与网关策略一致,避免回环或拦截。