iptables

1:Iptables/netfiter是linux下工作在网络层的防火墙,但是他支持连接追踪(状态检测).很多防火墙资料但中,都把iptables和netfiter叫做防火墙,其实netfiter是linux内核中实现的包过滤防火墙的内部结构,不以程序或文件的形式存在,属于内核态(内核空间),而iptables是管理防火墙命令的工具,是一个程序,iptables在为netfiter的管理上提供策略和规则(以下统统成为iptables).其中又分为网络防火墙和应用层防火墙(网关).

1.1:网络防火墙

数据报文到达该防火墙时,该防火墙会检测ip首部中的源地址,目标地址,TTL,tcp的源端口,目标端口TTL等,如果匹配到防火墙定义的规则,就进行相应的处理,如:通过,丢弃,许进不许出等.但是ip是很容易伪装的,所以就有了应用层防火墙

1.2:应用层防火墙(网关,代理服务器)

工作在应用层,不检测ip和tcp报文,但是会检测数据的内容,如果内容匹配到防火墙的策略,就进行相应的处理,如:丢弃或通行,许进不许出等.但是ip和tcp已经被丢弃了,没有了源ip,和源端口,所以该防火墙就把自己当成源ip源端口.

2:工作机制

2:1Iptables的钩子函数

一个数据报文进入我们的linux主机有5中流向,首先进入我们主机的内核空间,这是就是路由前(PREROUTING),内核空间的tcp/ip协议栈上的路由功能(FORWARD)对该报文进行检测,判断该报文的目标ip,如果该报文的目标ip就是我们的机器,就检查目标端口,如果该目标端口有进程在监听,那么路由就会把该报文转发到本机的用户空间中,这就是输入(INPUT).如果目标ip不是本机,就判断本机是否允许做网络间转发,如果不允许,就丢弃该包.如果允许,路由就会把该报文转发到另外一张网卡,这是路由后(POSTROUTING).还有一种情况,如果报文是通过本机出去的呢?这就是输出(OUTPUT)了,总结下来有5种情况了.路由前(PREROUTING),输入(INPUT),路由(FORWARD),输出(OUTPUT),路由后(POSTROUTING),而这5个流向也叫做钩子函数(),也就是我们需要设置的规则.

2.2iptables的处理机制

Iptables是如何防火的呢?有几种情况:过滤(Ffilter).网络地址转换(NAT),NAT又分为源地址转换(DNAT),目标地址转换(SNAT)(源地址转换为目标地址都是在路由后(请求),目标地址转换为源地址都在路由前(响应)).(私有ip是不能访问公网的,客户端经过一台公网ip的服务器访问互联网,在服务器端需要完成地址转换(NAT),该报文刚进入到服务器端的时候(路由前),还不知道该报文的目标ip,所以不能做NAT,需要在路由后做.互联网的响应发回来的时候,服务器在接受到响应报文,因为该报文就是发往本服务器的,如果经过服务器内部的路由的话,就会被服务器端的用户空间接受到该报文,但是该报文又不是服务器端的进程发送的,所以只能不经过该服务器端的路由,直接发回给最初发送请求的客户端,这叫路由前,也就是目标地址转换.简单的说,经过了路由的就叫路由后,没经过路由的就叫路由前).mangle:主要是做记录用的,他可以改变ip或tcp报文中的一些信息,相当于打个标记.raw:这个用的不多,就不做介绍了....总的来说就是:过滤(filter) ,网络地址转换(NAT),mangle,raw

2.3:规则钩子函数+处理机制就组成了规则表了

钩子函数加上处理机制就是他的处理规则了,下面看组合以及优先级

优先级:raw-->mangle-->NAT—>filter

组合四表五链,是表和链的对应关系

raw:PREROUTING,OUTPUT,-->这个用的不多

mangle:INPUT,FORWORD,OUTPUT,PREROUTING,POSTROUTING(主要做防火墙标记的)

nat: PREROUTING,POSTROUTING,OUTPUT

filter:INPUT,FORWORD,OUTPUT(这是默认表,如果执行命令的时候不指定表,默认使用此表),默认有通和堵,通:默认为堵,只对能识别的记性放行.堵:默认为通,只对能识别的就行阻截.

