服务器ssh连接防护指南
文章目录
- **一、核心策略:减少公网暴露面**
- 1. **强制使用非标准端口**
- 2. **配置服务器防火墙(ufw)**
- **二、增强防护:服务器端深度防御**
- 1. **配置fail2ban自动封禁攻击源**
- 2. **使用TCP wrapper限制访问**
- **三、优化SSH配置:降低被扫描风险**
- 1. **禁用不必要的认证方式**
- 2. **使用强加密算法**
- **四、监控与响应:实时感知威胁**
- 1. **配置实时日志监控**
- 2. **设置异常流量告警**
- **五、高级防护:在服务器端模拟网关过滤**
- 1. **使用nftables配置连接速率限制**
- 2. **部署轻量级IPS(入侵防御系统)**
- **六、实施步骤建议**
- **效果验证**
在仅能操作服务器端的情况下,虽然无法直接修改网关配置,但仍可通过以下策略缓解外网攻击导致的网关限流问题:
一、核心策略:减少公网暴露面
1. 强制使用非标准端口
修改SSH配置文件,彻底关闭22端口,改用高位随机端口(如58222):
# 修改配置文件
sudo sed -i 's/^Port 22/Port 58222/' /etc/ssh/sshd_config# 重启服务
sudo systemctl restart sshd
2. 配置服务器防火墙(ufw)
限制SSH端口的访问源,仅允许信任IP连接:
# 允许特定IP访问新端口
sudo ufw allow from 192.168.1.0/24 to any port 58222# 禁止其他IP访问所有SSH相关端口(包括22)
sudo ufw deny 22/tcp
sudo ufw deny 58222/tcp comment "仅允许信任IP"# 启用防火墙
sudo ufw enable
二、增强防护:服务器端深度防御
1. 配置fail2ban自动封禁攻击源
安装并配置fail2ban监控SSH登录尝试,自动封禁恶意IP:
# 安装fail2ban
sudo apt-get install fail2ban# 创建自定义配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# 编辑jail.local,添加/修改以下内容:
[sshd]
enabled = true
port = 58222 # 使用新端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 3次失败后封禁
bantime = 86400 # 封禁24小时
findtime = 3600 # 1小时内计算失败次数# 重启服务
sudo systemctl restart fail2ban
2. 使用TCP wrapper限制访问
通过hosts.allow
和hosts.deny
进一步限制SSH服务:
# 编辑/etc/hosts.allow,仅允许信任IP
sshd: 192.168.1.0/24 10.0.0.0/8 : ALLOW# 编辑/etc/hosts.deny,拒绝其他所有IP
sshd: ALL : DENY
三、优化SSH配置:降低被扫描风险
1. 禁用不必要的认证方式
# 编辑/etc/ssh/sshd_config
PasswordAuthentication no # 禁用密码登录
PermitRootLogin no # 禁止root直接登录
MaxAuthTries 2 # 最多2次认证尝试
ClientAliveInterval 300 # 5分钟无活动则断开
ClientAliveCountMax 0 # 不允许无活动连接
2. 使用强加密算法
# 在sshd_config中添加
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
四、监控与响应:实时感知威胁
1. 配置实时日志监控
使用journalctl
监控SSH登录尝试:
# 实时监控SSH登录日志
journalctl -fu sshd# 创建快捷脚本(例如~/check_ssh_attacks.sh)
#!/bin/bash
echo "最近10次登录尝试:"
journalctl -u sshd -n 10echo "尝试次数最多的IP:"
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
2. 设置异常流量告警
安装vnstat
监控网络流量,发现异常时通知管理员:
# 安装vnstat
sudo apt-get install vnstat# 查看实时流量
vnstat -l -i eth0# 设置告警阈值(示例:超过100Mbps发送邮件)
if [ $(vnstat -i eth0 -tr 1 | grep "current rate" | awk '{print $4}') -gt 100 ]; thenecho "流量异常!" | mail -s "SSH端口流量告警" admin@example.com
fi
五、高级防护:在服务器端模拟网关过滤
1. 使用nftables配置连接速率限制
# 添加规则限制新连接速率(每秒不超过1个)
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
sudo nft add rule inet filter input tcp dport 58222 counter limit rate 1/second accept
sudo nft add rule inet filter input tcp dport 58222 counter drop
2. 部署轻量级IPS(入侵防御系统)
使用snort
监控SSH流量,检测暴力破解:
# 安装snort
sudo apt-get install snort# 配置规则(/etc/snort/rules/local.rules)
alert tcp any any -> $HOME_NET 58222 (msg:"SSH暴力破解"; flow:to_server,established; content:"SSH-2.0-"; depth:10; threshold: type limit, track by_src, count 5, seconds 60; sid:1000001; rev:1;)# 启动snort监控模式
sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i eth0
六、实施步骤建议
-
紧急处理(1小时内):
- 修改SSH端口为58222并重启服务
- 配置ufw仅允许信任IP访问新端口
-
基础防护(4小时内):
- 安装并配置fail2ban
- 优化SSH配置(禁用密码登录、限制认证尝试)
-
深度防御(24小时内):
- 配置nftables速率限制
- 部署snort轻量级IPS
-
监控响应(48小时内):
- 设置流量告警脚本
- 建立定期审计日志的流程
效果验证
修改端口并配置防护后,使用以下方法验证:
- 从信任IP连接:
ssh -p 58222 user@server_ip
- 从非信任IP测试:
# 应被拒绝连接 ssh -p 58222 user@server_ip
- 检查防火墙状态:
sudo ufw status verbose
- 查看fail2ban封禁记录:
sudo fail2ban-client status sshd
通过这些措施,即使无法控制网关,也能显著减少SSH服务的暴露风险,降低被网关限流的概率。