linux命令学习:iptables详解1

一、iptables简介

什么是iptables?


iptables是Linux下功能强大的应用层防火墙工具,但了解其规则原理和基础后,配置起来也非常简单。

什么是Netfilter?


说到iptables必然提到Netfilter,iptables是应用层的,其实质是一个定义规则的配置工具,而核心的数据包拦截和转发是Netfiler。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块。

iptables和Netfilter关系图:

在这张图可以看出,Netfilter作用于网络层,数据包通过网络层会经过Netfilter的五个挂载点(Hook point):PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。

任何一个数据包,只要经过本机,必将经过这五个挂载点的其中一个。

iptables规则原理


iptables的规则组成,又被称为四表五链:

四张表 + 五个挂载点 + 规则<br><br>四张表:filter表、nat表、mangle表、raw表<br><br>五个挂载点:PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING

具体来说,就是iptables每一条允许/拒绝或转发等规则必须选择一个挂载点,关联一张表。

规则代表了对数据包的具体操作,挂载点代表了操作的位置,表代表了作用的目的。

iptables的四张表


现在用的比较多的表是前两个:

1、filter 用于过滤;

2、nat 用于地址转换;

3、mangle 修改数据包;

4、raw 一般是为了不再让iptables做数据包的链接跟踪处理,跳过其他表,提高性能;

数据包在规则表、挂载点的匹配流程图


以下这张图是数据包经过挂载点的流程图,在每个挂载点可以看到有哪些表可以用于定义规则:

对于filter表一般只能做在3个链上:INPUT、FORWARD、OUTPUT;

对于nat表一般也只能做在3个链上:PREROUTING、OUTPUT、POSTROUTING。

Linux iptables:规则组成


这是iptables一条规则的基本组成,也是iptables定义规则的命令格式:

第一列是iptables命令;

第二列指定规则所在的表,常用的是nat和filter表;

第三列是命令,常用命令如下:

-A 在指定链的末尾添加(append)一条新的规则
-D 删除( delete )指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-F 清空(flush)规则
-P 设置指定链的默认策略(policy)
-n 使用数字形式(numeric)显示输出

第四列是指定规则作用的挂载点;

第五列是选项,常用选项如下:

-p 指定协议
-s 源地址
-d 目的地址
--sport 源端口号
--dport 目的端口号
--dports 目的端口号列表
-m 补充

第六列是规则,常用规则如下:

ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息
SNAT 对数据包源地址改写
DNAT 对数据包目的地址改写
LOG 记录数据包

默认的iptables表名叫"filter(过滤器)"。网络数据包都使用这个表里的规则链来过滤。

过滤器表包含3个默认链。
对于每个包来说,内核都会选择三个链中适合的一个进行处理:
. FORWARD链规则, 用于从一个网络接口输入,再转发到另一个网络接口输出的包;
. INPUT链规则,   用于以本机为目的地的包;
. OUTPUT链规则,  用于从本地主机发出的包;

这3个标准链通常能够满足两个网络接口之间防火墙的全部需要。
如果必要,您还可以定义一个定制的配置,支持更复杂的记账或者路由场合。


除了filter表之外,iptables还包含"NAT"和"mangle"表。
. NAT表包含的规则链控制着NAT(Network Address Translation,网络地址转换,这里的“nat”就是iptables表名,
  "NAT"是一般地址转换机制的叫法)。
  12.4.6节讨论了NAT,本节给出一个正在起作用的nat表的例子。
  在本节后面的内容里,我们会使用nat表的PREROUTING链来做反IP欺骗的包过滤。
. mangle表包含了链可以修改或者改变在NAT和包过滤之外的网络包的内容。
  虽然mangle表对于做包的特殊处理很方便,比如重新设定IP包的ttl值,但是在大多数工作环境中一般不会用到它。
  我们在这一节里只讨论filter和nat表,而把mangle表留给读者自己去探索。

图1比较完整地展示了一个数据包是如何经过防火墙的,考虑到节省空间,该图实际上包了三种情况:
. 来自外部,以防火墙(本机)为目的地的包,走图1中 "自上至下左边" 路径;
. 由防火墙(本机)生成并输出的包,        走图1中从"本地进程"开始,自上至下左边的路径;
. 来自外部,目的地是其它主机的包,      走图1中"自上至下走右边"的路径;
图1:

如果我们从上图中略去比较少用的mangle 表的图示,就有图2所显示的更为清晰的路径图.
图2:

构成一条链的每条规则都有一个"target(目标)"子句,它决定了如何处理匹配的包。
一旦某个包匹配了一个规则,那么它的结局就确定了,不再用其他规则来检查它。
虽然iptables内部定义了许多target,但是还可以指定另一条链作为规则的target。


在filter表中的规则可以使用的target子句有
  ACCEPT、DROP、REJECT、LOG、MIRROR、QUEUE、REDIRECT、RETURN和ULOG。
. 当一条规则落在了ACCEPT上的时候,匹配这条规则的包就可以继续通过。
. DROP和REJECT都会把它们的包丢弃。DROP是默默地丢弃,而REJECT会返回一则ICMP错误消息。
. LOG提供跟踪包匹配规则情况的简单办法,ULOG提供了范围更广的日志记录信息。
. REDIRECT把包分流到一个代理,而不是直接让它们通过。
  您可能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。
. RETURN终结用户定义的链,类似于子例程调用中的return语句。
. MIRROR目标在发送包之前交换IP源和目的地址。
. QUEUE通过一个内核模块把包交给本地用户程序。

Linux防火墙通常是由rc启动脚本中的一系列iptables命令来实现的。
各个iptables命令通常采取下列形式之一:
 iptables -F chain-name
 iptables -P chain-name target
 iptables -A chain-name -i interface -j target
. 第一种形式(-F)把之前所有的规则都从链中清除掉。
. 第二种形式(-P)给链设置一条默认策略(也就是target)。我们建议您使用DROP作为链默认的目标(target)。
. 第三种形式(-A)把当前的说明追加到链上。
  除非使用-t参数指定了表(table)名,否则命令被默认应用到filter表上。
  -i参数将规则应用到有名字的接口上,-j则标识出目标(target)。

iptables还接受许多别的子句,表1给出了其中的一部分。
表1


二、IP 规则的保存与恢复

1. 规则保存 
"iptables-save"命令 把规则保存到文件中
再由目录"/etc/rc.d"下的脚本(/etc/rc.d/init.d/iptables)自动装载.
使用命令iptables-save 来保存规则,
一般用命令:
#  iptables-save > /etc/sysconfig/iptables

生成保存规则的文件为: /etc/sysconfig/iptables;
也可以用命令:
#  service iptables save

它能把规则自动保存在/etc/sysconfig/iptables 中。

2. 规则恢复
当计算机启动时,rc.d 下的脚本将用命令iptables-restore 调用这个文件,从而就自动恢复了规则。

3. iptables服务操作
检查:
#  service --status-all
...
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       all  --  10.0.0.0/8           0.0.0.0/0           
2    DROP       all  --  172.16.0.0/12        0.0.0.0/0           
3    DROP       all  --  192.168.0.0/16       0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x16/0x02 limit: avg 1/sec burst 5 
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x04 limit: avg 1/sec burst 5 
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8 limit: avg 1/sec burst 5 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination  
...

启动:
# service iptables start
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

停止:
# service iptables stop
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]

重启:
# service iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

4. 彻底清空规则
# iptables -F
# iptables-save > /etc/sysconfig/iptables

三、iptables 指令语法
1. 语法
iptables [-t table] command [match] [-j target/jump]
. [-t table] 指定规则表;
    内建的规则表有三个,分别是:nat、mangle 和filter,
    当未指定规则表时,则一律视为是filter。
    三个规则表的功能如下:
      nat:此规则表拥有PREROUTING 和POSTROUTING 两个规则链,
           主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT、DNAT),
           这个规则表除了作网址转换外,请不要做其它用途。
      mangle:此规则表拥有PREROUTING、FORWARD 和POSTROUTING 三个规则链。
           除了进行网址转换工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)
           或者是设定MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在mangle 规则表中;
           由于使用率不高,我们不打算在这里讨论mangle 的用法。
      filter: 这个规则表是默认规则表,拥有INPUT、FORWARD 和OUTPUT 三个规则链,
           这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、LOG、ACCEPT 或REJECT),
           我们会将基本规则都建立在此规则表中。

2. command 常用命令列表
命令:  -A, --append
范例:  iptables -A INPUT ...
说明:  新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。

命令:  -D, --delete
范例:  iptables -D INPUT --dport 80 -j DROP
       iptables -D INPUT 1
说明:  从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

命令:  -R, --replace
范例:  iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明:  取代现行规则,规则被取代后并不会改变顺序。

命令:  -I, --insert
范例:  iptables -I INPUT 1 --dport 80 -j ACCEPT
说明:  插入一条规则,原本该位置上的规则将会往后移动一个顺位。

