IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

记一次LVS/Nginx环境下的访问控制

火丁笔记 2015-01-23 23:47:26 累计浏览 5,075 次
本机暂存

   偶然间,我发现 Graphite 显示服务器网卡流量呈锯齿状,于是查了一下 Nginx 日志,发现有人在周期性抓我们的接口数据。我这爆脾气自然不能容忍这种行径。

   简单分析一下访问日志,很容易就能拿到了可疑的 IP 段,直接用 iptables 封杀:

shell> iptables -A INPUT -s x.y.z.0/24 -j DROP

   本以为世界会就此清净,可没想到一点儿用都没有。莫非小偷已经突破锁头的限制?不能够啊!直觉告诉我问题应该和 LVS 有关,可惜我对 LVS 的了解极其匮乏,唯一知道的就是项目用的是 FULLNAT 模式,那就以此为切入点开始挖掘:

LVS FULLNAT

LVS FULLNAT

   所谓 FULLNAT 模式,是指当用户请求经由 LVS 转发给 RS 服务器的时候,其来源 IP 会从用户 IP 改成 LVS 内网 IP,目标 IP 会从 LVS 的 VIP 改成 RS 服务器的 IP;当 RS 服务器生成响应数据经由 LVS 返回给用户的时候,其来源 IP 会从 RS 服务器 IP 改成 LVS 的 VIP,目标 IP 会从 LVS 内网 IP 改成用户 IP。

   说明:关于 LVS 更详细的介绍请参考「从一个开发的角度看负载均衡和LVS」一文。

   对于 RS 服务器而言,实际上它看到的是 LVS。可我们明明在 Nginx 日志里看到了客户端的 IP,而不是 LVS 的 IP,这又是什么原因呢?原来 LVS 为了解决 FULLNAT 模式下传递用户 IP 的问题,引入了一个名为 TOA 的补丁机制,在 TCP 的三次握手阶段,通过 TCP 的 options 来传递用户 IP 和端口等信息,继而覆盖 socket 的 IP 和端口数据。

   换句话说,在 RS 服务器上,从 iptables 的角度看,因为 NAT 的缘故,来源 IP 都是 LVS 的 IP;而从 Nginx 的角度看,因为 TOA 的缘故,来源 IP 都是用户的 IP。关于这一点也可以通过 tcpdump 命令抓包来印证:

tcpdump

tcpdump

   说明:如上图所示那一堆 254 开头的字符串里保存的就是用户 IP 和端口等信息。

   于是乎可以得出结论:在 RS 服务器上通过 iptables 来封杀用户 IP 无疑是没有意义的,如果一定要用 iptables,应该在 LVS 服务器上用,但实际情况是我无权操作 LVS 服务器,只能在 RS 服务器上想办法。既然 Nginx 能拿到用户 IP,那么我们就可以在 Nginx 上解决问题,有 AccessGEO 等模块可供选择,这里我们选择的是 GEO 模块:

geo $bad {
    default 0;
    x.y.z.0/24 1;
}

location / {
    if ($bad) {
        return 403;
    }
}

   关于 GEO 模块的例子,有一些不错的资料可供参考,这里我就不多说了。

同分类推荐文章

  1. 绿盟科技《APT组织研究年鉴》(2026 版)正式发布 (2026-06-16 20:21:10)
  2. 【已复现】Linux内核Fragnesia权限提升漏洞(CVE-2026-46300) (2026-06-15 10:53:58)
  3. 企业文档安全最佳实践(二):给文档上“身份证”——手动标密与智能自动标密 (2026-06-12 17:18:33)

查看更多 安全 文章 →

建议继续学习

  1. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,164)
  2. 搜狐闪电邮箱的 Nginx/Postfix 使用模式 (累计阅读 33,895)
  3. 记录一个软中断问题 (累计阅读 16,955)
  4. 解析nginx负载均衡 (累计阅读 16,623)
  5. server日志的路径分析 (累计阅读 11,241)
  6. Nginx模块开发入门 (累计阅读 11,171)
  7. 检查nginx配置,重载配置以及重启的方法 (累计阅读 10,897)
  8. Cacti 添加 Nginx 监控 (累计阅读 10,644)
  9. fsockopen 异步处理 (累计阅读 10,345)
  10. 使用Squid缓存视频 (累计阅读 10,339)