码迷,mamicode.com
首页 > 其他好文 > 详细

Iptables防火墙

时间:2015-05-17 23:44:37      阅读:497      评论:0      收藏:0      [点我收藏+]

标签:服务器   防火墙   共享上网   数据包   filter   

iptables四表五链

四表:

四个表的功能有独立的内核模块实现分别是:iptables_filter,iptables_nat

filter:过滤数据包,根据定义的防火墙规则进行判断数据包是放行还是拒绝。表内包含三个链:INPUT,FORWARD,OUTPUT。

NAT:主要用来共享上网和服务器发布。表内包含三个链:PREROUTING,POSTROUTING,OUTPUT。

managle:修改报文首部中的某些信息,如服务类型,TTL等。表内包含五个链。

raw:关闭nat表上启用的连接追踪功能,表内包含两个链,OUTPUT,PREROUTING。

五链(钩子函数)

prerouting:进入本机后,路由功能发生前

input:到达本机内部(入站)

output:由本机发出(出站)

forward:由本机转发(转发)

postrouting:路由功能发生之后,即将离开本机之前


默认表链规则示意图:

技术分享


主机型防火墙:主要对服务器本机进行保护,使用的链为INPUT,OUTPUT

网络型防火墙:主要作为网关服务器使用,使用的链为FORWARD,PREROUTING,POSTROUTING

数据报过滤匹配流程

规则表之间的匹配顺序

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

规则链直接的匹配顺序

到本内部:首先被prerouting链处理(是否修改数据报地址等)然后进行路由选择(判断该数据包应发往何处);如果数据包 的目标地址是防火墙本机,那么内核将交给input链进行处理(判断是否允许通过),如果允许通过则交给系统上的程序进行处理。

由本机发出:首先被output链处理(判断是否允许通过),然后进行路由选择,在交给 postrouting链进行处理(是否修改数据报的地址等)。

由本机转发:外界防火墙的数据包到达防火墙后,首先被prerouting链处理,然后在进行路由选择;然后交给 forward判断是否允许从本机通过, 最后交给postrouing进行处理。

规则链内匹配顺序

1、按顺序依次检查,匹配到即停止

2、若找不到相匹配的规则,则按该链的默认策略处理。


匹配流程示意图:

技术分享

链上规则放置次序:

  1. 同类规则,匹配范围小的放上面;

如:172.16.0.0/16网段,拒绝所有主机上网,但是只允许172.16.100.100主机上网,172.16.100.100这条规则就应该放在172.16.0.0这条规则上面,因为拒绝了172.16.0.0网段也就拒绝了172.16.100.100这台主机。

  1. 不同类规则,匹配报文几率较大的放上面;

如:这时一台web服务器,只开放80端口和22端口,开放80端口的规则就需要放在22端口这条规则上面;因为,如果22端口的规则放在80上面,那么每次用户访问80的时候,都需要和22端口进行比较,然后在和80进行比较,这样就浪费了访问80的时间。

(3) 应该设置默认策略;


添加规则时的考量点:

(1) 要实现的功能:判断添加在哪个表上;

(2) 报文流向及经由路径:判断添加在哪个链上;


编写防火墙规则

iptables 语法:

     iptables   表名  管理选项  链名   匹配条件    -j  控制条件

管理命令

管理规则:

-A:在链的尾部添加一条规则,如果不写表,默认是filter表

-I 链 [行号]:插入一条规则,插入为对应链上的指定行,如果省略了行,那么为第一条。

-D 链 [行号]:删除指定链中的指定规则。

-R 链 [行号]:替换指定的规则。

 管理链:

-F:清空指定表上所有规则;省略链名时,清空表中所有链;

-N:新建一个用户自定义的链;自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;

-X:删除一个自定义的空链(链比如为空,如果不为空使用-F清空)

-Z:将规则的计数器置0;

-P:设置链的默认处理机制,当所有都无法匹配或有匹配又无法做出有效处理机制时,默认策略即生效。

-E:重命名自定义的链。

  查看类:

-L:显示指定表中的所有规则。默认显示的规则和主机,是以协议和主机名出现,如果没有配置dns,查看的速度会非常的慢。

