iptables--SNAT和DNAT的配置

本文深入解析iptables的表、链结构及基本语法,涵盖数据包过滤流程与控制类型。并通过实验演示SNAT和DNAT的配置过程,实现内外网地址转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、iptables表、链结构的概述

1.1 规则链

  • 规则的作用:对数据包进行过滤或处理
  • 链的作用:容纳各种防火墙规则
  • 链的分类依据:处理数据包的不同时机

1.2 默认包括的5个规则链

链名作用
INPUT处理入站数据包 ## 进防火墙读
OUTPU处理出站数据包 出防火墙读
FORWARD处理转发数据包 在数据包进入防火墙还未出去时处理,即转发时处理
POSTROUTING在进行路由选择后处理数据包 ## NAT的时候用的 防火墙也可以做NAT功能 由内向外时用,先查路由表
PREROUTING在进行路由选择前处理数据包 ## 也是NAT的时候用的 外面访问里面的时候用 做映射的时候 先转换目标IP 再查询

1.3 规则表

  • 表的作用:容纳各种规则链
  • 表的划分依据: 防火墙规则的作用相似

1.4 默认包括四个规则表

表名作用
raw表确定是否对该数据包进行状态追踪 DBUG测试的时候用
mangle表为数据包设置标记 打完标记 raw追踪 这两个表配合使用
nat表修改数据包中的源、目标IP地址或端口 地址转换用到,IP映射,端口映射 都会用到
filter表确定是否放行该数据包 ## 核心 用的最多,数据转发一定会用到,默认用的就是这个 表

1.5 表、链的具体对应关系

raw 表PREROUTING链 OUTPUT链
mangle表PREROUTING链 POSTROUTING链 INPUT链 OUTPUT链 FORWARD链
nat表PREROUTING链 POSTROUTING链 OUTPUT链
filter表INPUT链 FORWARD链 OUTPUT链

1.6 数据包过滤的匹配流程

  • 规则表之间的顺序
    raw-mangle-nat-filter
  • 规则链之间的顺序
    入站:PREROUTING-INPUT
    出站:OUTPUT-POSTROUTING
    转发:PREROUTING-FORWARD-POSTROUTING

1.7 规则链内的匹配顺序

  • 按顺序依次检查,匹配即停止(log策略例外)
  • 若找不到相匹配的规则,则按该链的默认策略处理

二、 iptables的基本语法

2.1 基本语法结构

iptables [-t 表名 ] 选项 [ 链名 ] [ 条件] [ -j 控制类型]
  • 注意事项
    不指定表名时,默认指filter表
    不指定链名时,默认指表内的所有链
    除非设置链的默认策略,否则必须指定匹配条件
    选项、链名、控制类型、使用大写字母,其他用小写。

2.2 数据包的常见控制类型

控制类型解释
ACCEPT允许通过
DROP直接丢弃,不给出任何提示
REJECT拒绝通过,必要时会给出提示
LOG记录日志信息,然后传给下一条规则继续匹配

2.3 管理选项

类别选项用途
添加新的规则-A在链的末尾追加一条规则
添加新的规则-I在链的开头,或指定序号插入一条规则
查看规则列表-L列出所有的规则条目
查看规则列表-n以数字的形式显示地址、端口等信息
查看规则列表-v以更详细的方式显示规则
查看规则列表-line-numbers查看规则时,显示序列号
清空、删除规则-D删除链内指定序号(或内容)的一条规则
清空、删除规则-F清空所有的规则
设置默认策略-P为指定的链设置默认规则

2.4 规则的匹配条件

  • 通用匹配
    可直接使用,不依赖于其他条件或扩展
    包括网络协议、IP地址、网络接口等条件
  • 隐含匹配
    要求以特定的协议匹配作为前提
    包括端口、TCP标记、ICMP 类型等条件
  • 显示匹配
    要求以 “-m 扩展模块”的形式明确指出类型
    包括多端口、MAC地址、IP范围、数据包状态等条件。