下面是为了另一种记法,五链四表,和上面一样的

路由前(PREROUTING):nat,mangle,raw

输入(INPUT):filter,mangle

路由(FORWARD):mangle,nat

输出(OUTPUT):filter,mangle,nat,raw

路由后(POSTROUTING):mangle,nat

如下图:

2.4:检查条件:网络层防火墙只能检查,ip首部,tcp首部,帧首部等等

IP:源IP,目标IP

TCP:源端口,目标端口,Flags(SYN,ACK,FIN)

UDP:源端口,目标端口

ICMP:ICMP-TYPE

2.5:扩展检查:对时间,对协议,对关键字,对state,

处理机制

DENY:悄悄丢弃

DROP:丢弃

REJECT:丢弃,有挑衅的味道,少用

ACCEPT:允许通过

RETURN:返回

2.6:匹配条件

通用匹配:-s:匹配源地址,可以是IP,也可以是网络地址,可以用!取反,不写表示所有的地址-d:匹配目标地址,不写表示所有的地址-p:匹配协议,通常只是用{TCP|UDP|ICMP}三者之一-i:数据报文流入的接口,通常只用于INPUT,FORWARD和PERROUTING这三个表-o:数据报文流出的接口,通常只用于OUPUT,FORWARD和POSTROUTING这三个表

2.7:扩展匹配-->隐含扩展

如:iptables -A OUTPUT -s 172.16.100.7 -p icmp  --icmp-type 8 -j ACCEPT

实际上是:iptables -A OUTPUT -s 172.16.100.7 -p icmp -m icmp --icmp-type 8 -j ACCEPT

因为-p指定了icmp协议,就可以省略-m icmp,所以这就是隐含扩展,但是有些是无法隐含的,就只能显示扩展了.

隐含扩展:使用-p{TCP|UDP|ICMP}指定某协议后,自动能够对协议进行的扩展

-p tcp

--dport:(目标端口)

--sport:(源端口)

--tcp-flags(标识位匹配)[URG,PSH,RST,SYN,ACK,FIN],flags条件要检查两组参数,第一组是要检查的标志位,第二组是要检查的标志位为1的.如:--tcp-flags rst,syn,ack,fin syn,这表示要检查的标识位是rst,syn,ack,fin,只有syn为1,其他的都要为0

-p udp

--sport:源端口

--dport:目标端口

-p icmp

这里只要注意0和8就行了

8:ping请求

0:ping响应

2.8:扩展匹配-->显示扩展

显示扩展:必须要明确指定的扩展模块,在/lib/xtables中定义了许多的特许模块,这写模块就是基于一些协议来做扩展的,就是显示扩展.

-m 扩展名称模块

multiport:多端口匹配

   --sposrts:源端口

   --dports:目标端口

   --ports:

iprange:指定IP范围

  [!] --src-range from

  [!] --dst-range from

time: 指定时间范围

   --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

   --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

   --timestart hh:mm[:ss]

   --timestop hh:mm[:ss]

   [!] --weekdays day[,day...]

tring: 字符串匹配

   --algo {bm|kmp}:字符匹配查找时使用算法

   --string "STRING": 要查找的字符串

connlimit: 每IP对指定服务的最大并发连接数;

   [!] --connlimit-above [n]

limit: 报文速率控制,一般在INPUT阶段控制

   --limit #[/second|/minute|/hour|/day]

   --limit-burst #

state: 状态匹配

ip_conntrack, nf_conntrack

--state

   NEW:新建立的连接

   ESTABLISHED:建立连接后,只要会话没超时,就是这个状态

   RELATED:比如ftp的两条连接,一条命令连接,一条数据连接的关系

   INVALID:就是无效的,比如6个标志位全1的