-n:以数字形式显示端口和主机名

-v:显示链及规则的详细信息

-vv:显示更加详细

-x:显示计数器的精确值

--line-numbers:显示规则号码


iptables显示解释

[root@iptables ~]# iptables -L -n -v 
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

pkts: 被本规则所匹配到的包个数;

bytes:被本规则所匹配到的所包的大小之和;

target: 处理目标 (目标可以为用户自定义的链)

prot: 协议 {tcp, udp, icmp}

opt: 可选项

in: 数据包流入接口

out: 数据包流出接口

source: 源地址

destination: 目标地址;


匹配条件

根据数据报的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配。

通用匹配:这种匹配方式可以独立使用,不依赖于其他条件或者扩展模块。常见的通用匹配有协议匹配,地址匹配,网络接口匹配。

隐含匹配:这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用,其对应的功能有iptables在需要的时候自动载入内核。常见的隐含匹配包括端口匹配,tcp标记匹配,ICMP类型匹配。

显式匹配:这种匹配方式要求有额外的内核模块提供支持,必须手动以"-m 模块名称"的形式调用相应的模块,然后方可设置匹配条件。常见的显式匹配包括多端口匹配,IP范围匹配,MAC地址匹配,状态匹配。


通用匹配:

 -s, --src, --source  IP|Network:检查报文中的源IP地址;

    -d,--dst, --destination:检查报文中的目标IP地址;

    -p,--protocol:检查报文中的协议,即ip首部中的protocols所标识的协议;tcp、udp或icmp三者之一;

    -i,--in-interface:数据报文的流入接口;通常只用于PREROUTING, INPUT,FORWARD链上的规则;

    -o,--out-interface:检查报文的流出接口;通常只用于FORWARD, OUTPUT,POSTROUTING链上的规则;

 

示例:

只允许172.16.4.230访问本机的ssh服务,并且设置INPUT和OUTPUT的默认策略为DROP

[root@iptables ~]# iptables -A INPUT -d172.16.4.100 -p tcp --dport 22 -j ACCEPT
[root@iptables ~]# iptables -A OUTPUT -s172.16.4.100 -p tcp --sport 22 -j ACCEPT
[root@iptables ~]# iptables -P INPUT DROP
[root@iptables ~]# iptables -P OUTPUT DROP
[root@iptables ~]# iptables -L -n -v
Chain INPUT (policy DROP 10 packets, 780 bytes)
 pkts bytestarget     prot opt in     out    source              destination        
  181 16068ACCEPT     tcp  -- *      *       0.0.0.0/0            172.16.4.100        tcp dpt:22
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytestarget     prot opt in     out    source              destination        
 
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytestarget     prot opt in    out     source               destination        
   62  6496 ACCEPT     tcp --  *      *      172.16.4.100        0.0.0.0/0           tcp spt:22

扩展匹配:-m MOD_NAME

隐式扩展:如果在通用匹配上使用-p选项指明了协议的话,则使用-m选项指明对其协议的扩展就变得可有可无了;

    tcp:

        --dportPORT[-PORT]:指定目标端口

        --sport:指定源端口

        --tcp-flagsLIST1 LIST2

            LIST1:要检查的标志位;

            LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0;

            例如:--tcp-flags syn,ack,fin,rst syn

        --syn:用于匹配tcp会话三次握手的第一次;

    udp:

        --sport:源端口

        --dport:目标端口

    icmp:

        --icmp-types

            0:回应报文,响应自己ping请求。

           3:目标不可达

           8:请求报文,自己发出的ping请求

示例:

允许自己ping别人,但是不允许别人ping自己 

iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

 

multiport扩展:

    以离散定义多端口匹配;最多指定15个端口;

    专用选项:

        --source-ports,--sports PORT[,PORT,...]

        --destination-ports,--dports PORT[,PORT,...]

示例:

设置允许连接本机的22,80,443端口

iptables -I INPUT 1 -d 172.16.4.100 -p tcp -mmultiport --dport 22,80,443 -j ACCEPT
iptables -I OUTPUT 1 -s 172.16.4.100 -p tcp -mmultiport --sport 22,80,443 -j ACCEPT

 

