Iptables总结

序:

    为实现网络控制功能人们定义硬件防火墙,软件放火墙,主机防火墙,网络防火墙。其工作在主机或网络的边缘,对经由的报文根据预定义的规则进行检索控制。在linux中的iptables,它可以定义多条规则,将他们组成一个表,共同发挥作用,实现详细的访问控制功能,其定义的规则可以让在内核空间当中的netfilter来读取,以下进行详细的介绍:

 

一.简介

iptables 的前身叫ipfirewall (内核1.x时代),其工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

    这是一种工作在用户空间中,定义规则的工具,本身并不算是防火墙。其定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)

      

二.工作机制

1.Iptables有四个表:(raw->mangle->nat->filter)

filter:定义过滤(允许或不允许)

nat :定义地址转换的(修改报文的源地址或目标地址) 

mangle:修改报文原数据 (拆解报文,做出修改,并重新封装超来)

raw :nat表上启用的连接追踪机制

2.Iptables五个钩子函数(hook function):

PREROUTING(路由前)

INPUT(数据包流入口)

FORWARD(转发管卡)

OUTPUT(数据包出口)

POSTROUTING(路由后)

通过这五个规则链上定义的规则筛选数据包进行网络控制。

3.其对应为:

raw:PREROUTING,OUTPUT
mangle:PREOUTING,INTPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT

4.报文流向:

由本机到某个进程:PREROUTING->INPUT

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

由本机某个进程转发的:OUTPUTING->POSTROUTING

5.规则的组成的部分:

匹配条件:检查IP、TCP、UDP等报文的某属性进行匹配,也可借助扩展模块

处理动作:ACCEPT ,DORP ,REJECT,借助模块

  

三.编写iptables:

格式:iptables [-t [table]] COMMAND chain [-m matchname[per-match-options]] [-j targetname [per-target-options]]

 

COMMAND:定义如何对规则进行管理

chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的

CRETIRIA:指定匹配标准

-j ACTION :指定如何进行处理

 

规则优化:

 (1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;

 (2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;

 (3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;

 (4) 设置默认策略;

     (a) 最后一条规则设定;

     (b) 默认策略设定;

 

四:详解COMMAND:

 

1.链管理命令(这都是立即生效的)

-P :设置默认策略的(设定默认门是关着的还是开着的)

  默认策略一般只有两种

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


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

    iptables-t nat -F PREROUTING

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

 

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

  iptables -Ninbound_tcp_web 表示附在tcp表上用于检查web的。

 

-X :用于删除用户自定义的空链

   使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了

 

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

   E oldname newname

 

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

   iptables -Z :清空

 

2.规则管理命令

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

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

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

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

        

3.查看管理命令 “-L”

附加子命令

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

-v:显示详细信息

-vv

-vvv :越多越详细

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

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

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

 

五:详解匹配标准

 

1.通用匹配:源地址目标地址的匹配

-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上

        

2.扩展匹配

2.1隐含扩展:对协议的扩展

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

-dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如

-dport 21  或者 --dport 21-23 (此时表示21,22,23)

-sport:指定源端口

-tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)

-echo-request(请求回显),一般用8 来表示

-echo-reply (响应的数据包)一般用0来表示

                 

2.2显式扩展(-m)

扩展各种模块,-m multiport:表示启用多端口扩展

multiport扩展(以离散或连续的方式定义多端口匹配条件)

                                  

[!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;

[!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

[!] --portsport[,port|,port:port]...:指定多个端口;

                                                  

iprange扩展(以连续的ip地址范围指明连续的多地址匹配条件)

[!] --src-range from[-to]:源IP地址;

[!] --dst-range from[-to]:目标IP地址;

                        

string扩展(对报文中的应用层数据做字符串匹配检测)

[!] --string pattern:要检测字符串模式;

[!] --hex-string pattern:要检测的字符串模式,16进制编码;

                        

time扩展(根据报文到达的时间与指定的时间范围进行匹配度检测)

-datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;

-datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;

-timestart hh:mm[:ss]

-timestop  hh:mm[:ss]

[!] --monthdays day[,day...]

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

                        

connlimit扩展(根据每客户端IP做并发连接数匹配)

-connlimit-upto n:连接数数量小于等于n,此时应该允许;

-connlimit-above n:连接数数量大于n,此时应该拒绝;

 

limit扩展(基于收发报文的速率进行匹配)

-limitrate[/second|/minute|/hour|/day]:平均速率

-limit-burst number:峰值速率

                        

state扩展(状态检测;连接追踪机制(conntrack))

INVALID:无法识别的状态;

ESTABLISHED:已建立的连接;

NEW:新连接;

RELATED:相关联的连接;

UNTRACKED:未追踪的连接;

 

六:详解-jACTION

 

常用的ACTION:

DROP:悄悄丢弃

一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表

REJECT:明示拒绝

ACCEPT:接受

MASQUERADE:源地址伪装

REDIRECT:重定向:主要用于实现端口重定向

MARK:打防火墙标记的

RETURN:返回

在自定义链执行完毕后使用返回,来返回原规则链。

 

七.练习:

1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

 

iptables -I INPUT -d 172.16.35.1 -p tcp--dport 80 -m state --state ESTABLISHED -j ACCEPT

iptables -I INPUT -d 172.16.35.1 -p tcp --dport 80 -mstate --state NEW -m limit --limit 100/second -m time ! --weekdays Mon -jACCEPT

iptables -A OUTPUT -s 172.16.35.1 -p tcp --sport 80 -mstate --state ESTABLISHED -m string ! --string "admin" --algo kmp -jACCEPT

 

2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.18.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

 

# lsmod | grep nf_conntrack_ftp

# modprobe nf_conntrack_ftp

# lsmod | grep nf_conntrack_ftp

nf_conntrack_ftp 18638 0 

nf_conntrack 105745  8nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4,nf_conntrack_ipv6

iptables -I INPUT 4 -d 172.18.0.0/24 -s172.16.35.1 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdaysMon,Tus,Wed,Thu,Fri --timestart 08:30:00 --timestop 18:00:00 -j ACCEPT

 

3、开放本机的ssh服务给172.18.x.1-172.18.x.100中的主机,x为你的学号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

 

iptables -A INPUT -p tcp -m iprange --src-range172.18.%.1-172.18.%.100 -m limit --limit 2/min --dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp -m iprange --dst-range172.18.%.1-172.18.%.100 -m state ! --state NEW --sport 22 -j ACCEPT

删除开始准备的ssh规则

1

2

3

iptables –-line-numbers -L

iptables –D INPUT [num]

iptables –D OUTPUT [num]

 

4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

iptables -A INPUT -d 172.16.35.1 -p tcp --tcp-flags ALLALL -j DROP

iptables -A OUTPUT -s 172.16.35.1 -p tcp --tcp-flagsALL NONE -j DROP

 

 

5、允许本机ping别的主机;但不开放别的主机ping本机;

iptables -A INPUT -p icmp --icmp-type 0 -d172.16.35.1 -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type 8 -s172.16.35.1 -j ACCEPT