对于每一个和主机相连的会话,在主机内都有一个连接追踪表,记录每一条被防火墙匹配到的一进一出的会话的关联状态,每一条关联关系的表都有一个倒计时器,当计时器返回为0,就会把这个条目清除出去,如果在返回0之前,该条目一直在访问,就刷新该计时器的时间,任何连接在访问之前都会先查询这张表,如果有条目就是ESTABLISHED,如果没有条目就是NEW,如果有条目,但是和条目本身没有关系,与条目连接的另一条连接有关系,就是RELATED,如果请求的报文6个标志位全为1或全为0的就是INVALID,但是这个链表的内存非常小,只要内存满了就拒绝服务,所以此功能虽强大,但是不建议开启,就算开启,也要加大此内存.

3:TCP的有限状态机(这里简单说说,不熟悉的去补补吧)

第一次握手:SYN=1,ACK=0,FIN=0

第二次握手:SYN=1,ACK=1,FIN=0

第三次握手:SYN=0,ACK=1,FIN=0

3.1状态:

客户端 服务器 状态
Close Listen 初始状态
syn_sent syn_rcvd 三次握手
established established 连接状态

4.Iptables命令

4.1新增链

iptables -t filter -N mychain         #-N:新增一条链表iptables -t filter -L -n              #查看链表Chain INPUT (policy ACCEPT)           #系统链是policyREJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target     prot opt source               destination   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target     prot opt source               destination   Chain mychain (0 references)         #增加了一条mychain的链,自定义链名为references,为引用target     prot opt source               destination
iptables -X mychain            #删除mychain的链iptables -t filter -L -n       #查看链,可以看到已经不存在了Chain INPUT (policy ACCEPT)target     prot opt source               destination                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target     prot opt source               destination   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target     prot opt source

4.3:修改链的默认策略

iptables [-t table] -P chain target  #改变表的默认规则,就是我们前面提到的通和堵iptables -t filter -P FORWARD DROP    #改变filter表中的forward链的默认规则,可以看到意见改变了iptables -t filter -L -n            #查看链表Chain INPUT (policy ACCEPT)target     prot opt source               destination    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHEDChain FORWARD (policy DROP)target     prot opt source               destination    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target     prot opt source               destination

4.4:iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

-L: list,列出表中的所有规则-n: 数字格式显示IP和Port           #这是-L的子选项-v: 以详细格式显示                 #这是-L的子选项-vv:更详细的格式显示               #这是-L的子选项-vvv:更更详细的格式显示            #这是-L的子选项-x:精确显示bytes的值               #这是-L的子选项--line-numbers:显示各规则的行号    #这是-L的子选项                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 iptables -t filter -L -n -v        #示例命令Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts  bytes  target     prot opt in     out     source               destination                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               1413  106K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0pkts: packets, 被本规则所匹配到的报文的个数;bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;target: 目标,即处理机制;prot: 协议,一般为{TCP|UDP|ICMP};opt: 可选项in: 数据包的流入接口;out: 数据包的流出接口;source: 源地址;destination: 目标地址;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               -F: 清空链中的规则,规则有编号,在链中自上而下,从1开始-Z:zero,清零,把pkts和bytes清零

4.5:iptables [-t table] {-A|-D} chain rule-specification

-A:append追加一条规则# iptables -t   filter  -A   INPUT  -s  172.16.0.0/16 -d 172.16.251.209 -j  ACCEPT#          -t 指定表   -A增加 指定链 -s源网域           -d目标主机        -j处理方式     允许通过整句的意思就是:增加一条记录到filter表INPUT链中,允许所有来自172.16.0.0/16网域的主机与172.16.251.209通信# iptables -tfilter -L -n -vChain INPUT (policy ACCEPT 16 packets, 2998 bytes) pkts bytes target     prot opt in     out     source               destination        66  4616 ACCEPT     all  --  *      *       172.16.0.0/16        172.16.251.209-D:删除一条规则-D chain rulenum-I:插入规则

4.6:保存iptables的配置信息

   默认如果修改完配置信息不保存,重启服务后,之前的配置信息会消失

service iptables save# service iptables saveiptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

4.7:如果想保存配置文件到默认的文件

# iptables-save > /path/to/somewhere        #使用输出重定向保存特定位置# iptables-restore < /path/to/somewhere     #使用输入重定向读取配置文件

5.练习题

5.1:数据报文只能从eth0这块网卡进来

