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。(见下集)