返回列表 回复 发帖

iptables

前言
防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
目前市面上比较常见的有34层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。
对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。
二,iptables 的历史以及工作原理
1.iptables的发展:
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
    作者一共在内核空间中选择了5个位置,
    1.内核空间中:从一个网络接口进来,到另一个网络接口去的
    2.数据包从内核流入用户空间的
    3.数据包从用户空间流出的
    4.进入/离开本机的外网接口
    5.进入/离开本机的内网接口


2.iptables的工作机制
iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。
数据包在依次通过这5个地方的时候,会验证规则。查看数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包。每个链的默认策略都是Accept。任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链()
这五个位置也被称为五个钩子函数(hook functions,也叫五个规则链。即:每个数据包流需要经过的不同环节。其实说成节点,更容易理解
1.PREROUTING (路由前)  在数据包进入防火墙之后、路由判断之前对数据包进行修改
2.INPUT (数据包流入口) 在数据包被路由到本地之后,但在用户空间程序看到它之前对数据包进行修改
3.FORWARD (转发管卡) 在最初的路由判断之后、最后一次更改包的源地址之前对数据包进行修改
4.OUTPUT(数据包出口) 用户空间程序处理数据包后,由本地发出,再次被路由之前更改数据包
5.POSTROUTING(路由后)在所有路由判断之后,对数据包进行修改









3.防火墙的策略
linux对于防火墙的设置,是通过策略表来维护的,而不是通过链来维护。但是不同的策略表,可以定义不同的链的验证规则。
策略表filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw-->mangle-->nat-->filter
一条链上可定义不同功能的规则,检查数据包时将根据上面的优先级顺序检查
防火墙策略一般分为两种,一种叫策略,一种叫策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转策略,即表,是规则的集合组,每个表中的规则条目是按顺序匹配的,你可以在数据包经过的不同环节设置规则
1.filter 实现数据包过滤
2.nat 转换数据包的源或目标地址
3.mangle操作数据包内容,
对于filter来讲一般只能做在3个链上:INPUT FORWARD OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING OUTPUT POSTROUTING
mangle则是5个链都可以做:PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。意思就是,如果上面的规则已经匹配了,就不会再往下走。


规则的写法:
iptables定义规则的方式比较复杂:
格式:
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作]
下面对iptables的定些规则一一说明:


1,[-t 表]
选项-t用来指定用哪个表,它可以是下面的任何一个,默认的是filter


2[操作命令]

2.1查看操作命令
-L, --list [chain]
列出规则
-v, --verbose
详细信息-vv-vvv  更加详细的信息
-n, --numeric
数字格式显示主机地址和端口号
-x, --exact
显示计数器的精确值
--line-numbers
列出规则时,显示其在链上的相应的编号
-S, --list-rules [chain]
显示指定链的所有规则
例子:

iptables -L -n -v

