Linux学习97 Linux防火墙iptables高级扩展匹配

一、iptables续

  1、显示扩展:必须使用-m选项指明要调用的扩展模块的机制

    a、multiport

      (1)、以离散或连续的方式定义多端口匹配条件,最多15个

      (2)、[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口

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

      (4)、将我们tcp的几个端口开放给INPUT访问

        1)、iptables -I INPUT -d 192.168.10.15 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT

        2)、我们将我们定义的第二条规则改为上述规则,先放行INPUT

[root@node3 ~]# iptables --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.10.15        udp dpts:137:138
2     2918  215K ACCEPT     tcp  --  *      *       192.168.10.0/24      192.168.10.15        tcp dpt:22
3        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.10.15        icmptype 0 code 0
4      569 46181 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
[root@node3 ~]# iptables -R INPUT 2 -d 192.168.10.15 -p tcp -m multiport --dports 22,80,139,445 -j ACCEPT
[root@node3 ~]# iptables --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.10.15        udp dpts:137:138
2        5   356 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.15        multiport dports 22,80,139,445
3        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.10.15        icmptype 0 code 0
4      569 46181 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

        3)、再放行OUTPUT

[root@node3 ~]# iptables --line-numbers -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       192.168.10.15        0.0.0.0/0            udp spts:137:138
2     1877  197K ACCEPT     tcp  --  *      *       192.168.10.15        192.168.10.0/24      tcp spt:22
3       21  1764 ACCEPT     icmp --  *      *       192.168.10.15        0.0.0.0/0            icmptype 8
4       15  1680 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
[root@node3 ~]# iptables -R OUTPUT 2 -s 192.168.10.15 -p tcp -m multiport --sports 22,80,139,445 -j ACCEPT
[root@node3 ~]# iptables --line-numbers -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       192.168.10.15        0.0.0.0/0            udp spts:137:138
2        4   576 ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            multiport sports 22,80,139,445
3       21  1764 ACCEPT     icmp --  *      *       192.168.10.15        0.0.0.0/0            icmptype 8
4       15  1680 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

    b、iprange

      (1)、以连续地址块的方式来指明多IP地址匹配条件

      (2)、[!] --src-range from [-to]

      (3)、[!] --dst-range from [-to]

      (4)、我们开放本机的telnet服务,只开放telnet给指定地址范围内的主机访问。即开放23号端口

        1)、首先要启动telnet服务,可以看到23号端口生效了

          systemctl start telnet.socket (注意看是socket)

        2)、开放INPUT

[root@node3 ~]# iptables --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.10.15        udp dpts:137:138
2      282 20176 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.15        multiport dports 22,80,139,445
3        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.10.15        icmptype 0 code 0
4      589 48051 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
[root@node3 ~]# iptables -I INPUT 3 -d 192.168.10.15 -p tcp --dport 23 -m iprange --src-range 192.168.10.10-192.168.10.20 -j ACCEPT
[root@node3 ~]# iptables --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.10.15        udp dpts:137:138
2      497 35504 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.15        multiport dports 22,80,139,445
3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.15        tcp dpt:23 source IP range 192.168.10.10-192.168.10.20
4        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.10.15        icmptype 0 code 0
5      589 48051 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

        3)、开放OUTPUT