类别条件类型用法
通用匹配协议匹配-p 协议名
通用匹配地址匹配-s 源地址 -d 目的地址
通用匹配接口匹配- i 入站网卡 -o 出站网卡
隐含匹配端口匹配-sport 源端口 -dport 目的端口
隐含匹配ICMP类型匹配-icmp-type ICMP类型
显示匹配多端口匹配-m multiport --sports
显示匹配IP范围匹配-m iprange --src-range IP范围
显示匹配MAC-m mac --mac-source MAC地址
显示匹配状态匹配-m state --state 连接状态

三、SNAT和DNAT 实验

  • 实验环境
    三台CentOS 7.6 虚拟机
    一台 配置双网卡代表防火墙,ens33代表内网网关 ens36网卡 代表外部网关
    另一台代表外部服务器 ens33网卡 与ens36在同一网段 互通
    一台代表内部服务器 ens33网卡 与防火墙ens36在同一网段 互通
  • 实验步骤
    双网卡的虚拟机与另一台虚拟机都开启apache服务
    清空双网卡防火墙规则 配置SNAT与DNAT规则
  • 实验目的
    内部双网卡虚拟机 访问对方网站,对方日志记录为 SNAT规则指定的地址访问
    外部通过访问 DNAT规则配置的地址,访问内部服务器网站,内部服务器网站日志记录访问的地址来自DNAT规则配置的地址