#iptables -A INPUT -i eth0 -d 172.16.251.209 -j ACCEPT# iptables -L -n -vChain INPUT (policy ACCEPT 12 packets, 2436 bytes) pkts bytes target     prot opt in     out     source                    0     0 ACCEPT     all  --  eth0   *       0.0.0.0/0            172.16.251.209

5.2:数据报文只能从eth0这块网卡出去,注意和上面的对比

# iptables -A OUTPUT -o eth0 -s 172.16.251.209 -j ACCEPT# iptables -L -n -vChain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination        22  2168 ACCEPT     all  --  *      eth0    172.16.251.209       0.0.0.0/05.3:shuju b

5.3:数据报文从eth0口进入,并且协议为tcp协议的

# iptables -A INPUT -i eth0 -d 172.16.251.209 -p tcp -j ACCEPT# iptables -L -n -vChain INPUT (policy ACCEPT 8 packets, 1124 bytes) pkts bytes target     prot opt in     out     source               destination        36  2376 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            172.16.251.209

5.4:不允许数据报文从eth0口ping进来

#iptables -A INPUT -i eth0 -d 172.16.251.209 -p icmp -j DROP# iptables -L -n -vChain INPUT (policy ACCEPT 92 packets, 6491 bytes) pkts bytes target     prot opt in     out     source               destination         4   240 DROP       icmp --  eth0   *       0.0.0.0/0            172.16.251.209

5.5:放行来至172.16.0.0/16网络的主机对本机的ssh服务的请求,因为是放行,所以是一进一出,请注意

#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.251.209 -p -tcp --dport 22 -j ACCEPT# iptables -t filter -A OUTPUT -s 172.16.251.209 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEP# iptables -L -n -vChain INPUT (policy ACCEPT 47 packets, 4974 bytes) pkts bytes target     prot opt in     out     source               destination       390 26420 ACCEPT     tcp  --  *      *       172.16.0.0/16        172.16.251.209      tcp dpt:22Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination        38  5360 ACCEPT     tcp  --  *      *       172.16.251.209       172.16.0.0/16       tcp spt:22

5.6:改变filter的默认规则为DROP

# iptables -P INPUT DROP     #INPUT为DROP# iptables -P OUTPUT DROP    #OUTPUT为DROP# iptables -P FORWARD DROP   #FORWARD为DROP# iptables -L-n -v# iptables -L -n -vChain INPUT (policy DROP 8 packets, 1040 bytes) pkts bytes target     prot opt in     out     source               destination       643 44404 ACCEPT     tcp  --  *      *       172.16.0.0/16        172.16.251.209      tcp dpt:22Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination     Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination       195 21360 ACCEPT     tcp  --  *      *       172.16.251.209       172.16.0.0/16       tcp spt:22

5.7:允许本机到本机的通信,5.6中改变默认策略后,本机ping本机是ping不通的(127.0.0.1)

# iptables -A INPUT -i lo -j ACCEPT    #添加本机入口# iptables -A OUTPUT -o lo -j ACCEPT    #添加本机出口

5.8:禁止广播探测本网络主机在线情况

iptables -A INPUT -d 255.255.255.255 -p icmp -j DROPiptables -A INPUT -d 172.16.255.255 -p icmp -j DROP5.9:qing

5.9:清除不正常报文,参照2.7和3提到的

iptables -A INPUT -p tcp --flags ALL ALL -j DROP #标志位全1的丢弃,全1肯定是不正常的包iptables -A INPUT -p tcp --flags ALL NONE -j DROP #标志位全0的丢弃,全0肯定是不正常的包不明白的去看看tcp的相关知识,以及上面2.7和3提到的内容6.0:放行本机的tftp武夫

6.0:放行本机的tftp服务

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 69 -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT

6.1:放行本机的DNS服务,这个有点特别,要注意

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 53 -j ACCEPT            #允许别人来查询iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 53 -j ACCEPT            #响应别人的查询iptables -A OUTPUT -s 172.16.100.7 -p udp --dport 53 -j ACCEPT                #去查询别的DNS服务器iptables -A INPUT -d 172.16.100.7 -p udp --sport 53 -j  ACCEPT                                                                                              #允许别的DNS服务器响应iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 53 -j ACCEPT               #允许别人来查询iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 53 -j ACCEPT            #响应别人的查询iptables -A OUTPUT -s 172.16.100.7 -p tcp --dport 53 -j ACCEPT                        #去查询别的DNS服务器iptables -A INPUT -d 172.16.100.7 -p tcp --sport 53 -j ACCEPT                #允许别的DNS服务器响应

6.2:允许ping其他主机,参照2.7的icmp

iptables -A OUTPUT -s 172.16.100.7 -p icmp  --icmp-type 8 -j ACCEPT     #允许请求报文出去iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT        #允许响应报文进来

6.3:删除规则,参照4.5

iptables -D INPUT 2        #删除filter表中INPUT链中的第二条规则

6.4:插入规则,替换规则,显示规则

iptables -I INPUT 2 -i lo -j ACCEPT #在filter表中INPUT链中的第二条的位置插入一条数据,如果不指明位置,就在第一条插入iptables -R INPUT 1 -s 172.16.0.0/16 -d 172.16.100.7 -i eth0 --dport 22 -j ACCEPT #替换filter表中INPUT链中的第一条规则iptables -S INPUT #显示INPUT链中的所有规则,如果不加INPUT,则显示filter表中的所有规则

6.5:开放本机的22号端口和80号端口,显示扩展,参照2.8

iptables -A INPUT -d 172.16.251.209 -p tcp -m multiport --dports 22,80 -j ACCEPT     #允许数据报文进入22号端口和80端口iptables -A OUTPUT -s 172.16.100.7 -p tcp -m multiposr --sports 22,80 -j ACCEPY        #允许数据报文从22号端口和80号端口出去

6.6:放行ip地址段

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

6.7:指定时间放行指定服务

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT

6.8:如果字符串中匹配到hello的就丢弃

iptables -A OUTPUT -s 172.16.251.209 -p tcp --sports 80 --algo kmp --string "hello" -j DROP      #对web页面只要匹配到响应hello的字符串就丢弃

6.9:对80端口并发数大于5的IP不予响应  

iptables -I INPUT -d 172.16.251.209 -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP

6.10:对响应的ping请求每秒不得超过2个,峰值不能超过5个

iptables -A INPUT -d 172.16.251.209 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPT    #

6.11:仅允许NEW和ESTABLISHED状态的报文进出本机

iptables -A INPUT -d 172.16.251.209 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT       #进允许NEW和ESTABLISHED状态的报文从eth0口进入本机iptables -A OUTPUT -s 172.16.251.209 -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT    #本机是服务器,不会去主动联系客户端,所以不放行NEW状态的6.12:zi

6.12:自定义清理链

iptables -t filter -N clean_in    #创建一条新链iptables -A clean_in -d 172.16.251.209 -p tcp --tcp-flags ALL ALL -j DROP    #标志位全1的报文丢弃iptables -A clean_in -d 172.16.251.209 -p tcp --tcp-flags ALL NONE -j DROP    #标志位全0的报文丢弃iptables  -A clean_in -d 172.16.255.255 -p ICMP -j DROP    #广播报文丢弃iptables -A clean_in -d 255.255.255.255 -p ICMP -j DROP    #广播报文丢弃iptables -A clean_in -d 172.16.251.209 -j RETURN        #正常的报文RETURNiptables -I INPUT -d 172.16.251.209 -j clean_in    #所有到达本机的报文先送给clean_in清理一遍

6.13:放行本机的ftp服务

iptables -A INPUT -d 172.16.251.209 -p tcp --dport 21 -j ACCEPTiptables -A OUTPUT -s 172.16.251.209 -p tcp --sport 21 -j ACCEPTiptables -A INPUT -d 172.16.251.209 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A OUTPUT -s 172.16.251.209 -p tcp -m state --state ESTABLISHED注意:ftp需要装载模块才能生效:ip_nat_ftp,ip_conntrack_ftp这两个模块...

6.14:写完了....看不懂吧...没事..我也看不懂