news 2026/4/30 3:37:48

iptables 防火墙规则案例4:端口转发和负载均衡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iptables 防火墙规则案例4:端口转发和负载均衡

端口转发和简单负载均衡详解

# 1. 本地端口转发# 将访问本机8080端口的数据转发到本机80端口iptables -t nat -A PREROUTING -p tcp --dport8080-j REDIRECT --to-port80# 2. 简单负载均衡(轮询)# 将80端口的请求分配到3台后端服务器iptables -t nat -A PREROUTING -p tcp --dport80-m statistic --mode nth --every3--packet0\-j DNAT --to-destination192.168.1.101:80 iptables -t nat -A PREROUTING -p tcp --dport80-m statistic --mode nth --every2--packet0\-j DNAT --to-destination192.168.1.102:80 iptables -t nat -A PREROUTING -p tcp --dport80\-j DNAT --to-destination192.168.1.103:80

一、本地端口转发

场景:同一台服务器,不同端口转发

iptables -t nat -A PREROUTING -p tcp --dport8080-j REDIRECT --to-port80

作用:把访问本机8080端口的流量转到80端口

实际应用场景

  1. 端口标准化:外部用8080,内部用80
  2. 权限问题:普通用户程序不能用1024以下端口
  3. 多版本并存:新版服务在8080,测试用

数据流向

用户访问:服务器IP:8080 ↓ PREROUTING链:检测到目标端口8080 ↓ REDIRECT动作:改为目标端口80 ↓ 服务器程序接收:在80端口处理请求

注意

  • 只能转本机端口
  • 必须用-t nat
  • 必须在PREROUTING

更多例子

# HTTPS测试端口转发iptables -t nat -A PREROUTING -p tcp --dport8443-j REDIRECT --to-port443# SSH备用端口iptables -t nat -A PREROUTING -p tcp --dport2222-j REDIRECT --to-port22# 开发环境转发iptables -t nat -A PREROUTING -p tcp --dport3000-j REDIRECT --to-port80

二、iptables实现简单负载均衡(轮询)

这个配置的原理解析

# 三条规则一起看:# 规则1:每3个包中的第1个包(序号0)转到101iptables -t nat -A PREROUTING -p tcp --dport80\-m statistic --mode nth --every3--packet0\-j DNAT --to-destination192.168.1.101:80# 规则2:剩下的每2个包中的第1个包转到102iptables -t nat -A PREROUTING -p tcp --dport80\-m statistic --mode nth --every2--packet0\-j DNAT --to-destination192.168.1.102:80# 规则3:剩下的所有包转到103iptables -t nat -A PREROUTING -p tcp --dport80\-j DNAT --to-destination192.168.1.103:80

执行流程(关键:按顺序匹配!)

数据包匹配过程

第1个包:匹配规则1(every 3, packet 0)→ 转到101 第2个包:不匹配规则1 → 检查规则2(every 2, packet 0)→ 转到102 第3个包:不匹配规则1 → 检查规则2(every 2, packet 1)→ 不匹配 → 规则3 → 转到103 第4个包:匹配规则1(every 3, packet 1)→ 不匹配 → 规则2(every 2, packet 0)→ 转到102 第5个包:不匹配规则1 → 检查规则2(every 2, packet 1)→ 不匹配 → 规则3 → 转到103 第6个包:匹配规则1(every 3, packet 2)→ 不匹配 → 规则2(every 2, packet 0)→ 转到102

实际分配结果(前6个包):

包序号 → 服务器 1 → 101 2 → 102 3 → 103 4 → 102 5 → 103 6 → 102

问题:分配不均匀!103服务器只收到1/3的流量


三、正确的轮询负载均衡配置

方案1:使用统计模块的正确写法

# 清理旧规则iptables -t nat -F# 方法A:使用计数器复位(需要复杂脚本控制)# 这里展示理想化的轮询(实际很难用iptables完美实现)# 方法B:使用随机概率(近似轮询)iptables -t nat -A PREROUTING -p tcp --dport80\-m statistic --mode random --probability0.33\-j DNAT --to-destination192.168.1.101:80 iptables -t nat -A PREROUTING -p tcp --dport80\-m statistic --mode random --probability0.5\-j DNAT --to-destination192.168.1.102:80 iptables -t nat -A PREROUTING -p tcp --dport80\-j DNAT --to-destination192.168.1.103:80