iprange扩展:

    指定连续的ip地址范围;在匹配非整个网络地址时使用;

    专用选项:

        --src-rangeIP[-IP] 指定源

        --dst-rangeIP[-IP] 指定目标

示例:

设置只允许172.16.4.100-172.16.4.200这个网段访问本机的web服务

[root@iptables ~]# iptables -A INPUT -d172.16.4.100 -p tcp --dport 80 -m iprange --src-range 172.16.4.100-172.16.4.200-j ACCEPT
[root@iptables ~]# iptables -A OUTPUT -s172.16.4.100 -p tcp --sport 80 -m iprange --dst-range 172.16.4.100-172.16.4.200-j ACCEPT


string扩展:

    检查报文中出现的字符串,与给定的字符串作匹配;

 

    字符串匹配检查算法:

        kmp,bm  这两种算法没有什么区别,用那个都可以

    专用选项:

        --algo{kmp|bm}  指定算法

        --string"STRING" 指定过滤的字符串

示例

准备测试文件

[root@iptables ~]# echo "how old are you">> /var/www/html/test1.html
[root@iptables ~]# echo "sex how are you">> /var/www/html/test2.html

访问测试,保证在没有设置规则之前这两个网页都可以正常显示

设置防火墙规则,出站的网页文件中包含sex字眼的通通屏蔽

iptables -I OUTPUT 1 -s 172.16.4.100 -p tcp --sport80 -m string --string "sex" --algo kmp -j REJECT

这时在访问test2.html就无法访问了,但是test1.html还可以继续访问



time扩展:

    基于时间区间做访问控制,时间以服务器时间为准

    专用选项:

        --datestartYYYY[-MM][-DD][hh[:mm[:ss]]]   #起始日期

        --dattestop                                #结束日志

        --timestart   #起始时间

        --timestop    #结束时间

        --weekdaysDAY1[,DAY2,...]  #周,下面分别是周一到周日

           Mon, Tue, Wed, Thu, Fri, Sat, Sun

 

示例:

设置禁止在8:30到18:30分访问本机的web服务,时间以服务器时间为准

iptables -I INPUT 1 -d 172.16.4.100 -p tcp --dport80  -m time  --timestart 08:30 --timestop 18:30 -j REJECT

设置周一到周五的8:30到18:30分访问

iptables -I INPUT 1 -d 172.16.4.100 -p tcp --dport80  -m time  --timestart 08:30 --timestop 18:30 --weekdaysMon,Tue,WedThu,Fri -j REJECT


connlimit扩展:

    基于连接数作限制;对每个IP能够发起的并发连接数作限制;

 

    专用选项:

        --connlimit-above[n]  #指定限制的连接数

示例:

设置只允许开启5个远程连接窗口

iptables -I INPUT 2 -d 172.16.4.100 -p tcp --dport22 -m connlimit --connlimit-above 5 -j REJECT

 

limit扩展:

    基于发包速率作限制;

 

    专用选项:令牌桶算法

        --limit  n[/second(秒)|/minit(分钟)|/hour(小时)|/day(天)]

        --limit-burstn   #最大初始匹配的数据报数量,默认为5

示例:

设置每两秒可以通过一个ping请求,第一次可以通过5个ping请求。

iptables -I INPUT 1 -d 172.16.4.100 -p icmp--icmp-type 8 -m limit --limit 30/minute --limit-burst 3 -j ACCEPT


connectiontemplate:连接追踪模板,用于记录各连接及相关状态;基于IP实现,与是否为TCP协议无关;通过倒计时的方式删除条目;

 

    记录连接的状态:

        NEW:新建立的连接,连接追踪模板中无相应的条目时,客户端第一次发出的请求;

        ESTABLISHED:NEW状态之后,边距追踪模板中的条目删除之前所进行的通信过程,都称为ESTABLISHED;

        RELATED:相关联的连接,如ftp协议的命令连接与数据连接即为相关联的连接;

        INVALIED:无法识别的状态;

 

state扩展:启用连接追踪模板记录连接,并根据连接匹配连接状态的扩展;

    启用连接追踪功能之前:简单包过滤防火墙;

    启用连接追踪功能:带状态检测的包过滤防火墙;

 

    专用选项:

        --stateSTATE

