① 用一个实例深入理解iptables的SNAT/DNAT
文中对于数据包的分析,是本文的核心中的核心, 望读者细读!
这是我前几天遇到的一个实际问题:
我在实验室的服务器(物理机)上启动了一个虚拟机, 虚拟机通过网桥连接了服务器的一个网卡从加入到服务器所在的 内部互连网段 .
这个时候我希望通过访问服务器的指定端口, 来连接虚拟机, 注意我们访问服务器使用的是另一个网卡, 与虚拟机并不在同一个网段!
显然这需要配置DNAT, 但是配置后连接被拒绝, 百思不得解之后在知乎提问:
iptables 配置DNAT连接ssh ,为什么仍然提示端口拒绝
非常感谢
@Virtual @gongjunhe @染红了的枫叶林 三位同志的指点, 现将所学奉上.
我的个人主机, IP为:
物理机服务器, IP为:
虚拟机, IP为:
可以看到H1和H2的em2在同一网段, H3和H2的em1在同一网段
即:
注意:
在下面的截图中,
filter表的默认Target都是Accept;
nat表没有建立任何规则;
Linux的路由转发确保是打开状态.
我们的目标是, 通过H2的11122端口访问H3的22端口,即:
配置如下规则:
此时我们在H2上进行测试:
此时在H1上进行测试:
一个是拒绝连接, 一个是超时,这是为什么呢?
我们看下面这个图, 如果数据从H2上发送, 那么将会经过OUTPUT和POSTROUTING两个链,但是我们的DNAT规则其实是配置在PREOUTING中的,因此我们从H2上访问,实际上并没有进行地址转换,因此连接被拒绝!
因此我们在OUTPUT中再配置一个看看:
再尝试ssh连接:
我们发现和H1一样, 超时了,很好! WHY?
我们分别打印,H2和H1连接H3的时候, H3上的抓包情况:
H2链接时:
H1连接时:
说明H3的的确收到了来自H1和H2的连接请求.
这是因为什么呢?
因为H1和H2的数据包发送到H3, H3想返回数据,但是发现数据发不出去,因为源地址不可达!
以H1为例:
经过上述过程, 就完成了一次通讯!
但是问题出在了第三步,那就是H3没办法将数据包发送到H2中, 因为目的地址其实是
也即,这是H1的地址,因此即使是H3可以路由到H1(在我的机器上的确是这样的),那么也无法完成上述的环路!
怎么办呢?
我们需要将包的源地址,进行SNAT转化,将其修改为H2的地址从而帮助完成环路:
看看,此时是否成功:
H1:
[图片上传失败...(image-eb2b58-1636597174011)]
H2:
解决问题!
那么此时完整的环路是怎样的呢?
还是以H1为例:
上述过程, 用梁耀湘的话说,那就是: 畅通无阻
我们来分析一下, 为什么H2不做SNAT, 也无法成功呢?
前面提到, 想要完成回路,H2必须要接收到来自H3的包, 虽然我上面的拓扑没有画, 但是其实H3是可以访问到H2.
但是依然不行, 这个是因为H3回到H2的包源地址和目标地址必须是确定的,这样才能根据DNAT的记录去恢复原来的地址.
但是H3访问H2其实也是通过SNAT转发, 这样回到H2的时候, 源地址其实已经改变了,因此依然无法完成回路.
那么如果H3可以直接把数据给到H2,是不是就不用SNAT了呢?是的!
但是我们要用H2另一个网段, 即
我们分析下环路:
这个关键的过程由于两者在同一网段,是可以轻松实现的.
那么这种情况下是不需要进行SNAT的.当然了,这种配置是没有价值的!
② iptables参数详解
iptables [-t table] COMMAND chain CRETIRIA -j ACTION
处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则链的过滤,并依照前述流程继续进行下一个规则链的过滤,一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。
③ 基础知识Iptables
链是放在表中的,总共有四个表,每个表有不同的优化级:raw>mangle >nat> filter
是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,一般在高并发时有可能会用到,来设置一些连接不跟踪状态,防止ip_conntrack文件被撑爆
很少用
主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,可以实现分流功能
很少用
主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT),一般在作为网关服务器上会用到,搭建过openvpn的话,肯定会用到。
主要用于对数据包进行过滤,有DROP、ACCEPT、REJECT、LOG等,默认的规则是添加到filter表
当数据包到达这些位置的时候会调用这些函数,在这些位置上我们可以对数据包的内容进行修改,达到控制的目的,这5个挂载点分别是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。也就是我们常说的五条链。
每个表中都有对应的链,因此有个优先级,会以高优先级为准
iptables [-t 表名] 管理选项 [链名] [匹配条件] [ -j 控制类型]
命令格式
iptables [-t 表名 ] [-A |-I |-R] <链名><控制类型>
命令格式
iptables [-t 表名 ] -D <链名><控制类型> 或者 iptables [-t 表名 ] -D <链名> [id]
命令格式 iptlables [-t 表名 ] -P <链名><控制类型>
一般不会设置
iptables [-t 表名] -F [链名]
在vpn搭建过程中要替换掉虚拟ip的网段,就要用到SNAT,因为安全组中会校验ip,所以这个是关键
条件
demo
④ iptables的简单使用方法
mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。
定义允许或者不允许的
iptables -t filter -A INPUT -j DROP -p tcp --dport 8081
过滤发往本机的8081端口的所有包被丢弃
用途:网络地址转换;修改目的端口或目的地址以及原地址
iptables -t nat -A PREROUTING -p tcp --dport 7788 -j DNAT --to 192.168.0.11:7799
iptables -t nat -A POSTROUTE -p tcp -d 192.168.0.11 --dport 7799 -j SNAT --to 192.168.0.12
1. “四表” 是指,iptables的功能——filter, nat, mangle, raw.
filter, 控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),可以控制的链路有input, forward, output
nat, 控制数据包中地址转换,可以控制的链路有prerouting, input, output, postrouting
mangle,修改数据包中的原数据,可以控制的链路有prerouting, input, forward, output, postrouting
raw,控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output
注:在centos7中,还有security表,不过这里不作介绍
2. “五链” 是指内核中控制网络的NetFilter定义的五个规则链,分别为
PREROUTING, 路由前
INPUT, 数据包流入口
FORWARD, 转发管卡
OUTPUT, 数据包出口
POSTROUTING, 路由后
3 .堵通策略 是指对数据包所做的操作,一般有两种操作——“通(ACCEPT)”、“堵(DROP)”,还有一种操作很常见REJECT.
谈谈REJECT和DROP之间的区别,Ming写了一封信,向Rose示爱。Rose如果不愿意接受,她可以不回应Ming,这个时候Ming不确定Rose是否接到了信;Rose也可以同样写一封信,在信中明确地拒绝Ming。前一种操作就如同执行了DROP操作,而后一种操作就如同REJECT操作。
4.iptables命令的语法规则
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
-t table,是指操作的表,filter、nat、mangle或raw, 默认使用filter
COMMAND,子命令,定义对规则的管理
chain, 指明链路
CRETIRIA, 匹配的条件或标准
ACTION,操作动作
例如,不允许10.8.0.0/16网络对80/tcp端口进行访问,
iptables -t filter -A INPUT -s 10.8.0.0/16 -d 172.16.55.7 -p tcp --dport 80 -j DROP
查看iptables列表
iptables -nL
5.链管理
-N, --new-chain chain:新建一个自定义的规则链;
-X, --delete-chain [chain]:删除用户自定义的引用计数为0的空链;
-F, --flush [chain]:清空指定的规则链上的规则;
-E, --rename-chain old-chain new-chain:重命名链;
-Z, --zero [chain [rulenum]]:置零计数器;
-P, --policy chain target, 设置链路的默认策略
6.规则管理
-A, --append chain rule-specification:追加新规则于指定链的尾部;
-I, --insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部;
-R, --replace chain rulenum rule-specification:替换指定的规则为新的规则;
-D, --delete chain rulenum:根据规则编号删除规则;
7.查看规则
-L, --list [chain]:列出规则;
-v, --verbose:详细信息;
-vv, -vvv 更加详细的信息
-n, --numeric:数字格式显示主机地址和端口号;
-x, --exact:显示计数器的精确值;
--line-numbers:列出规则时,显示其在链上的相应的编号;
-S, --list-rules [chain]:显示指定链的所有规则;
查看规则的一般内容:
⑤ iptables(一)链、表的简介和表的基本操作
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
filter表——用于存放所有与防火墙相关操作的默认表。通常用于过滤数据包。
nat表——用于网络地址转换
mangle表——用于处理数据包
raw表——用于配置数据包,raw 中的数据包不会被系统跟踪。
PREROUTING: raw -> mangle -> nat
INPUT: mangle -> filter
FORWARD: mangle -> filter
OUTPUT: raw -> mangle -> nat -> filter
POSTROUTING: mangle -> nat
raw 表:PREROUTING,OUTPUT
mangle表:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表:PREROUTING,OUTPUT,POSTROUTING
filter 表:INPUT,FORWARD,OUTPUT
ACCEPT: 允许数据包通过
DROP:直接丢弃数据包,不给任何回应信息
REJECT:拒绝数据包通过,需要时会给数据发送端一个相应信息
SNAT:原地址转换,解决内网用户用同一个公网地址上网的问题
MASQUERADE:是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上
DNAT:目标地址转换
REDIRECT:在本机做端口映射
LOG:在/var/log/messages 文件中记录日志信息。然后将数据包传递给下一条规则。也就是只记录不做任何操作。
示例:
比如,我想要将主动连接22号端口的报文的相关信息都记录到日志中,并且把这类记录命名为"want-in-from-port-22",则可以使用如下命令
如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作。
查看表中规则 iptables -t table_name -L [chain_name]
示例:
上面示例可以看到有哪些链是支持过滤的
在不指定表时默认查询 filter 表 iptables -L [chain_name] (注意大小写)
示例:
示例:
这个时候在192.168.55.132这个主机上 ping 测试机是不通的。此时在表的首部在添加一个允许的操作
这个时候在192.168.55.132这个主机上 ping 测试机发现可以 ping 通
所以规则的顺序很重要
示例:
示例:
关于链默认规则说明
不能省略 -s 如果省略效果如下
source 变为0.0.0.0/0 表示所有网段都被 ACCEPT
示例
默认情况下添加的规则都是临时的,当重启 iptables 或者重启系统时规则将丢失
示例:
⑥ 哪位大哥知道iptables -t 是干什么的 谢谢
iptables -t 这个是指定表的,
默认你要是不加这个选项的话是用的 filter这张表
如iptables -A INPUT -p tcp --dport 22 -j ACCEPT默认就加到filter这个表里
如iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 202.96.134.130:80 这个就是加载到nat这张表内
iptables的4个表,5个链:
4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。
filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。
⑦ IPTABLES 详解
引言
先来看一条常用的iptables命令:
Iptables(-t filter) -I INPUT -p tcp --dport ssh/22 -j ACCEPT
这一条命令,生成了一条规则。允许所有22端口的TCP连接。
这条规则作用表是filter表,即iptables默认表。作用链是INPUT链。
规则就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
原理
Iptables通过对数据包的控制实现防火墙功能,看下图:
数据包进入机器后,要根据数据包信息对数据包进行相关处理
(1) 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。
(2) 如果数据包就是进入本机的,它就会沿着图方向移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。
(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示方向移动,经过 FORWARD链,然后到达POSTROUTING链输出。
链(chains)是规则校验序列及数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
iptables -P INPUT (DROP|ACCEPT)默认是关的/默认是开的
该命令设置链的默认目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略
表(tables)是相同规则集合,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理四种不同的功能。
3、规则表之间的优先顺序:
Raw——mangle——nat——filter
每个表包含的数据链不同,在进行处理的时候注意需求,要在哪一链上操作。
(1)RAW表
只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
(2)mangle表
主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)
(3)nat表
主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,由于转换的特性,需进行目的地网址转换的数据包,就不需要进行来源网址转换,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把数据包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转换外,请不要做其它用途。NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)
(4)filter表
主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改
命令
iptables [-t 表] -命令 匹配 操作
-A是append命令,添加的规则在最后
-D是删除命令,删除第几条规则
-I是插入命令,添加的规则在第一条
!是取反操作
Sport 是源端口
Dport 是目的端口
列出各个表的规则命令:
iptables -nvL
iptables -t nat -nvL
iptables -t mangle -nvL
iptables -t raw -nvL
iptables -t filter -nvL
iptables -t raw -A PREROUTING -s 182.50.124.75 -j ACCEPT
REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
MASQUERADE 改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
LOG 将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT 改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR 镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。
RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
保存规则
使用iptables程序建立的规则只会保存在内存中,通常我们在修改了iptables的规则重启 iptables 后,之前修改的规则又消失了。那么如何保存新建立的规则呢?
方法1、对于RHEL和ceontos系统可以使用service iptables save将当前内存中的规则保存到 /etc/sysconfig/iptables 文件中
[root@lampbo ~]# service iptables save
方法2、修改/etc/sysconfig/iptables-config 将里面的IPTABLES_SAVE_ON_STOP="no", 这一句的"no"改为"yes"这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去。
加入开机启动项
chkconfig --level 345 iptables on
UBUNTU系统
没有上述东西,只能使用保存命令保存当前规则。
重启的就用自启动脚本加载已经保存的规则。
/etc/network/interfaces脚本自动应用
auto eth0 iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules post-down iptables-save > /etc/iptables.up.rules
iptables --save
https://wangchujiang.com/linux-command/c/iptables.html#%E5%90%AF%E5%8A%A8%E7%BD%91%E7%BB%9C%E8%BD%AC%E5%8F%91%E8%A7%84%E5%88%99
其他问题
ip_conntrack: table full, dropping packet的问题
在启用了iptables web服务器上,流量高的时候经常会出现下面的错误:
ip_conntrack: table full, dropping packet
这个问题的原因是由于web服务器收到了大量的连接,在启用了iptables的情况下,iptables会把所有的连接都做链接跟踪处理,这样iptables就会有一个链接跟踪表,当这个表满的时候,就会出现上面的错误。iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。所以解决方法一般有两个:(1)加大 ip_conntrack_max 值vi /etc/sysctl.confnet.ipv4.ip_conntrack_max = 393216net.ipv4.netfilter.ip_conntrack_max = 393216(2):降低 ip_conntrack timeout时间vi /etc/sysctl.confnet.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120上面两种方法打个比喻就是烧水水开的时候,换一个大锅。一般情况下都可以解决问题,但是在极端情况下,还是不够用,怎么办?这样就得反其道而行,用釜底抽薪的办法。iptables的raw表是不做数据包的链接跟踪处理的,我们就把那些连接量非常大的链接加入到iptables raw表。如一台web服务器可以这样:iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACKiptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
使用注意事项
在默认链规则是accept的情况下,规则最后要加drop或reject,否则相当于没加规则
一般先添加允许自己IP的所有数据包的规则,否则添加drop规则后会被屏蔽
⑧ linux下iptables的nat关于SNAT和DNAT转发实验
一、概述 1. 什么是NAT 在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC学校换成自己的MAC学校以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation中国络学校翻译)恰恰是出于某种特殊需要而对数据包的源ip学校、目的ip学校、源端口、目的端口进行改写的操作。 2. 为什么要进行NAT 我们来看看再什么情况下我们需要做NAT。 假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP学校都是伪IP,但是部分用户要求建立自己的WWW服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以在防火墙的外部中国卡上绑定多个合法IP学校,然后通过NAT技术使发给其中某一个IP学校的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。 再比如使用拨号上中国的中国吧,因为只有一个合法的IP学校,必须采用某种手段让其他机器也可以上中国,通常是采用 中国服务器的方式,但是中国服务器,尤其是应用层中国服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待中国服务器支持该新应用的升级版本。如果采用NAT来解决这个问题, 因为是在应用层以下进行处理,NAT不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。 还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明中国,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。 3. NAT的类型 在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源学校,所谓DNAT就是改变转发数据包的目的学校。 二、原理 在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。 同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是: PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip学校,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT; POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。 OUTPUT:定义对本地产生的数据包的目的NAT规则。 三、操作语法 如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项: 1. 对规则的操作 加入(append) 一个新规则到一个链 (-A)的最后。 在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。 在链内某个位置替换(replace) 一条规则 (-R)。 在链内某个位置删除(delete) 一条规则 (-D)。 删除(delete) 链内第一条规则 (-D)。 2. 指定源学校和目的学校 通过--source/--src/-s来指定源学校(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的学校。可以使用以下四中方法来指定ip学校: a. 使用完整的域名,如“至美.linuxaid中国中国”; b. 使用ip学校,如“192.168.1.1”; c. 用x.x.x.x/x.x.x.x指定一个中国络学校,如“192.168.1.0/255.255.255.0”; d. 用x.x.x.x/x指定一个中国络学校,如“192.168.1.0/24”这里的24表明了子中国掩码的有效位数,这是 UNIX环境中通常使用的表示方法。 缺省的子中国掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。 3. 指定中国络接口 可以使用--in-interface/-i或--out-interface/-o来指定中国络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的中国络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的中国络接口。 4. 指定协议及端口 可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。 四、准备工作 1. 编译内核,编译时选中以下选项,具体可参看“用iptales实现包过虑型防火墙”一文: Full NAT MASQUERADE target support REDIRECT target support 2. 要使用NAT表时,必须首先载入相关模块: modprobe ip_tables modprobe ip_nat_ftp iptable_nat 模块会在运行时自动载入。 五、使用实例 1. 源NAT(SNAT) 比如,更改所有来自192.168.1.0/24的数据包的源ip学校为1.2.3.4: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4 这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。 有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上中国的时候使用,或者说在合法ip学校不固定的情况下使用。比如 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 可以看出,这时候我们没有必要显式的指定源ip学校等信息。 2. 目的SNAT(DNAT) 比如,更改所有来自192.168.1.0/24的数据包的目的ip学校为1.2.3.4: iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4 这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。 有一种DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的ip学校改为数据包进入系统时的中国络接口的ip学校。通常是在与squid配置形成透明中国时使用,假设squid的监听端口是3128,我们可以通过以下语句来将来自192.168.1.0/24,目的端口为80的数据包重定向到squid监听 端口: iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-port 3128 六、综合例子 1. 使用拨号带动局域中国上中国 小型企业、中国吧等多使用拨号中国络上中国,通常可能使用中国,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域中国上中国。 成功升级内核后安装iptables,然后执行以下脚本: #载入相关模块 modprobe ip_tables modprobe ip_nat_ftp #进行ip伪装 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 2. ip映射 假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP学校都是伪IP,但是部分用户要求建立自己的WWW服务器对外发布信息。我们可以再防火墙的外部中国卡上绑定多个合法IP学校,然后通过ip映射使发给其中某一个IP学校的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。 我们假设以下情景: 该ISP分配给A单位至美服务器的ip为: 伪ip:192.168.1.100 真实ip:202.110.123.100 该ISP分配给B单位至美服务器的ip为: 伪ip:192.168.1.200 真实ip:202.110.123.200 linux防火墙的ip学校分别为: 内中国接口eth1:192.168.1.1 外中国接口eth0:202.110.123.1 然后我们将分配给A、B单位的真实ip绑定到防火墙的外中国接口,以root权限执行以下命令: ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0 ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0 成功升级内核后安装iptables,然后执行以下脚本: #载入相关模块 modprobe ip_tables modprobe ip_nat_ftp 首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT): iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100 iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200 其次,对防火墙接收到的源ip学校为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT): iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100 iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200 这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分 别被伪装成由202.110.123.100和202.110.123.200,从而也就实现了ip映
⑨ 防火墙iptables的包过滤的基本流程
简单地说来,就是设定一些规则,自对进来和出去的数据包的ip做检查,符合规则的通行,不符合的做响应的处理,要了解这个流程中的三个表:
nat表,filter表,mangle表,
五条链:INPUT链,OUTPUT链,FORWARD链,PREROUTING链,POSTROUTING链。
1)对于进来的包:经过IP校验后,经过第一条链PREROUTING处理,一般是做DNAT;然后经过路由,决定是到本地的还是需要转发的包。
a、如果是到本地的,就经过INPUT链处理,比如过滤等,经过处理后发往上层协议。
b、如果是需要转发的,经过FORWARD链处理,一般是做过滤,然后经过路由代码,再经过POSTROUTING链处理(主要是做SNAT),再传输到网络上。
2)对于本地产生的包:先经过OUTPUT链处理,若过滤可以后,进行路由选择处理,然后经过POSTROUTING做SNAT处理后发送到网络上。
大概的原理就是这样,啰啰嗦嗦一对不如去看看netfilter网站,讲得更清楚一些。