1. 为什么内网穿透下的SSH服务容易被盯上?
最近帮朋友处理了一台服务器被入侵的问题,现象特别典型:通过花生壳做了内网穿透暴露SSH端口,结果不到两周就被植入了挖矿病毒。查看日志才发现,每天有上千次暴力破解尝试,最终某个弱密码账户被攻破。这种情况在使用FRP/花生壳等工具时尤为常见,主要原因有三点:
首先,自动化扫描工具会全网探测开放端口。黑客们用工具批量扫描公网IP段,发现22端口开放就会记录到目标列表。我曾在测试环境用tcpdump抓包,新开的SSH服务30分钟内就会收到扫描请求。
其次,内网穿透使服务暴露在公网。FRP/花生壳的本质是将内网服务映射到公网地址,这和直接把服务器放在公网没有本质区别。有次我在阿里云ECS上部署FRP服务端,24小时后就看到auth.log里出现大量Invalid user记录。
最后,默认配置存在安全隐患。很多人在内网习惯用密码登录,密码强度也不高。更危险的是,有些团队为了方便共享,会使用通用账户(比如dev/ops/admin)。去年处理过一个案例,攻击者用admin:admin123这个组合就突破了防线。
2. 从日志中发现攻击痕迹
2.1 关键日志文件定位
当发现服务器异常时,我第一个检查的就是/var/log/auth.log(CentOS系在/var/log/secure)。这里有组典型日志:
Jul 10 08:15:22 hostname sshd[12345]: Invalid user oracle from 203.0.113.45 Jul 10 08:15:23 hostname sshd[12347]: Failed password for root from 203.0.113.45 Jul 10 08:15:25 hostname sshd[12349]: Accepted publickey for user1 from 192.168.1.100注意三个关键信息:
Invalid user说明攻击者在枚举常见用户名Failed password表明正在尝试暴力破解- 成功登录会显示
Accepted及认证方式(如publickey)
2.2 日志分析实战技巧
用这些命令可以快速分析攻击态势:
# 统计攻击IPTOP10 grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head # 提取所有尝试过的用户名 grep "Invalid user" /var/log/auth.log | awk '{print $8}' | sort | uniq -c # 实时监控新攻击(tail -f相当于Windows的"跟踪日志") tail -f /var/log/auth.log | grep --color -E "Failed|Invalid"有次我用这个方法发现某个IP在尝试500多个用户名,立即用iptables封禁了该地址段:
iptables -A INPUT -s 203.0.113.0/24 -j DROP3. 防火墙:第一道防线配置策略
3.1 基础防护规则
在FRP服务器或花生壳主机上,建议配置这些防火墙规则(以iptables为例):
# 只允许特定IP访问SSH(比如运维跳板机) iptables -A INPUT -p tcp --dport 22 -s 192.168.1.200 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP # 限制连接频率(每分钟最多3次新连接) iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP如果是云服务商,记得在安全组里同步设置。有次我在AWS上漏配安全组,iptables规则形同虚设。
3.2 地域封锁实践
通过IP库可以屏蔽高风险地区,这里推荐ipset工具:
# 创建国家IP集合 ipset create china hash:net ipset add china 1.0.1.0/24 # ...(需导入完整中国IP段) # 应用规则:非中国IP拒绝SSH连接 iptables -A INPUT -p tcp --dport 22 -m set ! --match-set china src -j DROP注意:花生壳免费版不支持自定义防火墙,需要升级商业版;FRP则完全自主可控。
4. 密钥认证:彻底告别密码爆破
4.1 密钥生成与部署
生成ED25519密钥对(比RSA更安全更快):
ssh-keygen -t ed25519 -C "your_email@example.com"将公钥部署到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host然后在/etc/ssh/sshd_config中强制启用密钥认证:
PasswordAuthentication no PubkeyAuthentication yes记得测试后再重启服务:
systemctl restart sshd4.2 穿透环境特殊配置
针对FRP/花生壳的特殊场景,可以区分内外网策略:
Match Address 192.168.1.100 # 花生壳内网终端IP PasswordAuthentication no AllowUsers user1 user2这个配置的意思是:从内网终端IP过来的连接,只允许指定用户且必须用密钥登录。其他IP(如直连内网)可以保持密码登录。
5. 高级防护:Fail2ban动态封禁
5.1 安装与基础配置
Ubuntu下安装:
sudo apt install fail2ban配置文件/etc/fail2ban/jail.local:
[sshd] enabled = true maxretry = 3 bantime = 1d findtime = 1h这会封禁1小时内失败3次的IP,封禁24小时。
5.2 针对穿透优化
对于花生壳日志格式,需要自定义过滤器:
[sshd] logpath = /var/log/auth.log failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>我曾在某企业环境用这个规则,一周内自动封禁了800+恶意IP。
6. 监控与应急响应
6.1 实时告警设置
配置logwatch每日发送日志摘要:
sudo apt install logwatch echo "/usr/sbin/logwatch --output mail --mailto admin@example.com" >> /etc/cron.daily/或者用更现代的Prometheus+Grafana方案监控SSH登录次数。
6.2 入侵应急检查清单
如果怀疑已被入侵,立即执行:
- 用
ps auxf检查异常进程 - 查看
crontab -l和/etc/crontab - 检查
/tmp等目录是否有可疑文件 - 用
netstat -antp查看异常连接
有次帮客户排查,发现攻击者在/usr/lib/systemd/system下植入恶意service文件,差点漏检。
7. 花生壳与FRP的特殊注意事项
花生壳用户要注意:
- 免费版无法自定义端口,建议搭配云防火墙使用
- 商业版支持访问控制,可设置IP白名单
- 定期检查穿透IP是否变化
FRP用户建议:
- 修改默认的7000/bind_port等端口
- 启用token认证
- 为不同服务分配独立子域名
最近帮某团队优化FRP配置时,发现他们还在用默认端口和空token,相当于大门敞开。调整后扫描量直接归零。