首页 > 代码库 > iptables的概述及应用(一)

iptables的概述及应用(一)

Iptables

 

Iptables是属于网络层的防火墙,但是并不正真意义上是防火墙,因为iptables/netfilter是一个组件,iptables只是负责编写规则并提交给netfilter做执行的规则生成器。Netfiter是在linux内核中TCP/IP协议栈中工作的一个框架,从软件的角度来将是在TCP/IP协议栈中做了五个钩子函数,这五个钩子函数可非常准确的执行iptables所编写的规则并实现规则中相关的拦截和放行。规则的功能分别为raw,mangle,nat,filter四种,这些规则统称为表;而钩子函数分为PREROUTINGINPUTFORWARDOUTPUTPOSTOUTING五种,这些钩子函数统称为链

钩子函数是指:

            PREROUTING:马上就要到本机时,简称为路由前

            INPUT:到达本机内部的报文必经之路

            FORWARD:由本机转发的报文必经之路

            OUTPUT:由本机发出的报文的必经之路

            POSTROUTING:马上就要离开本机,简称为路由后

规则的功能是指:

             filter:过滤,定义是否允许通过防火墙

             nat:地址转换,用于转换源地址和源端口或目标地址和目标端口

             mangle:用于修改报文首部某些特性但不修改IP

             raw:目标是为nat表上启用的连接追踪功能

 

表和链的对应关系:

             filter:INPUT, FORWARD, OUTPUT

             nat:PREROUTINGSNAT),POSTROUTINGDNAT),OUTPUT

             mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

             raw:PREROUTING, OUTPUT

下为图解:

                   wKiom1P0o2vzix3MAAK7vfvP5xw292.jpg

使用iptables编辑完规则后是可以直接生效的,因为iptables编辑完成以后会自动发往netfilter内,netfilter接收到以后便立即执行

下面说下iptables编写规则的基本使用

Iptables的基本语法

  iptables[-t TABLE] COMMAND CHAIN  CRETIRIA -jTARGET

      -t TABLE: 表示指定规则

        nat, mangle, raw, filter

          默认为filter

       COMMAND  链中的命令

         -Fflush,清空规则链

         -N: new,自建一条链

         -X: delete, 删除一条自定义的空链

         -Zzero 计数器归零

         -Ppolicy,设置默认策略,对filter表来讲,默认规则为ACCEPTDROP

         -E:重命名自定义链

       链中的规则:

         -A:增加

         -I:插入

         -D:删除

         -R:修改、替换

       查询:

         -L

          -n:数字格式显示主机地址和端口;

          -v:详细格式

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

  匹配条件分为通用匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配,下面是匹配条件的具体命令

通用匹配:

         -s  地址: 指定报文源IP地址的匹配的范围,可以是IP也可以是网络地址;可使用!取反, --src--source-s表达的意思一样

         -d 地址:指定报文目标IP地址匹配的范围,--dst--destination-d表达的意思一样

         -p 协议:指定匹配报文的协议类型,一般有三种tcp,udpicmp;

         -i INTERFACE: 数据报文流入的接口;PREROUTING,INPUT, FORWARD

         -oINTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING

扩展匹配:

  隐式扩展:

   -ptcp [-m tcp]

       --sportPORT[-PORT]:指定源端口

       --dport:指定目标端口

       --tcp-flag要检查标志位列表(用逗号分隔)必须为1的标志位列表(逗号分隔)

   -p udp [-m udp]

       --sport:指定源端口

       --dport:指定目标端口

   -picmp [-m icmp]

       --icmp-type

        0: echo-reply,ping响应

        8:echo-request, ping请求

显示扩展:

    -m扩展模块名称(模块:是iptablesnetfilter各拥有的一部分代码;在添加模块时可使用“,”和“: ,表示离散的、:表示连续的)


multiport:多端口匹配(可用于匹配非连续或连续端口;最多指定15个端口;在添加模块时可使用,和: ,表示离散的,:表示连续的)

专用选项:

   --source-ports, --sportsport[,port,port:port]

   --destination-ports, --dports

    --ports

iprange:匹配指定范围内的地址;匹配一段连续的地址而非整个网络时有用;

专用选项:

 [!]--src-range:源地址或地址段[!表示可以取反]

  --dst-range:目标地址或地址段    

string:字符串匹配,能够检测报文应用层中的字符串(字符匹配检查高效算法kmp, bm

专用选项:

    --algo {kmp|bm}:比较时的算法

    --string "STRING"

    --hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串; 

                                       (注:stringhex-string中选其一使用就可以)

time:基于时间做访问控制

专用选项:

    --datestart:起始时间 YYYY[-MM][-DD[Thh[:mm[:ss]]]]

    --datestop :结束时间  

    --timestart    hh:mm[:ss]

     --timestop     hh:mm[:ss]             

     --weekdays:设定以星期为单位  day[,day] Mon.Tues.Wed.Thur.Fri.Sat.Sun

connlimit:连接数限制,对每IP所能够发起并发连接数做限制;

专用选项:

     --connlimit-above [n]:大于所设定的数字就拒绝,小于就允许

 

limit:速率限制

专用选项:

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

    --limit-burst nn表示个数)

state:状态检查

专用选项:

 --state

 连接追踪中的状态:

NEW: 新建立一个会话

ESTABLISHED:已建立的连接

RELATED: 有关联关系的连接

INVALID: 无法识别的连接

       调整连接追踪功能所能容纳的连接的最大数目:

        /proc/sys/net/nf_conntrack_max           

       记录当前追踪的所有连接

          /proc/net/nf_conntrack 

        不同协议或连接类型追踪时的属性:   

        /proc/sys/net/netfilter目录:

处理目标:

  内置目标:

       DROP:表示拒绝

       REJECT:有状态的拒绝

       ACCEPT:允许

       自定义链:为自己根据需求所设定的链

 

 Iptables的常用命令已经介绍完了,下面为大家举例说明命令的使用
1、设定172.16.0.0网段的无法ping通172.16.25.1主机
root@localhost~]# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.25.1 -p icmp -j DROP
2、查看设定的情况
[root@localhost~]# iptables -L -n –v
3、删除INPUT中设定的第一条策略
[root@localhost~]# iptables -D INPUT 1
4、再设置INPUT,OUTPUT链默认target为DROP,一定要将远程端口设定为打开,否则也会把自己挡在防火墙之外
[root@localhost~]# iptables -A INPUT -i eth0 -s 172.16.0.0/16 -d 172.16.25.1 -p tcp --dport 22-j ACCEPT
[root@localhost~]# iptables -A OUTPUT -s 172.16.25.1 -d 172.16.0.0/16 -p tcp --sport 22 -jACCEPT
5、设置INPUT, OUTPUT链默认target为DROP,也就是外部与服务器不能通信
[root@localhost~]# iptables -t filter -P INPUT DROP
[root@localhost~]# iptables -t filter -P OUTPUT DROP
6、修改在使用远程访问本机时只能通过eth0的端口访问
[root@localhost~]# iptables -R OUTPUT 1 -s 172.16.25.1 -d 172.16.0.0/16 -o eth0 -p tcp --sport22 -j ACCEPT
7、插入一条对应规则,可以使本主机ping自己的回环地址
[root@localhost~]# iptables -I INPUT -i lo -j ACCEPT
[root@localhost~]# iptables -I OUTPUT -o lo -j ACCEPT
8、设置本机可以ping其他主机
[root@localhost~]# iptables -R INPUT 2 -d 172.16.25.1 -p icmp --icmp-type 0 -j ACCEPT
[root@localhost~]# iptables -A OUTPUT -s 172.16.25.1 -p icmp --icmp-type 8 -
j ACCEPT
9、添加multiport模块,设置只能使用访问本机的22和80端口的服务
[root@localhost~]# iptables -I INPUT -d 172.16.25.1 -p tcp -m multiport --dports 22,80 -jACCEPT
[root@localhost~]# iptables -R OUTPUT 1 -s 172.16.25.1 -p tcp -m multiport --sports 22,80 -jACCEPT
10、添加iprange模块,设置只能某个网段使用telnet来访问本主机
[root@localhost~]# iptables -I INPUT -d 172.16.25.1 -p tcp --dport 23 -m iprange --src-range172.16.25.1-172.16.25.210 -j ACCEPT
[root@localhost~]# iptables -I OUTPUT  -s 172.16.25.1 -ptcp --sport 23 -m iprange --dst-range 172.16.25.1-172.16.25.210
11、添加string模块,设置只要出现所设定的字符就会出现拒绝访问
[root@localhost ~]# iptables -I OUTPUT-m string --algo kmp --string "game" -j DROP
12、添加time模块,设定在工作日的9点到17点拒绝访问本主机的web服务
[root@localhostwordpress]# iptables -I INPUT -d 172.16.25.1 -p tcp --dport 80 -m time--timestart 09:00 --timestop 17:00 --weekdays Tue,Thur -j DROP
13、添加connlimit模块,限制连接数
[root@localhostwordpress]# iptables -A INPUT -d 172.16.25.1 -p tcp --dport 22 -m connlimit--connlimit-above 2 -j DROP
14、添加limit模块,限制速率
[root@localhostwordpress]# iptables -A INPUT -d 172.16.25.1 -p icmp --icmp-type 8 -m limit--limit 20/m --limit-burst 7 -j ACCEPT
15、state的使用
1)使用state模块设置ssh和web的出入策略
[root@localhost~]# iptables –A INPUT –d 172.16.25.1 –p tcp –m multiport --dports 22,80 –mstate –state NEW –j ACCPET
[root@localhost~]#iptables –I INPUT –d 172.16.25.1 –p tcp –m state –state ESTABLISHED –jACCEPT
[root@localhost~]#iptables –I OUTPUT –s 172.16.25.1 –p tcp –m state –state ESTABLISHED –jACCEPT
2)设置被动连接的ftp服务
[root@localhost~]# modprobe nf_conntrack_ftp
[root@localhost~]# iptables -AINPUT -d 172.16.25.1 -p tcp -m state --state RELATED -j ACCEPT
[root@localhost~]#iptables-R OUTPUT 1 -s 172.16.25.1 -m state --state ESTABLISHED,RELATED -j ACCEPT

 


本文出自 “学习ING” 博客,请务必保留此出处http://nydia.blog.51cto.com/6404696/1542811