[root@node3 ~]# iptables -I OUTPUT 3 -s 192.168.10.15 -p tcp --sport 23 -m iprange --dst-range 192.168.10.10-192.168.10.20 -j ACCEPT
[root@node3 ~]# iptables --line-numbers -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       192.168.10.15        0.0.0.0/0            udp spts:137:138
2      347 34548 ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            multiport sports 22,80,139,445
3        0     0 ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            tcp spt:23 destination IP range 192.168.10.10-192.168.10.20
4       21  1764 ACCEPT     icmp --  *      *       192.168.10.15        0.0.0.0/0            icmptype 8
5       15  1680 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

        4)、我们发现就可以在指定的地址范围内通过telnet进行登录了

    c、time:

      (1)用来匹配在什么时间能够访问网络什么时间不能访问网络

      (2)、--timestart hh:mm[:ss] #起始时间范围

      (3)、--timestop hh:mm[:ss] #结束时间范围

      (4)、[!] --weekdays day[,day...] #使用周几的时间范围

      (5)、[!] --monthdays day[,day...] #使用每月的几号允许或拒绝,一般和周几的时间范围不一起用,否则会取交集

      (6)、--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #

      (7)、--datestop [-MM[-DD[Thh[:mm[:ss]]]]]

      (8)、kerneltz:使用内核配置的时区而非默认的UTC

      (9)、演示:我们将刚刚的telnet规则进行修改,修改为只开放给有限的几个人访问,并且限制只在指定时间段内进行访问。假如我们工作时间是早上十点到下午四点。

        1)、首先我们需要开放访问我们的时间服务器的端口123和323(主要是为了同步时间服务器使时间准确)

      

        2)、添加相应的规则。先是INPUT。意思是我们来自于192.168.10.10-192.168.10.20访问我们192.168.10.15主机23号端口的时候都允许,并且时间范围是周1到周五的10点到16点之间的时候。并且时区需要使用内核配置的时区。

[root@node3 ~]# iptables -R INPUT 3 -d 192.168.10.15 -p tcp --dport 23 -m iprange --src-range 192.168.10.10-192.168.10.20 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4
,5 --kerneltz -j ACCEPT

        3)、添加OUTPUT上的规则

[root@node3 ~]# iptables --line-numbers -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       192.168.10.15        0.0.0.0/0            udp spts:137:138
2      882 88748 ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            multiport sports 22,80,139,445
3        0     0 ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            tcp spt:23 destination IP range 192.168.10.10-192.168.10.20 TIME from 10:00:00 to 16:00:00 on M
on,Tue,Wed,Thu,Fri4       21  1764 ACCEPT     icmp --  *      *       192.168.10.15        0.0.0.0/0            icmptype 8
5       15  1680 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

        4)、此时我们相应的主机就只有在固定时间段才能连上我们的环境了

    d、string:字符串匹配,他能做七层的检查。

      (1)、this modules matches a given string by using some pattern matching strategy

      (2)、--algo {bm | kmp} #使用哪种匹配算法检测,有bm和kmp两种算法

      (3)、[!] --string pattern

      (4)、[!] --hex-string pattern 

      (5)、--from offset:从哪个报文开始

      (6)、--to offset #从哪个报文结束

          如果不加--from和--to表示匹配整个报文

      (7)、示例:iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT

      (8)、我们检查访问的流量有gay字符串的不要响应。

        1)、我们启动一个httpd服务并且编辑/var/www/html/test.html网页文件中有gay字段

        2)、我们来限制请求报文,有gay字段的都拒绝

