news 2026/5/1 6:44:19

iptables 防火墙规则案例2:NAT网关服务器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iptables 防火墙规则案例2:NAT网关服务器

本文博主介绍的这个 iptables 配置实现了完整的NAT网关功能,让内网设备共享一个公网IP上网,并能将公网服务映射到内网服务器。

# 1. 开启IP转发echo1>/proc/sys/net/ipv4/ip_forward# 2. 设置SNAT(内网访问外网)# eth0: 公网接口,eth1: 内网接口iptables -t nat -A POSTROUTING -o eth0 -s192.168.1.0/24 -j MASQUERADE# 或使用固定公网IPiptables -t nat -A POSTROUTING -o eth0 -s192.168.1.0/24 -j SNAT --to-source 公网IP# 3. 设置DNAT(外网访问内网服务器)# 将公网IP的80端口映射到内网Web服务器iptables -t nat -A PREROUTING -i eth0 -p tcp --dport80-j DNAT --to-destination192.168.1.100:80# 4. 允许转发流量iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s192.168.1.0/24 -j ACCEPT

网络地址转换(NAT)网关配置详解

一、基础概念:什么是网关?

内网设备 → 网关 → 外网(互联网) ↓ ↓ 192.168.1.x 公网IP

网关负责内网和外网之间的桥梁,解决内网设备无法直接访问互联网的问题。


二、解释脚本

1. 开启IP转发

echo1>/proc/sys/net/ipv4/ip_forward

作用:让Linux变成路由器,能转发数据包

比喻

  • 默认:Linux是个"死胡同",数据包进来只能给本机
  • 开启后:Linux变成"十字路口",可以转发数据到其他地方

永久生效

# 编辑配置文件echo"net.ipv4.ip_forward = 1">>/etc/sysctl.conf sysctl -p

2. SNAT:内网访问外网(出站)

iptables -t nat -A POSTROUTING -o eth0 -s192.168.1.0/24 -j MASQUERADE

场景:内网电脑(192.168.1.10)访问百度

处理过程

发送时: 源IP: 192.168.1.10 → 源IP: 公网IP 目的IP: 百度IP → 目的IP: 百度IP 返回时: 源IP: 百度IP → 源IP: 百度IP 目的IP: 公网IP → 目的IP: 192.168.1.10

参数解释

  • -t nat:使用nat表(专门改IP地址)
  • -A POSTROUTING:在路由修改(出门前改寄件人地址)
  • -o eth0:从eth0网卡出去(公网接口)
  • -s 192.168.1.0/24:源IP是内网段
  • -j MASQUERADE:自动伪装成出口IP

MASQUERADE vs SNAT

# MASQUERADE(推荐动态IP,如PPPoE拨号)iptables -t nat -A POSTROUTING -o ppp0 -s192.168.1.0/24 -j MASQUERADE# 自动获取出口IP,适合IP会变的情况# SNAT(固定公网IP)iptables -t nat -A POSTROUTING -o eth0 -s192.168.1.0/24 -j SNAT --to-source203.0.113.10# 明确指定公网IP

3. DNAT:外网访问内网服务器(入站)

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport80-j DNAT --to-destination192.168.1.100:80

场景:外网用户访问公网IP的80端口,转到内网Web服务器

处理过程

用户访问: 请求: 公网IP:80 → 转发到: 192.168.1.100:80 服务器回复时自动通过SNAT返回

参数解释

  • -A PREROUTING:在路由修改(进门时就改目的地)
  • -i eth0:从eth0进来(公网接口)
  • --dport 80:目标端口是80(HTTP)
  • -j DNAT:目的地址转换
  • --to-destination:转到哪个内网服务器

端口映射例子

# Web服务器iptables -t nat -A PREROUTING -i eth0 -p tcp --dport80-j DNAT --to192.168.1.100:80# SSH服务器(外网用2222端口,内网用22端口)iptables -t nat -A PREROUTING -i eth0 -p tcp --dport2222-j DNAT --to192.168.1.101:22# 游戏服务器iptables -t nat -A PREROUTING -i eth0 -p udp --dport27015-j DNAT --to192.168.1.102:27015

4. 允许转发流量(FORWARD链)

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s192.168.1.0/24 -j ACCEPT

为什么需要

  • 开启了IP转发,但iptables默认阻止所有转发
  • 需要明确允许哪些流量可以转发

第一条:允许响应数据

-m state --state ESTABLISHED,RELATED -j ACCEPT

允许已建立连接和相关连接的数据包,确保内网访问外网的回复能回来

第二条:允许内网主动访问外网

-s192.168.1.0/24 -j ACCEPT

允许内网段(192.168.1.0/24)发起的流量转发出去

注意:外网主动访问内网不需要单独允许,因为DNAT会自动处理


三、完整数据流示例

场景1:内网电脑访问百度

1. 内网电脑(192.168.1.10) → 网关 → 外网 src: 192.168.1.10 SNAT src: 公网IP dst: 百度IP ↓ dst: 百度IP 2. 百度回复 → 网关 → 内网电脑 src: 百度IP DNAT src: 百度IP dst: 公网IP ↓ dst: 192.168.1.10