查看filter表中的规则(默认是filter
iptables -t nat -L -n -v

查看nat表中的规则
iptables -t mangle -L -n -v
查看mangle 表中的规则
iptables -t raw -L -n -v
查看raw 表中的规则
2.2管理操作命令
参数
作用
例子
-A, --append chain rule-specification
追加新规则于指定链的尾部;
Iptables -A INPUT -s 15.28.29.17 -j drop
-I, --insert chain [rulenum] rule-specification
插入新规则于指定链的指定位置,默认为首部
Iptables -I INPUT 2 -s 11.28.20.16 -j drop
-R, --replace chain rulenum rule-specification
替换指定的规则为新的规则
Iptables -R INPUT 2 -s 11.28.20.17 -j drop
-D, --delete chain rulenum
根据规则编号删除规则
Iptables -D INPUT 2
2.3管理链
-N, --new-chain chain
新建一个自定义的规则链
iptables
-N inbound_tcp_web 表示附在tcp表上用于检查web
-X, --delete-chain [chain]
删除用户自定义的引用计数为0的空链
删除之前必须要将里面的链给清空
-F, --flush [chain]
清空指定的规则链上的规则
iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有链
-E, --rename-chain old-chain new-chain
重命名链
-E oldname newname
-Z, --zero [chain [rulenum]]
置零计数器
iptables -Z
-P, --policy chain target
设置链路的默认策略
iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的iptables -P INPUT DROP
3[链]
表和链的对应规则为
\
PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

raw










mangle










nat










filter










4,[规则匹配器]


















参数

解释
扩展参数
扩展参数
解释
-s
作为源地址匹配,这里不能指定主机名称,必须是IP而且地址可以取反,加一个“!”表示除了哪个IP之外






-d
表示匹配目标地址






-p
用于匹配协议的(这里的协议通常有3TCP//ICMP
TCP


-dport
指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如--dport 21  或者 --dport 21-23 (此时表示21,22,23)
-sport
指定源端口
-tcp-fiags
TCP的标志位(SYN,ACKFIN,PSHRST,URG
udp
--sprot port
指定源端口
--dport
port
指定目标源端口
ICMP
--icmp-type




-i
指定流入的网卡 -i eth0流入一般用在INPUTPREROUTING






-o
指定流出的网卡 -o eth0流出一般在OUTPUTPOSTROUTING






-m
-m multiport:表示启用多端口扩展之后我们就可以启用比如 --dports 21,23,80






5,[目标动作]
ACCEPT
允许数据包通过
DROP
丢弃数据包
REJECT
丢弃数据包,并且将拒绝信息发送给发送方
SNAT
源地址转换(在nat表上)iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
DNAT
目标地址转换(在nat表上)
iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
REDIRECT
目标端口转换(在nat表上
例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80
MARK
将数据包打上标记
例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60


四,如何生效:
注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
1.service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
2.iptables-save 命令
iptables-save > /etc/sysconfig/iptables
3.iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore < /etc/sysconfig/iptables.2
则完成了将iptables中定义的规则手动生效


五,自定义链


六,扩展知识
状态检测:
是一种显式扩展,用于检测会话之间的连接关系的,有了检测我们可以实现会话间功能的扩展
什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED,还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED
所以我们的状态一共有四种:
        NEW
        ESTABLISHED
        RELATED
        INVALID
所以我们对于刚才的练习题,可以增加状态检测。比如进来的只允许状态为NEWESTABLISHED的进来,出去只允许ESTABLISHED的状态出去,这就可以将比较常见的反弹式木马有很好的控制机制。


-m扩展
1limit限制流量:
        -m limit --limit-burst 15        #设置一开始匹配的数据包数量
        -m limit --limit 1000/s            #设置最大平均匹配速率
        -m limit --limit 5/m --limit-burst 15     #表示一开始能匹配的数据包数量为15个,每匹配到一个,   
                                                                    limit-burst的值减1,所以匹配到15个时,该值为0,以后每过   
                                                                    12slimit-burst的值会加1,表示又能匹配1个数据包
例子:
1
2
iptables -A INPUT -i eth0 -m limit --limit 5/m
--limit-burst 15 -j ACCEPT  
iptables -A INPUT -i eth0 -j DROP
    注意要点:
        1--limit-burst的值要比--limit的大
        2limit本身没有丢弃数据包的功能,因此,需要第二条规则一起才能实现限速的功能
2time :在特定时间内匹配
-m time
说明
--monthdays day1[,day2]
在每个月的特定天匹配
--timestart hh:mm:ss
在每天的指定时间开始匹配
--timestop hh:mm:ss
在每天的指定时间停止匹配
--weekdays day1[,day2]
在每个星期的指定工作日匹配,值可以是1-7
例子:
1
2
iptables -A INPUT -i eth0 -m time
--weekdays 1,2,3,4 -jACCEPT
iptables -A INPUT -i eth0 -j DROP
3ttl:匹配符合规则的ttl值的数据包
参数
说明
--ttl-eq 100
匹配TTL值为100的数据包
--ttl-gt 100
匹配TTL值大于100的数据包
--ttl-lt 100
匹配TTL值小于100的数据包
例子:
1
iptables -A OUTPUT -m ttl --ttl-eq
100 -j ACCEPT
4multiport:匹配离散的多个端口
参数
说明
--sports port1[,port2,port3]
匹配源端口
--dports port1[,port2,port3]
匹配目的端口
--ports port1[,port2,port3]
匹配源端口或目的端口
例子:
1
iptables -A INPUT -m multiport --sports 22,80,8080 -j DROP


5state:匹配指定的状态数据包
参数
说明
--state value
value可以为NEW、RELATED(有关联的)、ESTABLISHED、INVALID(未知连接)
例子:
1
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
6mark:匹配带有指定mark值的数据包
参数
说明
--mark value
匹配mark标记为value的数据包
例子:
1
iptables -t mangle -A INPUT -m mark --mark 1 -j DROP
7mac:匹配特定的mac地址
例子:
1
iptables -A FORWARD -m mac --mac-source
00:0C:24:FA:19:80 -j DROP


七,练习题
1进来的拒绝出去的允许
进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝
iptables -L -n --line-number  :查看之前的规则位于第几行
    改写INPUT
        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
    此时如果想再放行一个80端口如何放行呢?
        iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
2、允许自己ping别人,拒绝别人ping自己
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
小扩展:对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
3SNATDNAT的实现
由于我们现在IP地址十分紧俏,已经分配完了,这就导致我们必须要进行地址转换,来节约我们仅剩的一点IP资源。那么通过iptables如何实现NAT的地址转换呢?
1.SNAT基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
        iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
        这里要注意:地址伪装并不适用于所有的地方。
2.DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。
    如何做目标地址转换呢?:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
        目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
附件: 您所在的用户组无法下载或查看附件
返回列表