news 2026/3/24 18:58:02

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/3/22 7:43:50

网页端大文件上传插件如何支持视频文件的秒传和断点续传?

首先右键单击网站根目录,在弹出的快捷菜单中,选择"添加引用"菜单项,弹出"添加引用",切换到"浏览"找到组件的Dll文件"Bestcomy.Web.Controls.Upload.dll"(本文件可到官网下载,本文后面也提供下载),单击"确定",回到VS工作界面…

作者头像 李华
网站建设 2026/3/20 7:48:44

Flowise惊艳案例:100+模板复用后的定制化成果分享

Flowise惊艳案例:100模板复用后的定制化成果分享 1. 为什么Flowise能让人眼前一亮? 你有没有过这样的经历:花了一周时间研究LangChain文档,写了几十行代码,结果RAG问答还是答非所问?或者好不容易调通一个…

作者头像 李华
网站建设 2026/3/18 9:47:49

OFA-large模型效果展示:真实电商SKU图文不一致问题识别案例

OFA-large模型效果展示:真实电商SKU图文不一致问题识别案例 1. 引言:电商平台的一个“小”麻烦 你有没有在网上买东西时遇到过这种情况?看商品图片觉得挺不错,收到实物后却发现“货不对板”。图片上是一件质感很好的毛衣&#x…

作者头像 李华
网站建设 2026/3/22 20:17:01

Clawdbot部署Qwen3-32B保姆级指南:Mac M2/M3芯片Ollama适配与网关配置

Clawdbot部署Qwen3-32B保姆级指南:Mac M2/M3芯片Ollama适配与网关配置 1. 为什么需要这套本地部署方案 你是不是也遇到过这些问题:想用Qwen3-32B这样强大的开源大模型,但又不想把敏感对话发到公有云?想在Mac上直接跑起来&#x…

作者头像 李华
网站建设 2026/3/21 16:04:35

如何利用jQuery实现大文件的分片上传和断点续传?

2023年X月X日 开发日志 - 大文件传输系统攻坚实录 凌晨1:30,合肥的暴雨敲打着窗户,我正在为这个极具挑战的外包项目设计技术方案。客户的需求相当硬核——基于WebUploader实现20G级文件夹传输,还要兼容IE8这个"上古神器"。泡了杯浓…

作者头像 李华
网站建设 2026/3/15 8:07:07

农业大数据平台如何处理Word表格的Web端编辑?

【开发日记:Word图片一键转存大作战——从“秃头警告”到“真香现场”】 2023年X月X日 周X 晴(但我的头顶在下雨) 第一章:需求诞生——甲方爸爸的“五彩斑斓黑” 今天导师突然发来一个“小需求”:给我的CMS系统后台新…

作者头像 李华