场景2:外网用户访问内网Web服务器

1. 外网用户 → 网关 → 内网服务器 src: 用户IP DNAT src: 用户IP dst: 公网IP:80 ↓ dst: 192.168.1.100:80 2. 服务器回复 → 网关 → 外网用户 src: 192.168.1.100 SNAT src: 公网IP dst: 用户IP ↓ dst: 用户IP

四、双网卡典型网络拓扑

eth1 (内网) ↓ 外网 ← eth0 (公网) [网关服务器] → 内网设备 ↑ 192.168.1.1/24 内网设备配置: IP: 192.168.1.x/24 网关: 192.168.1.1 DNS: 114.114.114.114

五、常用检查命令

# 1. 检查IP转发是否开启cat/proc/sys/net/ipv4/ip_forward# 显示1表示开启# 2. 查看NAT规则iptables -t nat -L -n -v# 3. 查看连接追踪cat/proc/net/nf_conntrack|head-20# 4. 测试内网能否上网ping-c38.8.8.8# 5. 测试端口映射telnet 公网IP80

六、安全增强建议

# 1. 限制内网某些IP不能上网iptables -t nat -A POSTROUTING -o eth0 -s192.168.1.50 -j DROP# 2. 限制外网只能访问特定端口iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport80-j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport443-j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -j DROP# 3. 防止内网滥用(限速)tc qdiscadddev eth0 root handle1: htb default30tc classadddev eth0 parent1: classid1:1 htb rate 100mbit tc classadddev eth0 parent1:1 classid1:10 htb rate 1mbit ceil 5mbit iptables -t mangle -A POSTROUTING -s192.168.1.10 -j CLASSIFY --set-class1:10

七、问题排查

问题1:内网能ping通外网但打不开网页

# 检查DNSiptables -A FORWARD -p udp --dport53-j ACCEPT iptables -A FORWARD -p tcp --dport53-j ACCEPT# 内网设备DNS设置为:8.8.8.8 或 114.114.114.114

问题2:端口映射不生效

# 1. 检查服务是否监听正确IPnetstat-tlnp|grep:80# 2. 检查FORWARD链是否允许iptables -L FORWARD -n# 3. 关闭网关本机防火墙(临时测试)iptables -P INPUT ACCEPT

问题3:连接数太多导致卡顿

# 调整连接跟踪表大小echo65536>/proc/sys/net/nf_conntrack_maxecho180>/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:27:45

php python+vue网上预约报销系统的设计与实现

目录 系统概述技术架构核心功能模块关键技术实现部署与扩展 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 系统概述 网上预约报销系统基于PHP、Python和Vue.js技术栈开发,旨在简化企业或机构…

作者头像 李华
网站建设 2026/4/18 9:10:02

Qwen2.5-Coder-1.5B在Dify中的应用:低代码AI应用开发

Qwen2.5-Coder-1.5B在Dify中的应用:低代码AI应用开发 1. 为什么低代码开发者需要Qwen2.5-Coder-1.5B 最近在给一个电商团队搭建智能客服系统时,我遇到了一个典型问题:他们需要快速响应不同编程水平的成员需求。前端同事想用自然语言描述交互…

作者头像 李华
网站建设 2026/4/29 18:07:48

Janus-Pro-7B部署教程:Ollama + Janus-Pro-7B + FastAPI封装API服务

Janus-Pro-7B部署教程:Ollama Janus-Pro-7B FastAPI封装API服务 1. Janus-Pro-7B是什么:多模态理解与生成的统一框架 Janus-Pro-7B不是传统意义上的纯文本大模型,而是一个真正能“看懂图、会说话、能创作”的多模态智能体。它不靠拼凑多个…

作者头像 李华
网站建设 2026/5/1 6:32:53

Fun-ASR-MLT-Nano-2512实战教程:FFmpeg音频预处理+ASR流水线搭建

Fun-ASR-MLT-Nano-2512实战教程:FFmpeg音频预处理ASR流水线搭建 1. 为什么你需要这个语音识别流水线 你有没有遇到过这样的情况:手头有一段会议录音、一段采访音频,或者一堆客服电话录音,想快速转成文字,但试了几个工…

作者头像 李华
网站建设 2026/5/1 4:02:57

STM32 HAL库LED控制与状态机设计实战

1. 工程初始化与GPIO基础控制 在嵌入式系统开发中,点亮LED是验证硬件连通性与软件环境可靠性的最基础、最关键的一步。它不仅是“Hello World”式的入门实践,更是对时钟树配置、GPIO寄存器操作、外设初始化流程的完整检验。本节将基于STM32F103C8T6(常见于Blue Pill开发板)…

作者头像 李华
网站建设 2026/5/1 5:00:01

Nano-Banana与Xshell配合使用:远程开发环境配置

Nano-Banana与Xshell配合使用:远程开发环境配置 1. 这不是你熟悉的“香蕉”,但确实能帮你把开发环境搬上云 第一次看到“Nano-Banana”这个名字,我也愣了一下——它听起来像某种新出的零食,或者某个极客圈的内部梗。但实际接触后…

作者头像 李华