iptables详解

   在linux中,netfilter(ip信息包过滤系统)是内核的一部分,提供防火墙(Firewall)、网络地址转换(NAT)、数据包记录、流量统计等功能,换言之,它是工作于主机或网络边缘,对于进出的报文根据定义的规则作检查,进而对被规则匹配到的报文作为相应处理的套件iptables是用户空间的netfilter控制工具,它使插入、修改和除去信息包处理表中的规则变得容易。


一、iptables/netfilter的链和表

  1、链

    netfilter在整个网络流程中内置了几条链(检测点),而在每条链上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)。

    netfilter内置的五条链:     

       PREROUTING:路由决策前

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

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

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

       POSTROUTING:路由决策后

iptables详解_第1张图片

    数据报文流程:

       ①跟本机内部进程通信:

           进:PREROUTING,INPUT

           出:OUTPUT,POSTROUTING

       ②由本机转发:

           PREROUTING,FORWARD,POSTROUTING     

  2、表

      netfilter由一些按功能分类的信息包处理表组成,这些是内核用来控制信息包处理的规则集

      netfilter的四个表:        

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

         nat:网络地址转换,会启用connection_track;

             SNAT:源地址转换

             DNAT:目标地址转换

             PNAT:端口和地址转换

         mangle:可以用来改变包的一些属性,如

             TOS(TYPE OF SERVICE):设置或改变数据包的服务类型

             TTL(TIME TO LIVE):改变数据包的生存时间

             MARK:给包设置特殊的标记

         raw:关闭nat表上启用的连接追踪功能(因连接追踪功能比较消耗系统性能)

      表的处理优先级:raw > mangle > nat > filter

  3、表和链的对应关系为:       

       filter:INPUT,FORWARD,OUTPUT

       nat:PREROUTING(DNAT),POSTROUTING(SNAT),OUTPUT

       mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

       raw:PREROUTING,OUTPUT