命令:  -L, --list
范例1: iptables -L INPUT
说明:  列出某规则链中的所有规则。
范例2: iptables -t nat -L
说明:  列出nat 表所有链中的所有规则。

命令:  -F, --flush
范例:  iptables -F INPUT
说明:  删除filter 表中INPUT 链的所有规则。

命令:  -Z, --zero
范例:  iptables -Z INPUT
说明:  将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

命令:  -N, --new-chain
范例:  iptables -N allowed
说明:  定义新的规则链。

命令:  -X, --delete-chain
范例:  iptables -X allowed
说明:  删除某个规则链。

命令:  -P, --policy
范例:  iptables -P INPUT DROP
说明:  定义过滤政策。也就是未符合过滤条件之封包, 默认的处理方式。

命令:  -E, --rename-chain
范例:  iptables -E allowed disallowed
说明:  修改某自定义规则链的名称。

3. [match] 常用封包匹配参数
参数:  -p, --protocol
范例:  iptables -A INPUT -p tcp
说明:  匹配通讯协议类型是否相符,可以使用! 运算符进行反向匹配,例如:
           -p !tcp
       意思是指除tcp 以外的其它类型,如udp、icmp ...等。
       如果要匹配所有类型,则可以使用all 关键词,例如:
           -p all

参数:  -s, --src, --source
范例:  iptables -A INPUT -s 192.168.1.1
说明:  用来匹配封包的来源IP,可以匹配单机或网络,匹配网络时请用数字来表示子网掩码,
例如:
       -s 192.168.0.0/24
       匹配IP 时可以使用! 运算符进行反向匹配,例如:
       -s! 192.168.0.0/24。

参数:  -d, --dst, --destination
范例:  iptables -A INPUT -d 192.168.1.1
说明:  用来匹配封包的目的地IP,设定方式同上。

参数:  -i, --in-interface
范例:  iptables -A INPUT -i eth0
说明:  用来匹配封包是从哪块网卡进入,可以使用通配字符+ 来做大范围匹配,例如:
         -i eth+
      表示所有的ethernet 网卡
      也可以使用! 运算符进行反向匹配,例如:
         -i !eth0

参数:  -o, --out-interface
范例:  iptables -A FORWARD -o eth0
说明:  用来匹配封包要从哪块网卡送出,设定方式同上。

参数:  --sport, --source-port
范例:  iptables -A INPUT -p tcp --sport 22
说明:  用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:
          --sport 22:80
       表示从22 到80 端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用
          --multiport 参数,详见后文。匹配端口号时,可以使用! 运算符进行反向匹配。

参数:  --dport, --destination-port
范例:  iptables -A INPUT -p tcp --dport 22
说明:  用来匹配封包的目的地端口号,设定方式同上

参数:  --tcp-flags
范例:  iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明:  匹配TCP 封包的状态标志;
       参数分为两个部分,
         第一个部分列举出想匹配的标志,
         第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。
       TCP 状态标志包括:
          SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急) 、PSH(强迫推送) 
       等均可使用于参数中,
       除此之外还可以使用关键词ALL 和NONE 进行匹配。
       匹配标志时,可以使用! 运算符行反向匹配。

参数:  --syn
范例:  iptables -p tcp --syn
说明:  用来表示TCP 通信协议中,SYN 位被打开,而ACK 与FIN 位关闭的分组,即TCP 的初始连接,
       与iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,
       如果使用!运算符,可用来匹配非要求连接封包。

参数:  -m multiport --source-port
范例:  iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明:  用来匹配不连续的多个源端口,一次最多可以匹配15 个端口,
       可以使用! 运算符进行反向匹配。

参数:  -m multiport --destination-port
范例:  iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明:  用来匹配不连续的多个目的地端口号,设定方式同上

参数:  -m multiport --port
范例:  iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明:  这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。
       注意:在本范例中,如果来源端口号为80目的地端口号为110,这种封包并不算符合条件。

参数:  --icmp-type
范例:  iptables -A INPUT -p icmp --icmp-type 8
说明:  用来匹配ICMP 的类型编号,可以使用代码或数字编号来进行匹配。
       请打iptables -p icmp--help 来查看有哪些代码可用。

参数:  -m limit --limit
范例:  iptables -A INPUT -m limit --limit 3/hour
说明:  用来匹配某段时间内封包的平均流量,
       上面的例子是用来匹配:每小时平均流量是否超过一次3 个封包。
       除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后:
           /second、/minute、/day
       除了进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,
       以避免因骇客使用洪水攻击法,导致服务被阻断。