[root@node3 ~]# iptables --line-numbers -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 8 packets, 900 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      *       192.168.10.15        0.0.0.0/0            udp spts:137:138
2     1823  203K ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            multiport sports 22,80,139,445
3        0     0 ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            tcp spt:23 destination IP range 192.168.10.10-192.168.10.20 TIME from 10:00:00 to 16:00:00 on M
on,Tue,Wed,Thu,Fri4       21  1764 ACCEPT     icmp --  *      *       192.168.10.15        0.0.0.0/0            icmptype 8
5       23  2356 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
[root@node3 ~]# iptables -I OUTPUT -s 192.168.10.15 -m string --algo kmp --string "gay" -j REJECT
[root@node3 ~]# iptables --line-numbers -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       192.168.10.15        0.0.0.0/0            STRING match  "gay" ALGO name kmp TO 65535 reject-with icmp-port-unreachable
2        0     0 ACCEPT     udp  --  *      *       192.168.10.15        0.0.0.0/0            udp spts:137:138
3     1911  212K ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            multiport sports 22,80,139,445
4        0     0 ACCEPT     tcp  --  *      *       192.168.10.15        0.0.0.0/0            tcp spt:23 destination IP range 192.168.10.10-192.168.10.20 TIME from 10:00:00 to 16:00:00 on M
on,Tue,Wed,Thu,Fri5       21  1764 ACCEPT     icmp --  *      *       192.168.10.15        0.0.0.0/0            icmptype 8
6       23  2356 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

    e、connlimt

      (1)、Allows you to restrict the number of parallel connections to a server per client IP address(or client address block)

      (2)、--connlimit-upto n :上限,即小于等于的意思,即小于等于n的时候是开放的。 如果默认规则为白名单,即默认是拒绝的,那么需要写成小于等于的时候才允许。大于的时候是拒绝的。

      (3)、--connlimit-above n:下限,即大于等于。即大于n个并发时就是拒绝的。如果默认规则是黑名单,那么表示默认是允许的,即大于的时候才被拒绝,小于就默认是允许的。

      (4)、iptables -I INPUT -d 192.168.10.15 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT

      (5)、假如我们一台服务器一共支持2000个并发连接请求但是有一个客户端一共发送了3000个连接请求这样就被他占完了,其它人就连接不进来了,服务器就没法服务了。因此我们可以限制每一个单独的客户端最多并发请求数量,这个就可以用connlimt来限制。

        1)、我们启动一个mysql服务,然后授权一个用户有相应的访问权限。并且在防火墙开启相应的访问权限。

[root@node3 ~]# iptables -I INPUT 2 -s 192.168.10.0/24 -d 192.168.10.15 -p tcp --dport 3306 -j ACCEPT
[root@node3 ~]# iptables -I OUTPUT 2 -d 192.168.10.0/24 -s 192.168.10.15 -p tcp --sport 3306 -j ACCEPT
[root@node3 ~]#

        2)、现在我们来限制单机最多只能发起两个连接。我们这儿默认规则是拒绝,因此我们需要写成低于n就允许。

[root@node3 ~]# iptables -R INPUT 2 -d 192.168.10.15 -s 192.168.10.0/24 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT

    f、limit 

      (1)、this module matches at a limited rate using a token bucket filter

      (2)、--limit rate[/second|/minute|/hour|/day] #指明速率的,即每多少时间发多少个包

      (3)、--limit-burst number #一次最多能收集多少个令牌。

      (4)、iptables -I OUTPUT -s 192.168.10.15 -p icmp --icmp-type 0 -j ACCEPT

      (5)、一样的道理,limit是用来做速率的限制的,他限制的不是并发连接,比如我们有一个ftp服务器,用户开始启动下载请求,假如我们带宽才10M,我们用户就把下载带宽给占满了。这个肯定是不合理的。因此我们可以用limit进行限速,不过他不是从带宽占用速率来限制的,而是从报文发包速率来限制的。因此我们是通过令牌桶算法来实现的,即报文要出去必须拿着令牌才可以,我会固定时间发令牌。即在内核与协议栈的位置发令牌。因为如果我按照固定速率发令牌,但是你的发包速率并不是时刻都有,如果我们发了一个文件后就不需要了,如果我们令牌还是继续发的话那么你是用呢还是不用呢?如果不需要的话是扔了还是怎么样呢?那么我们就可以找个桶攒起来,等下次发的时候一次往外发就可以了,不过我们的桶的大小是有限的。我们不可能让其无限大的。这就是令牌桶算法。

      (6)、接下来我们来配置规则

        1)、配置INPUT和OUTPUT,INPUT中,平均每分钟20个包,即平均三秒钟一个,并且收集令牌桶5个,即第一次一下发5个出来,随即也要受速率限制。

[root@node3 ~]# iptables -I INPUT 6 -d 192.168.10.15 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
[root@node3 ~]# iptables -I OUTPUT 6 -s 192.168.10.15 -p icmp --icmp-type 0 -j ACCEPT

      (7)、限制本机某tcp服务接收请求的速率:--syn,-m limit

    g、state。(见下集)

原文地址:https://www.cnblogs.com/Presley-lpc/p/13032297.html