Iptables

基础

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

到本机某进程的报文:PREROUTING --> INPUT

由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING

由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

链的概念

防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样 ,这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

表的概念

A类规则都是对IP或者端口的过滤,B类规则是修改报文,

把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能

iptables为我们提供了如下规则的分类,或者说,iptables为我们提供了如下"表"

filter表:负责过滤功能,防火墙;内核模块:iptables_filter

nat表:network address translation,网络地址转换功能;内核模块:iptable_nat

mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle

raw表:关闭nat表上启用的连接追踪机制;iptable_raw 

表链关系

PREROUTING 的规则可以存在于:raw表,mangle表,nat表。

INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。

FORWARD 的规则可以存在于:mangle表,filter表。

OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。

POSTROUTING 的规则可以存在于:mangle表,nat表。

表(功能)<--> 链(钩子):

raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT

mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)

filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

优先级次序(由高而低):

raw --> mangle --> nat --> filter

111

匹配条件

匹配条件分为基本匹配条件与扩展匹配条件

基本匹配条件:

源地址Source IP,目标地址 Destination IP

上述内容都可以作为基本匹配条件。

扩展匹配条件:

除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。

源端口Source Port, 目标端口Destination Port

上述内容都可以作为扩展匹配条件

处理动作

处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。

此处列出一些常用的动作,之后的文章会对它们进行详细的示例与总结:

ACCEPT:允许数据包通过。

DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。

SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。

MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。

DNAT:目标地址转换。

REDIRECT:在本机做端口映射。

LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

iptables操作

[root@node3 ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@node3 ~]# 

-t:指定要操作的表,

-L:使用-L选项,查看-t选项对应的表的规则,-L选项的意思是,列出规则

iptables -t raw -L
iptables -t nat -L
iptables -t mangle -L

规则对应的属性

pkts:对应规则匹配到的报文的个数。

bytes:对应匹配到的报文包的大小总和。

target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。

prot:表示规则对应的协议,是否只针对某些协议应用此规则。

opt:表示规则对应的选项。

in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。

out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

iptables -nvxL -- line-number
-v  显示更详细
-n  不让IP进行反解
-- line-number即可显示规则的编号
-x 选项表示显示计数器的精确值

iptables -t 表名 -L 链名 查看指定表的指定链中的规则。

[root@node3 ~]# iptables -t filter -I INPUT  -s 192.168.246.132 -j DROP     
[root@node3 ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 84 packets, 6144 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      *       192.168.246.132      0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 47 packets, 5260 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@node3 ~]# 

-I选项,指明将"规则"插入至哪个链中,-I表示insert,即插入的意思,所以-I INPUT表示将规则插入于INPUT链中,即添加规则之意。

-s选项,指明"匹配条件"中的"源地址",即如果报文的源地址属于-s对应的地址,那么报文则满足匹配条件,-s为source之意,表示源地址。

使用-j选项,指明当"匹配条件"被满足时,所对应的动作,上例中指定的动作为DROP,在上例中,当报文的源地址为192.168.1.146时,报文则被DROP(丢弃)

[root@node3 ~]# iptables -A INPUT -s 192.168.246.132 -j ACCEPT
[root@node3 ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 12 packets, 880 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   91  7644 DROP       all  --  *      *       192.168.246.132      0.0.0.0/0           
    0     0 ACCEPT     all  --  *      *       192.168.246.132      0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 6 packets, 760 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@node3 ~]# 

使用-A选项,表示在对应的链中"追加规则",-A为append之意

-I选项进行插入规则操作,-I INPUT 2表示在INPUT链中新增规则,新增的规则的编号为2

方法一:根据规则的编号去删除规则

[root@node3 ~]# iptables --line -vnL INPUT
Chain INPUT (policy ACCEPT 910 packets, 83584 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      363 30492 ACCEPT     all  --  *      *       192.168.246.132      0.0.0.0/0           
2      227 19068 DROP       all  --  *      *       192.168.246.132      0.0.0.0/0           
3        0     0 ACCEPT     all  --  *      *       192.168.246.132      0.0.0.0/0           
[root@node3 ~]# iptables -t filter -D  INPUT 3
[root@node3 ~]# iptables --line -vnL INPUT
Chain INPUT (policy ACCEPT 6 packets, 428 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      363 30492 ACCEPT     all  --  *      *       192.168.246.132      0.0.0.0/0           
2      227 19068 DROP       all  --  *      *       192.168.246.132      0.0.0.0/0           
[root@node3 ~]# 

方法二:根据具体的匹配条件与动作删除规则

[root@node3 ~]# iptables -D INPUT -s 192.168.246.132 -j DROP
[root@node3 ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 13 packets, 948 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  363 30492 ACCEPT     all  --  *      *       192.168.246.132      0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 8 packets, 1040 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@node3 ~]# 

修改

[root@node3 ~]# iptables -t filter -R INPUT 1 -s 192.168.246.132 -j DROP
[root@node3 ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 6 packets, 428 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      *       192.168.246.132      0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 512 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@node3 ~]# 

-R选项表示修改指定的链

保存

使用iptables-save并不能保存当前的iptables规则,但是可以将当前的iptables规则以"保存后的格式"输出到屏幕上。

所以,我们可以使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。

iptables-save > /etc/sysconfig/iptables

我们也可以将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。

使用iptables-restore命令可以从指定文件中重载规则,示例如下

iptables-restore < /etc/sysconfig/iptables

再次提醒:重载规则时,现有规则将会被覆盖。

匹配条件

基本匹配条件总结

-s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。  

-d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。 

-p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)。 

-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。  

-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。 

扩展匹配条件总结

tcp扩展模块

常用的扩展匹配条件如下:

-p tcp -m tcp --sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

-p tcp -m tcp --dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

multiport扩展模块

常用的扩展匹配条件如下:

-p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开

-p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开

原文地址:https://www.cnblogs.com/mrwuzs/p/9482729.html