注:整理自网络文章
iptables是针对
Linux防火墙 netfilter的管理配置工具。在进行iptables防火墙设置前,必须打开系统内核的IP转发功能,使系统成为路由器。在Red Hat中有以下两种方法实现:
1.修改内核变量
ip_forward
#echo "1" > /proc/sys/net/ipv4/ip_froward
2.修改脚本
/etc/sysconfig/network
将
FROWARD_IPV4=false 改为 FROWARD_IPV4=true
一、数据包流经netfilter防火墙的路径
IPtables 是对数据包的源、目的地址进行判断或修改的工具
1.
流入本机数据包的路径:
所属表
mangle
nat
mangle
nat
filter
网络数据包
à
PREROUTING
à
PREROUTING
à 路由选择
à
INPUT
à
INPUT
à
INPUT
à 本地处理进程
2.
流出本机数据包的路径:
所属表
mangle
filter
mangle
nat
本地处理进程
à
OUTPUT
à
OUTPUT
à 路由选择
à
POSTROUTING
à
POSTROUTING
à 外部网络
3.
流经本机转发的数据包的路径:
所属表
mangle
nat
mangle
filter
mangle
nat
A端网络
à
PREROUTING
à
PREROUTING
à 路由选择
à
FORWARD
à
FORWARD
à
POSTROUTING
à
POSTROUTING
à
B端网络
注:①.路径上某表链规则匹配数据包并进行ACCEPT、DROP、REJECT操作时,ACCEPT使数据包直接到达目的地,DROP和REJECT则当场丢弃数据包,该数据包不会在后续路径上再出现,故会影响其它表的操作。
②.PREROUTING和POSTROUTING链只对请求连接的包进行操作,对属于该连接的后续包,不予比对规则,只按已确定的规则自动进行操作,因此建议不要在此链上作过滤操作,否则将漏掉对后续包的过滤。
二、iptables指令的基本格式:
<
iptables
>
[-t table]
<
COMMAND
>
[chains] [rule-matcher] [ -j target ]
<指
令
>
[指定表
]
<指定操作命令
>[指定链
]
[指定匹配规则
]
[指定目标动作
]
注:<>括起来的为必设项,[]括起来的为可设项。iptables指令要求严格区分大小写
!
三、iptables指令的语法规则要素:
1
、netfilter表(Table)
netfilter的表操作是以
-t或--table<table>来指定的,未指定时默认为filte表。共有以下三种表:
①
.Filter表
(过滤表)
②
.Nat表
(网络地址转换表)
③
.Mangle表
(数据包处理表)
2
、常用操作命令(Command)
-A 或
--append 在所选的链尾加入一条或多条规则。
-D 或
--delete 从所选的链中删除一条或多条匹配的规则。
-R 或
--replace 在所选的链中替换一条匹配的规则,需指定规则中的数字。
-I 或
--insert 按给出的规则号在所选的链中插入一条规则。
-L 或
--list 列出指定链的全部规则,如未指定链,则列出所有链的全部规则。
-F 或
--flush 清除指定链和表中的全部规则,如未指定链,则所有链都将被清。
-N 或
--new-chain 以给定的名字创建一条新的用户自定义链,不能与已有的链同名。
-X 或
--delete-chain 删除指定的用户自定义链,必须保证链中的规则不在使用才能删除,若未指定链,则删除所有用户自定义链。
-P 或
-
-policy 为内置链指定默认规则
(链政策
)。用户自定义链没有默认规则,其默认规则是规则链中的最后一条规则,用
-L命令时它显示在第一行。
-E 或
-
-rename-chain 根据用户给出的名字对指定的自定义链进行重命名,该命令不影响
Table的结构。
-C 或
--check 检查给定的包是否与指定的规则相匹配。
-Z 或
--zero 将指定链中所有规则的数据包(PKTS)和字节(byte)计数器清零。该计数器用来计算同一数据包出现的次数,是过滤阻断式攻击不可或缺的工具。
-h 或
--help 给出当前命令语法的简短说明。
3
、链(Chains)
①
.INPUT链 处理输入包的规则链。
②
.OUTPUT链 处理输出包的规则链。
③
.FORWARD链 处理转发包的规则链。
④
.PREROUTING链 对到达且未经路由判断之前的包进行处理的规则链。
⑤
.POSTROUTING链 对发出且经过路由判断之后的包进行处理的规则链。
⑥
.用户自定义链 是由filter表内置链来调用的,它是针对调用链获取的数据包进行处理的规则链。
注:①.Filter表有INPUT、OUTPUT、FORWARD和自定义四种链形式。
②.Nat表有OUTPUT、PREROUTING、POSTROUTING三种链形式。
③.Mangle表有INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING五种链形式。
4
、常用匹配规则(rule Matcher)
-c或
--set-counters 重新设置规则的计数器,可指定PKTS和BYTES选项来设置计数器计数规则。
-s 或
--source [!] address[/mask] 指定匹配规则的源主机名称、源IP地址或源IP地址范围。
--sport 或
--source-port [!] port[:port]
指定匹配规则的源端口或源端口范围,可用端口号,也可用
/etc/services文件中的名字, 端口范围格式xxx:yyy。
-d 或
--destination [!]address[/mask] 指定匹配规则的目的地址或目的地址范围。
--dport 或
--destination-port [!] port[:port]
指定匹配规则的目的端口或目的端口范围,可用端口号,也可用
/etc/services文件中的名字, 端口范围格式xxx:yyy。
-i 或
--in-interface [!]interface name[+]
指定匹配规则的对内网络接口名,默认则符合所有接口,可制定暂未工作的接口,待其工作后才起作用,该选项只对
INPUT、FROWARD和PREROUTING链是合法的。
-o 或
—out-interface [!]interface name[+]
指定匹配规则的对外网络接口名,默认则符合所有接口,可制定暂未工作的接口,待其工作后才起作用,该选项只对
OUTPUT、FROWARD和POSTROUTING链是合法的。
-j 或
--jump 指定规则的目标即动作或跳转,如未指定则此规则无任何效果。
-p 或
--protocol [!] protocol
指定匹配规则的通讯协议,如:
tcp、udp、icmp、all,如未指定则匹配所有通讯协议。
--icmp-type [!]typename 指定匹配规则的
ICMP消息类型,选项后需有一个icmp名称类型、数字类型(如3)、或一对用/号分隔的数字类型和编码(如3/3),可用以下命令查看有效的icmp类型名表: iptables -p icmp -h
-f 规则应用于
IP数据包第二分片以后的分片。
--tcp-option 这个选项后需接一个数字,用来匹配
tcp选项等于该数字的数据包。如果需要检查tcp选项,那些tcp表头部完整的数据包就会被自动删除。
--tcp-flags 此选项后需接
2个参数,以对TCP标志进行筛选。第一个参数表示屏蔽(MASK),它可用来指定数据包中需要检查的TCP标志,而第二个参数表示需要设置的标准,可用的标志包括:SYN、ACK、FIN、RST、URG、PSH、ALL和NONE等,如果指定多个标志,则每个标志间需以逗号分隔。以下范例表示所有标志都要检查,但只有SYN和ACK被设置。
iptables –A INPUT –protocol tcp –tcp-flags ALL SYN,ACK –j DENY
-l 在系统日志
/var/log/messages中记录与该规则匹配的数据包。
-v 详细输出。
-n 当显示时
,不对IP地址执行DNS查找。
[!] -y -y表明
tcp握手中的连接请求标志位SYN;!-y表示对该请求的响应。
[!]-syn 指定仅仅匹配设置了
SYN位,清除了ACK、FIN位的TCP包,该参数仅针对TCP协议类型使用。
-m -state 标记数据包。
注:“!”为逻辑非;接口名后跟“+”表示所有以此接口名开头的接口都会被匹配。
附:
匹配条件扩展:
TCP-----匹配源端口,目的端口,及tcp标记的任意组合,tcp选项等。
UPD-----匹配源端口和目的端口
ICMP----匹配ICMP类型
MAC-----匹配接收到的数据的mac地址
MARK----匹配nfmark
OWNE----(仅仅应用于本地产生的数据包)来匹配用户ID,组ID,进程ID及会话ID
TOS——匹配IP头的TOS字段的值。
LIMIT---匹配特定时间段内的数据包。这个扩展匹配对于限制dos攻击数据流非常有用。
STATE---匹配特定状态下的数据包(由连接跟踪子系统来决定状态),可能的状态包括:
INVALID 不匹配于任何连接的数据包
ESTABLISHED 属于某个已经建立的连接的数据包
NEW 请求建立连接的数据包
RELATED 属于某个已建立连接产生的新连接的数据包,例如一个ICMP错误消息或ftp数据连接
5、目标动作(Target)
当规则匹配一个包时,要执行的目标动作以
-j参数标识。
①.Filter表的目标动作:
ACCEPT 允许数据包通过。
DROP 丢弃数据包。
②.Nat表的目标动作:
SNAT 修改数据包的源地址。
MASQUERADE 修改数据包的源地址,只用于动态分配
IP地址的情况。
DNAT 修改数据包的目标地址。
REDIRECT 将包重定向到进入系统时网络接口的
IP地址,目标端口改为指定端口。
③.Mangle表的目标动作:
TTL
TOS 用来设置
IP表头中
8位长度的
TOS字段的值,此选项只在使用
Mangle Tables时才有效。
MARK 对数据包进行标记,供其它规则或数据包处理程序使用,此选项只在
Mangle表中使用。
④.扩展的目标动作:
REJECT 丢弃数据包的同时返回给发送者一个可配置的错误信息。
LOG 将匹配的数据包信息,传递给syslog()进行记录。
ULOG
将匹配的数据包信息,使用用户空间的log进程进行记录。
MIRROR 互换源和目的地址以后重新传输该数据包。
TOS 改写包的
TOS值。
QUEUE
表示把这个包重导入本机的队列中。
RETURN 表示跳离这条链的匹配,如果是用户自定义链,就会返回原链的下一个规则处继续检查,如果是内置链,那会参考政策来处理数据包。
注:要使用扩展的目标动作,必须在内核中激活相应选项或装载相应内核模块。
四、iptables中SNAT与DNAT的说明
DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映射。
SNAT(Source Network Address Translation,源地址转换)通常被叫做源映射。
在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables 的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。
图中正菱形的区域是对数据包进行判定转发的地方。在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址,数据将会被转交给INPUT链。如果不是本机地址,则交给FORWARD链检测。
DNAT要在进入这个菱形转发区域之前,也就是在PREROUTING链中进行操作。
SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作。
五、iptables中SNAT与MASQUERADE的说明
MASQUERADE 是动态的源地址映射,他可以动态根据路由中不同的 nexthop 来动态修改 WAN 地址。
SNAT 是静态指定的源地址映射,数据包只能欺骗成 被指定的IP 地址。
举个例子:
有两条线路
eth0 1.1.1.1 gw 1.1.1.254,线路1
eth1 2.2.2.1 gw 2.2.2.254,线路2
eth2 192.168.0.254,内网地址
如果使用了 iproute2 的 equalize 做了权值路由负载均衡,那么数据包是根据设置的权值走不同路由出去的。
如果使用 -j MASQUERADE 做 NAT,那么数据包会根据不同的 nexthop 来动态修改 WAN 地址
但如果使用 -j SNAT --to 1.1.1.1,类似这样做,那么数据包只能欺骗成 1.1.1.1 出去
试想,一个从 2.2.2.254 出去的数据包,源地址却为 1.1.1.1,回来的时候是怎样走的?绕了一圈,这样的话,根本没起到链路负载均衡的目的,我们需要的是数据流单独走单独回来,因此这里使用 -j MASQUERADE 就对了
六、iptables规则集的保存、恢复和启动
1
、保存与恢复
用
iptables指令在内存中逐条建立起来的规则集,经测试通过后,可用iptables-save命令保存,其中/etc/sysconfig/iptables是iptables守护进程调用的默认规则集文件。
保存规则集命令:
#/sbin/iptables-save > /etc/sysconfig/iptables
恢复规则集命令:
#/sbin/iptables-restore < /etc/sysconfig/iptables
2
、iptables规则集脚本的启动
①.默认脚本的启动
Red Hat iptables的启动脚本文件
/etc/rc.d/init.d/iptables在每次启动时都要使用/etc/sysconfig/iptables提供的规则进行规则恢复,并可以使用如下命令保存规则:
#service iptables save
②.自定义脚本的启动
用户可以在自定义脚本中直接用
iptables命令编写一个规则集,并在启动时执行这个脚本。设用户自定义脚本文件名为/etc/fw/rules,则可以在启动脚本/etc/rc.d/rc.local中加入代码:if[-x/etc/fw/rules];then /etc/fw/rules;fi;即可在每次启动时执行该脚本。
注:如果使用此种方式,建议使用ntsysv命令关闭系统的iptables守护进程。