概率计算

  • 第一个规则:33%概率到101
  • 第二个规则:剩下的67%中的50%(即33.5%)到102
  • 第三个规则:剩下的33.5%到103

结果:大致各1/3,但不是精确轮询

方案2:更好的负载均衡方案(推荐)

# 使用更专业的工具,不要用iptables做复杂负载均衡# ---------- 方案A:使用Nginx(应用层,功能丰富) ----------# nginx.conf 部分配置upstream backend{server192.168.1.101:80;server192.168.1.102:80;server192.168.1.103:80;}server{listen80;location /{proxy_pass http://backend;}}# ---------- 方案B:使用IPVS(内核级,性能高) ----------ipvsadm -A -t 服务器IP:80 -s rr# rr=轮询算法ipvsadm -a -t 服务器IP:80 -r192.168.1.101:80 -g ipvsadm -a -t 服务器IP:80 -r192.168.1.102:80 -g ipvsadm -a -t 服务器IP:80 -r192.168.1.103:80 -g# ---------- 方案C:使用Haproxy ----------# haproxy.cfg 部分配置frontend webbind*:80 default_backend servers backend servers balance roundrobin server server1192.168.1.101:80 check server server2192.168.1.102:80 check server server3192.168.1.103:80 check

四、iptables负载均衡的局限性

缺点:

  1. 无会话保持:同一个用户的不同请求可能到不同服务器

    # 用户登录请求到101,下一个请求到102 → 登录状态丢失
  2. 无健康检查:后端服务器宕机,请求仍会发过去

    # 102服务器挂了,但iptables不知道,继续转发
  3. 算法简单:只有简单轮询,无法加权、最少连接等

  4. 配置复杂:多条规则难以管理

  5. 性能问题:规则多了影响性能

适用场景:

  • ✅ 静态文件分发(无状态)
  • ✅ 测试环境简单分流
  • ✅ 临时解决方案
  • ❌ 生产环境Web应用
  • ❌ 需要会话保持的应用
  • ❌ 需要健康检查的场景

五、实际生产环境配置示例

场景:开发测试环境用iptables简单分流

#!/bin/bash# dev_loadbalance.sh# 1. 清空规则iptables -t nat -F# 2. 根据源IP哈希分流(简单会话保持)# 相同IP总是到同一台服务器iptables -t nat -A PREROUTING -p tcp --dport80\-m state --state NEW\-m hashlimit --hashlimit-mode srcip --hashlimit-name session_sticky\-j DNAT --to-destination192.168.1.101:80 iptables -t nat -A PREROUTING -p tcp --dport80\-m state --state NEW\-j DNAT --to-destination192.168.1.102:80# 3. 允许已建立连接的流量iptables -t nat -A PREROUTING -p tcp --dport80\-m state --state ESTABLISHED,RELATED\-j ACCEPT# 由conntrack自动处理# 4. 简单健康检查(配合脚本)# 定期检查后端服务器,失败时删除规则check_server(){if!ping-c1-W1192.168.1.101&>/dev/null;theniptables -t nat -D PREROUTING -p tcp --dport80\-m state --state NEW\-m hashlimit --hashlimit-mode srcip --hashlimit-name session_sticky\-j DNAT --to-destination192.168.1.101:802>/dev/nullfi}

六、端口转发的其他用途

1. 透明代理

# 将所有80端口的流量转到本地3128代理端口iptables -t nat -A PREROUTING -p tcp --dport80-j REDIRECT --to-port3128# 代理服务器监听3128,处理请求

2. 端口伪装(防扫描)

# 实际SSH在2222端口,对外显示在22端口iptables -t nat -A PREROUTING -p tcp --dport22-j REDIRECT --to-port2222# 攻击者扫描22端口,实际连到2222

3. 协议转换

# 外部HTTPS(443),内部HTTP(80) + SSL终端iptables -t nat -A PREROUTING -p tcp --dport443-j REDIRECT --to-port80# Nginx在80端口同时处理HTTP和HTTPS(需要相应配置)