二、iptables的用法

  1、基本语法:iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET

    ■-t TABLE:nat, mangle, raw, filter。默认为filter

    ■COMMAND:

        链:

          -F:flush,清空表中的指定链,缺省为所有链

          -N:new,自建一条链

             自定义的链只能被主链上的规则作为跳转目标,若自定义链上没有规则能匹配报文,应让其返回主链

             例:

               iptables -N http_in

               iptables -A http_in -m iprange --src-range 172.16.100.1-172.16.100.100 -j DROP

               iptables -A http_in -m state --state NEW -j ACCEPT

               iptables -A http_in -j RETURN  #返回主链

               iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -j http_in

          -X:delete,删除自定义且零引用

          -Z:zero,计数器归零

          -P chain target:policy,设置默认策略,对filter表来讲,默认策略为ACCEPT或DROP;注意 target 前面没有-j

          -E old_name new_name:重命名零引用的自定义链

        链上的规则:

          -A:append,附加规则于链末

          -I chain [#]:insert,向链中插入规则;#表示规则编号,缺省为1

          -D chain #(或-D chain rule-specification):delete,删除指定的规则

          -R chain #:替换指定的规则

        查询:

          -L:列出指定链上的所有规则,缺省为所有链

              -n:以数字格式显示

              -v:详细格式,-vv,-vvv

              -x:exactly,不要对计数器的计数结果做单位换算,而显示其精确值

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

     ■匹配条件

        通用匹配:

          -s 地址:指定报文源IP地址匹配的范围;可以是IP或网络地址;可使用!取反

                  --src, --source

          -d 地址:指定报文目标IP地址匹配的范围;

                  --dst, --destination

          -p 协议:指定匹配报文的协议类型,一般为tcp, udp或icmp;

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

          -o INTERFACE:数据报文流出的接口;(OUTPUT, FORWARD, POSTROUITING)

      ▲扩展匹配:调用netfilter额外模块实现特殊检查

        △隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;

            -p tcp:

               --sport PORT[-PORT]:指定源端口,可以是端口范围

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

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

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

                       --tcp-flags all none  #这些标志位全为1或全为0都不正常

               --syn:相当于--tcp-flags syn,ack,rst,fin syn

            -p udp:

               --sport

               --dport

            -p icmp:

               --icmp-type

                  0:echo-reply, ping响应

                  8:echo-request, ping请求

              例如:

                允许ping其它主机而不允许其它主机ping自己

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

                  iptables -A INTPUT -d 172.16.100.7 -p icmp --icmp--type 0 -j ACCEPT

         △显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;

            -m 扩展模块名称

            常用模块:

             multiport:多端口匹配;可用于匹配非连续或连续端口,最多指定15个端口;

               专用选项:

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

                  --destination-ports, --dports

                  --ports

               例如:

                  iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT

                  iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT


             iprange:匹配指定范围内的地址;

                专用选项:

                  [!] --src-ragne IP[-IP]

                  [!] --dst-range

                例如:

                  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 ACCEPT

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


             string:字符串匹配,能够检测报文应用层中的字符串

                    字符匹配检查高效算法:kmp, bm

                专用选项:

                  --algo {kmp|bm}

                  --string "STRING"

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

                例如:iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP


             time:基于时间做访问控制

                专用选项:

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

                  --datestop

                  --timestart hh:mm[:ss]

                  --timestop hh:mm[:ss]

                  --weekdays day[,day]

                例如:iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:30 --timestop 17:30 --weekdays Mon,Tue,Thu,Fri -j REJECT


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

                专用选项:

                  [!] --connlimit-above [n]

                例如:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP


             limit:速率限制

                专用选项:

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

                  --limit-burst n

                例如:iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT


             state:状态检查

                专用选项:

                  --state

                    连接追踪中的状态:

                      NEW: 新建立一个会话

                      ESTABLISHED:已建立的连接

                      RELATED: 有关联关系的连接

                      INVALID: 无法识别的连接

                例如:

                  iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT

                  iptables -I INPUT -m state --state ESTABLISHED

                  iptables -I OUTPUT -m state --state ESTABLISHED

                调整连接追踪功能所能容纳的连接数上限:

                  /proc/sys/net/nf_conntrack_max和/proc/sys/net/netfilter/nf_conntrack_max(若连接数超出了上限,服务器会拒绝新的连接请求)

                当前追踪的所有连接:

                  /proc/net/nf_conntrack

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

                  /proc/sys/net/netfilter目录

              ★放行被动模式下的FTP服务

                  ⑴装载模块:modprobe nf_conntrack_ftp

                     /lib/modules/KERNEL_VERSION/kernel/net/netfilter/                            使用modprobe命令装载模块只是即时有效,重启系统后失效,要想长期有效,可编辑iptables配置文件:

                       vim /etc/sysconfig/iptables-config

                         IPTABLES_MODULES="nf_conntrack_ftp"

                  ⑵放行请求报文

                    ①放行NEW状态对21端口请求的报文;

                    ②放行ESTABLISHED以及RELATED状态的报文

                  ⑶放行响应报文:

                     放行ESTABLISHED以及RELATED状态的报文

     ■处理目标:

         DROP,REJECT,ACCEPT

         defi_chain

         RETURN:在自义链中无法匹配报文时,让其返回主链

            iptables -A defi_chain -j RETURN

         SNAT,DNAT,MASQUERADE

         LOG,REDIRECT, MARK

            LOG表示记录日志,例如 iptables -A INPUT -d 192.168.30.20 -p tcp --dport 80 -j LOG [--log-prefix "iptables:" [--log-level #]]


 2、规则文件:/etc/sysconfig/iptables

      通过iptables命令编写的规则会立即有效,但不会长期有效。若想长期有效,需将生成的规则保存于规则文件中:

       ①iptables-save > /etc/sysconfig/iptables  #iptables-save可将规则保存到其它指定位置

       ②service iptables save

      生效规则文件中的规则(会同时清空现有规则):

       iptables-restore < /etc/sysconfig/iptables

       service iptables restart

[root@node2 ~]# iptables -L -n -v   #以数字格式显示filter表中各条链上规则信息。
# 可以看到,filter表中只有三条链,默认策略均为ACCPET
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
匹配的包数 字节数 目标 协议 流入口 流出口 源地址 目标地址
 pkts bytes target     prot opt in     out     source               destination         
  263 19097 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
  240 20506 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT 190 packets, 20699 bytes)
 pkts bytes target     prot opt in     out     source               destination
[root@node2 ~]# iptables -t nat -L -n   #显示nat表中的规则信息
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@node2 ~]# iptables -F   #清空filter表中的所有链
[root@node2 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@node2 ~]# iptables -N ssh_in
[root@node2 ~]# iptables -N web_in
[root@node2 ~]# iptables -N dns_in
[root@node2 ~]# iptables -N ftp_in
[root@node2 ~]# iptables -A ssh_in -m state --state NEW -j ACCEPT
[root@node2 ~]# iptables -A ssh_in -j RETURN
[root@node2 ~]# iptables -A web_in -m iprange --src-range 192.168.30.101-192.168.30.254 -j DROP
[root@node2 ~]# iptables -A web_in -m state --state NEW -j ACCEPT
[root@node2 ~]# iptables -A web_in -j RETURN
[root@node2 ~]# iptables -A dns_in -m state --state NEW -j ACCEPT
[root@node2 ~]# iptables -A dns_in -j RETURN
[root@node2 ~]# modprobe nf_conntrack_ftp
[root@node2 ~]# lsmod | grep 'ftp'
nf_conntrack_ftp       12913  0 
nf_conntrack           79758  6 nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state
[root@node2 ~]# vim /etc/sysconfig/iptables-config 

# Load additional iptables modules (nat helpers)
#   Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
# are loaded after the firewall rules are applied. Options for the helpers are
# stored in /etc/modprobe.conf.
IPTABLES_MODULES="nf_conntrack_ftp"
...
[root@node2 ~]# iptables -A ftp_in -m state --state NEW -j ACCEPT
[root@node2 ~]# iptables -A ftp_in -j RETURN
[root@node2 ~]# iptables -A INPUT -d 192.168.30.20 -p tcp --dport 22 -j ssh_in
[root@node2 ~]# iptables -A INPUT -d 192.168.30.20 -p tcp --dport 80 -j web_in
[root@node2 ~]# iptables -A INPUT -d 192.168.30.20 -p tcp --dport 53 -j dns_in
[root@node2 ~]# iptables -A INPUT -d 192.168.30.20 -p udp --dport 53 -j dns_in
[root@node2 ~]# iptables -A INPUT -d 192.168.30.20 -p tcp --dport 21 -j ftp_in
[root@node2 ~]# iptables -A INPUT -d 192.168.30.20 -p icmp -j ACCEPT
[root@node2 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@node2 ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED
[root@node2 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED
[root@node2 ~]# iptables -A OUTPUT -s 192.168.30.20 -p tcp --sport 22 -m state --state NEW -j ACCEPT 
[root@node2 ~]# iptables -A OUTPUT -s 192.168.30.20 -p icmp -j ACCEPT
[root@node2 ~]# iptables -A OUTPUT -o lo -j ACCEPT


  3、网络防火墙

      netfilter在INPUT和OUTPUT链上表现的是其作为 主机防火墙 的角色,而其在FORWARD链上则表现是的作为 网络防火墙 的角色

      在以下的示例中:

        node2为服务器,其地址为192.168.30.20;node3为客户端,其地址为172.16.30.3;node1有两张网卡eth0和eth1,地址分别为192.168.30.10和172.16.30.1,位于两个不同网络中。

        在node1上开启了报文转发功能,并将其设为两个网络的默认网关,从而使得其将两个网络连接起来,充当了路由的角色,而且在转发链上生成了一些过滤规则,使其具有了网络防火墙的功能

iptables详解_第2张图片

[root@node1 ~]# ifconfig eth1 172.16.30.1/16   #给node1有eth1配置一个地址
[root@node1 ~]# ifconfig eth1 up
[root@node1 ~]# ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 00:0C:29:40:35:A7  
          inet addr:172.16.30.1  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::20c:29ff:fe40:35a7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:184 errors:0 dropped:0 overruns:0 frame:0
          TX packets:909 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:11040 (10.7 KiB)  TX bytes:309294 (302.0 KiB)


[root@node1 ~]# iptables -F
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward   #开启报文转发功能
[root@node1 ~]# modprobe nf_conntrack_ftp
[root@node1 ~]# iptables -A FORWARD -d 192.168.30.20 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
[root@node1 ~]# iptables -A FORWARD -s 192.168.30.20 -p tcp --sport 22 -m state --state NEW -j ACCEPT
[root@node1 ~]# iptables -A FORWARD -p icmp -j ACCEPT
[root@node1 ~]# iptables -I FORWARD -m state --state ESTABLISHED,RELATED
[root@node1 ~]# iptables -P FORWARD DROP
[root@node1 ~]# iptables -L FORWARD -n
Chain FORWARD (policy DROP)
target     prot opt source               destination         
           all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     tcp  --  0.0.0.0/0            192.168.30.20       multiport dports 21,22,80 state NEW 
ACCEPT     tcp  --  192.168.30.20        0.0.0.0/0           tcp spt:22 state NEW 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
[root@node2 ~]# route del default gw 192.168.30.2
[root@node2 ~]# route add default gw 192.168.30.10   #将node2的网关指向node1

iptables详解_第3张图片iptables详解_第4张图片iptables详解_第5张图片


  4、nat


iptables详解_第6张图片

    如上图,假定node2和node3分别位于公网和内网中,node1的两张网卡eth0、eth1分别配有公有地址和私有地址。node2的ip地址和node1的eth0的地址位于不同的网络中,意即node2和node1之间通信会经过若干个路由器。

    此时,若想实现node3和node2的通信,在node1上仅开启报文转发功能是不够的,必须做地址转换,因为公网上的路由器是不给私有地址路由的。

    如果是内网访问公网,如node3访问node2,则源地址是私有地址,需要做源地址转换(SNAT),且要在请求报文即将离开node1时即POSTROUTING链上处理。用户只需要制定前半段规则,后半段即响应阶段无需参与,因为NAT机制会自动记录内部和外部的连线信息。

    如果是外网请求内网中的主机,则目标地址是私有地址,需要在PREROUTING链上做目标地址转换(DNAT),同样,用户只需参与前半段。

    在以下的示例中,为演示的方便,node1的eth0和node2的eth0地址仍为192.168.30.10、192.168.30.20,只是假定它们位于公网上的不同网络中


   ⑴SNAT示例:

      ptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.30.10

[root@node1 ~]# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.30.10
[root@node1 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  172.16.0.0/16        0.0.0.0/0           to:192.168.30.10 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@node2 ~]# route del default gw 192.168.30.10   #node2的网关不再指向node1

iptables详解_第7张图片

[root@node2 ~]# tail -1 /usr/local/apache/logs/access_log 
192.168.30.10 - - [18/Feb/2016:02:07:46 +0800] "HEAD / HTTP/1.1" 200 -

    ■上面演示的是将内网地址转换为一个固定的公网地址,但是,设想这样一种情况,若代理上网主机(如node1)是拨号上网,意即其获得的公网地址不固定,则该如何做源地址转换呢?

       iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j MASQUERADE(地址伪装)


   ⑵DNAT示例:

       iptables -t nat -A PREROUTING -d 192.168.30.10 -p tcp --dport 80 -j DNAT --to-destination 172.16.30.3[:8080]

[root@node1 ~]# iptables -t nat -A PREROUTING -d 192.168.30.10 -p tcp --dport 80 -j DNAT --to-destination 172.16.30.3
[root@node1 ~]# iptables -I FORWARD 3 -d 172.16.30.3 -p tcp --dport 80 -m state --state NEW -j ACCEPT
[root@node1 ~]# service httpd status
httpd is stopped   #node1的httpd处于关闭状态

iptables详解_第8张图片

[root@node2 ~]# curl -I 192.168.30.10
HTTP/1.1 200 OK
Date: Thu, 10 Dec 2015 22:08:42 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 10 Dec 2015 22:03:42 GMT
ETag: "60b8c-6-52692613e8b37"
Accept-Ranges: bytes
Content-Length: 6
Connection: close
Content-Type: text/html; charset=UTF-8

wKiom1bFX42hywZMAAALa7jYP5w351.png


  5、关于连接追踪

    连接追踪是实现NAT必不可少的机制,并且可以用来制定更为高效和精确的防火墙过滤规则,缺点是比较消耗系统资源当访问数超过追踪记录表所能允许的最大值时,服务器会拒绝新的连接请求。为了满足更多的访问需求,解�Q方法一般有两个:     

      ①加大 nf_conntrack_max

        vim /etc/sysctl.conf

        net.ipv4.nf_conntrack_max = 393216

        net.ipv4.netfilter.nf_conntrack_max = 393216

      ②降低 nf_conntrack timeout 时间

       vim /etc/sysctl.conf

        net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300

        net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120

        net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60

        net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

    对于访问量大的服务器,最好关闭连接追踪功能

      ①删除含有 -m state 的规则,清空nat表

      ②移除 nf_conntrack 模块:modprobe -r nf_conntrack


  6、利用iptables的connlimit和recent模块来抵御DOS攻击

      以SSH为例:    

        方式一:

          iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

          说明:利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值

        方式二:

          iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

          iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attack: "

          iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

          说明:

            ①利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后才可恢复访问。

            ②第一句是记录访问tcp 22端口的新连接,记录名称为SSH。--set表示记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

            ③第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

             --update 是指每次建立连接都更新列表;

             --seconds必须与--rcheck或者--update同时使用

             --hitcount必须与--rcheck或者--update同时使用

            ④iptables的记录:/proc/net/xt_recent/SSH


三、iptables总结 

   ①过滤应做白名单,即把默认策略设为DROP

   ②先添加规则放行自己的会话

   ③在编写规则前可先定义一个重启iptables服务的任务计划,这样即使因操作不当被防火墙屏蔽,待iptables重启后又可重新进入

   ④尽量减少规则条目,彼此不相关的匹配机会较多的放在上面,属于同一功能匹配规则更严格的放在上面


四、iptables使用示例

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

     iptables -N web_in

     iptables -A web_in -m time --weekdays Mon -j DROP

     iptables -A web_in -m string --algo kmp --string "admin" -j DROP

     iptables -A web_in -m state --state ESTABLISHED -j ACCEPT

     iptables -A web_in -m state --state NEW -m limit --limit 100/second -j ACCEPT

     iptables -A web_in -j RETURN

     iptables -A INPUT -d 192.168.30.20 -p tcp --dport 80 -j web_in

     iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT


  2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;

     iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

     iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 21 -m time --timestart 08:30 --timestop 17:30 --weekdays Mon,Tue,Wen,Thu,Fri -j ACCEPT

     iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


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

     iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT 

     iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 172.16.30.1-172.16.30.100 -m state --state NEW -m limit --limit 2/minute -j ACCEPT

     iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT


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

     iptables -I INPUT -p tcp --tcp-flags all none -j DROP

     iptables -I INPUT -p tcp --tcp-flags all all -j DROP

你可能感兴趣的:(iptables)