3.1 防火墙配置

  • 网卡地址配置
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.233.200  netmask 255.255.255.0  broadcast 192.168.233.255
        inet6 fe80::1199:c740:2050:ac62  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:e7:9d:50  txqueuelen 1000  (Ethernet)
        RX packets 275  bytes 27081 (26.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 274  bytes 23792 (23.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@promote ~]# ifconfig ens36
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 12.0.0.1  netmask 255.255.255.0  broadcast 12.0.0.255
        inet6 fe80::2497:36b:6870:267f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:e7:9d:5a  txqueuelen 1000  (Ethernet)
        RX packets 133  bytes 11554 (11.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 4960 (4.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  • 清空防火墙
[root@promote ~]# iptables -F  ## 清空防火墙
[root@promote ~]# setenforce 0  ## 关闭核心防护

3.2 外部服务器配置

  • 网卡配置
[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 12.0.0.12  netmask 255.255.255.0  broadcast 12.0.0.255
        inet6 fe80::9c9:3acb:1c5f:375a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:71:b6:ad  txqueuelen 1000  (Ethernet)
        RX packets 150  bytes 14661 (14.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43  bytes 5479 (5.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  • 开启apache服务
[root@promote ~]# yum -y install httpd
[root@promote ~]# systemctl start httpd
[root@promote ~]# iptables -F  ## 清空防火墙
[root@promote ~]# setenforce 0  ## 关闭核心防护

3.3 内部服务器配置

[root@promote httpd]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.233.50
NETMASK=255.255.255.0
GATEWAY=192.168.233.200

  • 开启apache服务
[root@promote ~]# yum -y install httpd
[root@promote ~]# systemctl start httpd
[root@promote ~]# iptables -F  ## 清空防火墙
[root@promote ~]# setenforce 0  ## 关闭核心防护

3.3 SNAT与DNAT规则的配置

iptables -t nat -I PREROUTING -d 12.0.0.1 -i ens36 -p tcp --dport 80 -j DNAT  --to-destination 192.168.233.200
iptables -t nat -I POSTROUTING -s 192.168.233.200 -o ens36 -j SNAT --to-source 12.0.0.1

<think>好的,我现在需要给用户介绍一下iptables中的SNATDNAT。首先,我得回忆一下自己对这两个概念的理解,确保没有混淆。SNAT是源地址转换,DNAT是目的地址转换,对吗?对的,我记得SNAT主要用于当内部网络的主机访问外部网络时,修改源IP地址,通常是用来共享一个公网IP出口。而DNAT则是当外部网络的主机访问某个公网IP的特定端口时,将其转发到内部网络的某个服务器上,比如端口映射。 接下来,我需要考虑用户可能的背景。用户可能对iptables有一定了解,但需要明确区分这两个NAT类型,或者是在配置网络时遇到了问题。需要从基本概念入手,解释两者的用途典型应用场景,同时给出实际例子,这样用户更容易理解。 需要确认SNATDNATiptables中的具体应用链。SNAT一般用在POSTROUTING链,而DNAT用在PREROUTING链。这是因为SNAT是在路由之后修改源地址,而DNAT是在路由之前修改目标地址,确保数据包能正确路由到内部主机。 同时,应该提到MASQUERADE,这是SNAT的一种特殊形式,适用于动态IP的情况,比如拨号上网。而DNAT常用于将外部请求转发到内部的Web服务器或SSH服务器。 还要注意语法格式,比如SNAT--to-sourceDNAT--to-destination,以及相应的端口映射示例。比如,将外部的80端口请求转发到内网服务器的8080端口。 可能会遗漏一些细节,比如conntrack模块的作用,或者需要开启IP转发功能(net.ipv4.ip_forward=1)。这些虽然不是核心概念,但对于实际配置成功很重要,应该提到。 用户可能想知道什么时候用SNAT,什么时候用DNAT,所以需要明确两者的区别:SNAT改的是发出数据包的源地址,DNAT改的是接收数据包的目标地址。典型的SNAT用例是让多个内网设备通过一个公网IP上网,而DNAT用于从外部访问内网服务。 最后,结构要清晰,分点解释,给出示例命令,并总结两者的区别常见应用场景,这样用户能快速抓住重点。</think>**iptablesSNATDNAT详解** **1. 核心概念对比** - **SNAT(Source NAT)** - 作用:修改数据包源地址 - 典型场景:内网设备共享公网IP访问互联网 - 生效阶段:`POSTROUTING`链(路由决策之后) - 特点:需指定固定IP(如 `--to-source 202.96.128.5`) - **DNAT(Destination NAT)** - 作用:修改数据包目标地址 - 典型场景:公网访问内网服务器 - 生效阶段:`PREROUTING`链(路由决策之前) - 特点:支持端口映射(如 `--to-destination 192.168.1.10:8080`) **2. 配置示例** ```bash # SNAT示例(静态IP环境) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.96.128.5 # SNAT动态IP场景(ADSL拨号) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE # DNAT端口映射(外部80转内部8080) iptables -t nat -A PREROUTING -d 202.96.128.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080 ``` **3. 关键实现原理** - **连接跟踪机制**:依赖`conntrack`模块记录NAT前后的连接状态 - **双向地址转换**:自动处理响应数据包的逆向转换 - **路由决策时机**: - DNAT在路由前修改目标地址,影响后续路由路径 - SNAT在路由后修改源地址,保证出站路径正确 **4. 典型应用场景** - SNAT常见用途: - 企业内网共享上网 - 多服务器负载均衡出口 - 隐藏真实客户端IP - DNAT常见用途: - 家庭宽带映射游戏服务器 - 云服务器端口转发 - 反向代理后端服务 **5. 必要系统配置** ```bash # 启用IP转发(永久生效需修改/etc/sysctl.conf) echo 1 > /proc/sys/net/ipv4/ip_forward ``` **6. 流量路径示意图** ``` 外部访问DNAT流程: 互联网 → 防火墙PREROUTING(DNAT) → 路由决策 → 内网服务器 内部访问SNAT流程: 内网主机 → 路由决策 → 防火墙POSTROUTING(SNAT) → 互联网 ``` **7. 诊断命令** ```bash # 查看NAT表规则 iptables -t nat -nvL --line-numbers # 监控NAT连接状态 conntrack -E ``` **注意**:实际部署时需同步考虑安全策略,建议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值