4. 多IP服务

# 不同IP的80端口转到不同内部端口iptables -t nat -A PREROUTING -d192.168.1.100 -p tcp --dport80\-j REDIRECT --to-port8080iptables -t nat -A PREROUTING -d192.168.1.101 -p tcp --dport80\-j REDIRECT --to-port8081

七、调试和监控

查看规则效果

# 查看NAT规则iptables -t nat -L -n -v# 查看连接跟踪(看到实际转发)conntrack -L|grep:80# 测试端口转发telnet localhost8080# 应该连到80端口# 查看数据包计数(看每条规则匹配次数)iptables -t nat -L -n -v --line-numbers

性能监控

# 查看每秒转发包数watch-n1'iptables -t nat -L -n -v | grep DNAT'# 查看CPU使用(iptables消耗)top-p$(pgrep -f"iptables")

八、重要注意事项

  1. 规则顺序:iptables按顺序匹配,第一条匹配后就不看后面的了
  2. 连接跟踪:确保开启,否则回包可能有问题
    lsmod|grepnf_conntrack
  3. FORWARD链:如果是转发到其他机器,需要允许FORWARD
    iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -j ACCEPT# 或更精确的控制
  4. 保存配置
    # CentOS/RHELserviceiptables save# Ubuntu/Debianiptables-save>/etc/iptables/rules.v4

结论

  • 端口转发:iptables很适合,简单高效
  • 负载均衡:iptables只能做最简单的,生产环境用Nginx/Haproxy/IPVS
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 9:57:22

计算机毕设java邯郸学院健康驿站管理系统 基于SpringBoot的高校健康隔离管理平台设计与实现 校园防疫健康服务系统开发与应用研究

计算机毕设java邯郸学院健康驿站管理系统8h5689(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着高校疫情防控常态化管理需求的日益凸显,传统的人工登记与健康监测…

作者头像 李华
网站建设 2026/4/27 10:22:20

计算机毕设Java基于Vue框架的烟酒销售管理系统 SpringBoot+Vue烟酒电商销售平台的设计与实现 基于Java Web的卷烟酒类商品在线销售系统开发

计算机毕设Java基于Vue框架的烟酒销售管理系统89bs39 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的快速发展和电子商务的日益普及,传统烟酒零售行…

作者头像 李华
网站建设 2026/4/22 15:13:49

实现AI Agent的动态上下文管理

实现AI Agent的动态上下文管理 关键词:AI Agent、动态上下文管理、上下文建模、上下文更新、应用场景 摘要:本文围绕实现AI Agent的动态上下文管理展开,深入探讨了其核心概念、算法原理、数学模型,并结合实际项目案例进行详细分析。首先介绍了动态上下文管理的背景,包括目…

作者头像 李华
网站建设 2026/4/29 14:54:01

Atelier of Light and Shadow Token应用开发:安全认证与权限管理

Atelier of Light and Shadow Token应用开发:安全认证与权限管理 1. 当业务系统开始“认人”时,我们真正需要的是什么 上周帮一家做智能硬件的团队排查权限问题,他们用传统方式给200多个设备分配访问令牌,结果每次新增一个设备&…

作者头像 李华
网站建设 2026/4/26 16:08:13

实时手机检测-通用部署教程:Nginx负载均衡多WebUI实例部署

实时手机检测-通用部署教程:Nginx负载均衡多WebUI实例部署 1. 项目概述 实时手机检测-通用是一款基于DAMOYOLO-S框架的高性能目标检测模型,专门用于快速准确地识别图像中的手机设备。该模型在精度和速度方面均优于传统YOLO系列方法,适用于工…

作者头像 李华
网站建设 2026/4/22 9:48:12

Face3D.ai ProGPU算力适配:多卡并行推理与批处理加速教程

Face3D.ai ProGPU算力适配:多卡并行推理与批处理加速教程 1. 为什么需要GPU算力优化? Face3D.ai Pro 的核心价值在于“实时高精度”——从一张2D人脸照片生成工业级4K UV纹理贴图,整个过程需在数百毫秒内完成。但这个“实时”是有前提的&am…

作者头像 李华