Fork Me
iptables详解
14 Mar 2015 - by @ssdr

防火墙通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先后顺序进行一一比较,直到满足其中的一条规则为止,然后依据控制机制做出相应的动作。如果都不满足,则将数据包丢弃,从而保护网络的安全。

通过使用防火墙可以实现以下功能:可以保护易受攻击的服务;控制内外网之间网络系统的访问;集中管理内网的安全性,降低管理成本;提高网络的保密性和私有性;记录网络的使用状态,为安全规划和网络维护提供依据。

目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。

iptables基础

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

iptables-tables-chains-rules

iptables的工作机制

五个规则链

1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)    

防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。

iptables规则的写法

命令格式

iptables [-t table] 命令 [chain] [rules] [-j target]
table——指定表名
命令——对链的操作命令
chain——链名
rules——规则
target——动作如何进行

iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table:3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION:指定如何进行处理

iptables-command

链管理命令

-P :设置默认策略的(设定默认门是关着的还是开着的)。 默认策略一般只有两种

iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的

-F: FLASH,清空规则链的(注意每个链的管理权限)

iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有链

-N:NEW 支持用户新建一个链。

iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的

-X: 用于删除用户自定义的空链。 使用方法跟-N相同,但是在删除之前必须要将里面的链给清空

-E:主要是用来给用户自定义的链重命名

-E oldname newname

-Z:清空链及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)

iptables -Z :清空

规则管理命令

-A:追加,在当前链的最后新增一个规则

-I num:插入,把当前规则插入为第几条。

-I 3 :插入为第三条

-R num:Replays替换/修改第几条规则

iptables -R 3 …………

-D num:删除,明确指定删除第几条规则

查看管理命令 - “-L”

附加子命令

-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。

-v -vv -vvv:显示详细信息

-x:在计数器上显示精确值,不做单位换算

–line-numbers:显示规则的行号

-t nat:显示所有的关卡的信息

匹配标准

通用匹配

-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP(IP | IP/MASK | 0.0.0.0/0.0.0.0),而且地址可以取反,加一个“!”表示除了哪个IP之外

-d:表示匹配目标地址

-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)

-i eth0:从这块网卡流入的数据,流入一般用在INPUT和PREROUTING上

-o eth0:从这块网卡流出的数据,流出一般在OUTPUT和POSTROUTING上

扩展匹配

-p tcp :TCP协议的扩展。一般有三种扩展

--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如--dport 21  或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)

-p udp:UDP协议的扩展

-p icmp:icmp数据报文的扩展

-m multiport:表示启用多端口扩展

-j ACTION

常用的ACTION

 DROP:悄悄丢弃,一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
 REJECT:明示拒绝
 ACCEPT:接受
 custom_chain:转向一个自定义的链
 DNAT
 SNAT
 MASQUERADE:源地址伪装
 REDIRECT:重定向:主要用于实现端口重定向
 MARK:打防火墙标记的
 RETURN:返回,在自定义链执行完毕后使用返回,来返回原规则链。

iptables示例

只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的SSHD服务

分析:首先肯定是在允许表中定义的。因为不需要做NAT地址转换之类的,然后查看我们SSHD服务,在22号端口上,处理机制是接受,对于这个表,需要有一来一回两个规则,如果我们允许也好,拒绝也好,对于访问本机服务,我们最好是定义在INPUT链上,而OUTPUT再予以定义就好。(会话的初始端先定义),所以加规则就是:

 定义进来的: 
 iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
 定义出去的: 
 iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
 将默认策略改成DROP:
  iptables -P INPUT DROP
  iptables -P OUTPUT DROP
  iptables -P FORWARD DROP

有关iptables的好文章,请看这里