示例:假设本机是一台web服务器,只对外提供web服务。那么就可以进行如下设置,入站设置为只允许新建连接和已建立连接入站,出站只允许已建立连接出装

iptables -A INPUT -d 172.16.4.100 -p tcp -mmultiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.4.100 -m state --stateESTABLISHED -j ACCEPT

 

连接追踪功能,在大并发的web服务器或者负载均衡器上面最好不要开启,否则如果超过了最大连接数目,会造成大量连接超时。

调整连接追踪功能所能容纳的连接的最大数目,可以调到三五百万

[root@localhost ~]# cat/proc/sys/net/nf_conntrack_max
31384

表示开启了连接追踪功能,可以使用modprobe卸载

[root@localhost ~]# lsmod | grep conntrack
nf_conntrack_ipv4       9506 2
nf_defrag_ipv4          1483 1 nf_conntrack_ipv4
nf_conntrack           80390  2 nf_conntrack_ipv4,xt_state


查看当前追踪的所有连接

[root@localhost ~]# cat /proc/net/nf_conntrack
ipv4     2tcp      6 299 ESTABLISHEDsrc=172.16.4.100 dst=172.16.4.10 sport=22 dport=49404 src=172.16.4.10dst=172.16.4.100 sport=49404 dport=22 [ASSURED] mark=0 secmark=0 use=2

 

放行被动模式ftp

示例:服务器开放了http和ftp而且有需要远程管理。那么可以这样设置,第一条规则允许ESTABLISHED(响应请求或已建立连接)和RELATED(与已有连接相关联性)的数据出站,第二条则是设置允许新连接连接服务器的21,22,80端口。出站设置ESTABLISHED和RELATED。默认策略全部为DROP。这样就提高了查询效率   

 

装载ftp模块

[root@localhost ~]# modprobe nf_conntrack_ftp
[root@localhost ~]# lsmod | grep nf_conntrack_ftp
nf_conntrack_ftp       12913 0
nf_conntrack           80390  1 nf_conntrack_ftp

设置防火墙规则

iptables -A INPUT -d 172.16.4.100 -p tcp -m state--state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -d 172.16.4.100 -p tcp -mmultiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -s 172.16.4.100 -m state --stateRELATED,ESTABLISHED -j ACCEPT

如何保存及重载规则:

    保存:

        (1)service iptables save

            /etc/sysconfig/iptables文件;

        (2)iptables-save > /PATH/TO/SOMEFILE

    重载:

        (1)service iptables reload

        (2)iptables-restore < /PATH/FROM/SOMEFILE

 

示例:规则保存和重载

保存规则

[root@localhost ~]# iptables-save >/root/iptables
[root@localhost ~]# cat iptables
# Generated by iptables-save v1.4.7 on Fri Apr 2417:09:23 2015
*filter
:INPUT DROP [302:26822]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [18:1176]
-A INPUT -d 172.16.4.100/32 -p tcp -m multiport--dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -s 172.16.4.100/32 -m state --stateESTABLISHED -j ACCEPT
COMMIT
# Completed on Fri Apr 24 17:09:23 2015

清除所有IPTABLES规则是

[root@localhost ~]# service iptables restart

重载规则

[root@localhost ~]# iptables-restore iptables
[root@localhost ~]# iptables -L -n -v
Chain INPUT (policy DROP 4 packets, 312 bytes)
 pkts bytestarget     prot opt in     out    source              destination        
   25  2132 ACCEPT     tcp --  *      *      0.0.0.0/0           172.16.4.100        multiportdports 22,80 state NEW,ESTABLISHED
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytestarget     prot opt in     out    source              destination        
 
Chain OUTPUT (policy DROP 1 packets, 120 bytes)
 pkts bytestarget     prot opt in     out    source              destination        
   17  1784 ACCEPT     all --  *      *      172.16.4.100        0.0.0.0/0           stateESTABLISHED

本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://ximenfeibing.blog.51cto.com/8809812/1652130

Iptables防火墙

标签:服务器   防火墙   共享上网   数据包   filter   

原文地址:http://ximenfeibing.blog.51cto.com/8809812/1652130

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!