参数:  --limit-burst
范例:  iptables -A INPUT -m limit --limit-burst 5
说明:  用来匹配瞬间大量封包的数量,
       上面的例子是用来匹配一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。
       使用效果同上。

参数:  -m mac --mac-source
范例:  iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明:  用来匹配封包来源网络接口的硬件地址,
       这个参数不能用在OUTPUT 和POSTROUTING 规则链上,
       这是因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址,
       所以iptables 在进行封包匹配时,并不知道封包会送到哪个网络接口去。

参数:  --mark
范例:  iptables -t mangle -A INPUT -m mark --mark 1
说明:  用来匹配封包是否被表示某个号码,
       当封包被匹配成功时,我们可以透过MARK 处理动作,将该封包标示一个号码,号码最大不可以超过4294967296。

参数:  -m owner --uid-owner
范例:  iptables -A OUTPUT -m owner --uid-owner 500
说明:  用来匹配来自本机的封包,是否为某特定使用者所产生的,
       这样可以避免服务器使用root或其它身分将敏感数据传送出,可以降低系统被骇的损失。
       可惜这个功能无法匹配出来自其它主机的封包。

参数:  -m owner --gid-owner
范例:  iptables -A OUTPUT -m owner --gid-owner 0
说明:  用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

参数:  -m owner --pid-owner
范例:  iptables -A OUTPUT -m owner --pid-owner 78
说明:  用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上。

参数:  -m owner --sid-owner
范例:  iptables -A OUTPUT -m owner --sid-owner 100
说明:  用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包,使用时机同上。

参数:  -m state --state
范例:  iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明:  用来匹配连接状态, 
       连接状态共有四种:
          INVALID、ESTABLISHED、NEW 和RELATED。
       INVALID     表示该封包的连接编号(Session ID)无法辨识或编号不正确。
       ESTABLISHED 表示该封包属于某个已经建立的连接。
       NEW         表示该封包想要起始一个连接(重设连接或将连接重导向)。
       RELATED     表示该封包是属于某个已经建立的连接,所建立的新连接。
       例如:FTP-DATA 连接必定是源自某个FTP 连接。

4. [-j target/jump] 常用的处理动作
-j 参数用来指定要进行的处理动作,常用的处理动作包括:
   ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,

分别说明如下:
动作:  ACCEPT 
说明:  将封包放行,
       进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链(natostrouting)。

动作:  REJECT 
说明:  拦阻该封包,并传送封包通知对方,
       可以传送的封包有几个选择:
           ICMP port-unreachable、
           ICMP echo-reply 或是
           tcp-reset(这个封包会要求对方关闭连接),
         进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。
范例:  iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

动作:  DROP
说明:  丢弃封包不予处理,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。

动作:  REDIRECT
说明:  将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。
       这个功能可以用来实现透明代理或用来保护web 服务器。
范例:  iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

动作:  MASQUERADE
说明:  改写封包来源IP 为防火墙NIC IP,可以指定port 对应的范围,
       进行完此处理动作后,直接跳往下一个规则链(manglepostrouting)。
       这个功能与SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个IP,IP 会从网卡直接读取,
       当使用拨号接连时,IP通常是由ISP 公司的DHCP 服务器指派的,这个时候MASQUERADE 特别有用。
范例:  iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

动作:  LOG
说明:  将封包相关讯息纪录在/var/log 中,详细位置请查阅/etc/syslog.conf 配置文件,
       进行完此处理动作后,将会继续匹配其规则。
范例:  iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

动作:  SNAT
说明:  改写封包来源IP 为某特定IP 或IP 范围,可以指定port 对应的范围,
       进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
范例:  iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000

动作:  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.1.1-192.168.1.10:80-100

动作:  MIRROR
说明:  镜射封包,也就是将来源IP 与目的地IP 对调后,将封包送回,
       进行完此处理动作后,将会中断过滤程序。

动作:  QUEUE
说明:  中断过滤程序,将封包放入队列,交给其它程序处理。
       通过自行开发的处理程序,可以进行其它应用,例如:计算连接费用等。

动作:  RETURN
说明:  结束在目前规则链中的过滤程序,返回主规则链继续过滤,
       如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。

动作:  MARK
说明:  将封包标上某个代号,以便提供作为后续过滤的条件判断依据,
       进行完此处理动作后,将会继续匹配其它规则。

范例:  iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2


转自:http://blog.chinaunix.net/uid-26000296-id-4111127.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值