前言:19年搞的一个小玩意,懒得整理了,有时间的可以快速看看,赶时间的直接跳到第二部分
0X00 乱七八糟的资料收集
systemctl管理iptables服务,yum remove iptables yum install iptables-services
保存规则的两种方式:
service iptables save
/usr/libexec/iptables/iptables.init save
iptables -A INPUT -m limit -s 192.168.3.106 --limit 5/sec -j ACCEPT 如果不加-s,限定是总速率
iptables -A INPUT -s 192.168.3.106 -j DROP
对于每个Client进行限速:
hashlimit的匹配是基于令牌桶 (Token bucket)模型的。令牌桶是一种网络通讯中常见的缓冲区工作原理,它有两个重要的参数,令牌桶容量n和令牌产生速率s。我们可以把令牌当成是门票,而令牌桶则是负责制作和发放门票的管理员,它手里最多有n张令牌。一开始,管理员开始手里有n张令牌。每当一个数据包到达后,管理员就看看手里是否还有可用的令牌。如果有,就把令牌发给这个数据包,hashlimit就告诉iptables,这个数据包被匹配了。而当管理员把手上所有的令牌都发完了,再来的数据包就拿不到令牌了。这时,hashlimit模块就告诉iptables,这个数据包不能被匹配。除了发放令牌之外,只要令牌桶中的令牌数量少于n,它就会以速率s来产生新的令牌,直到令牌数量到达n为止。通过令牌桶机制,即可以有效的控制单位时间内通过(匹配)的数据包数量,又可以容许短时间内突发的大量数据包的通过(只要数据包数量不超过令牌桶n)。
hashlimit模块提供了两个参数--hashlimit和--hashlimit-burst,分别对应于令牌产生速率和令牌桶容量。除了令牌桶模型外,hashlimit匹配的另外一个重要概念是匹配项。在hashlimit中,每个匹配项拥有一个单独的令牌桶,执行独立的匹配计算。通过hashlimit的--hashlimit-mode参数,你可以指定四种匹配项及其组合,即:srcip(每个源地址IP为一个匹配项),dstip(每个目的地址IP为一个匹配项),srcport(每个源端口为一个匹配项),dstport(每个目的端口为一个匹配项)
除了前面介绍的三个参数外,hashlimit还有一个必须要用的参数,即--hashlimit-name。 hashlimit会在/proc/net/ipt_hashlimit目录中,为每个调用了hashlimit模块的iptables 命令建立一个文件,其中保存着各匹配项的信息。--hashlimit-name参数即用来指定该文件的文件名。
iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh --hashlimit 5/sec --hashlimit-burst 10 --hashlimit-mode srcip -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
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)
对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn = --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
-p udp:UDP协议的扩展
--dport
--sport
-p icmp:icmp数据报文的扩展
--icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
RETURN的用法,在子链中使用RETURN 会返回到上一层链,直到target为ACCPT或DEROP或REJECT,不然一直返回到父链中,匹配下一条规则。
匹配tcp第一次握手的报文
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
[root@localhost ~]# iptables -t filter -nvxL INPUT
Chain INPUT (policy ACCEPT 10 packets, 712 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x3F/0x02 reject-with icmp-port-unreachable
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
–tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN 这个的意思是要匹配SYN,ACK,FIN,RST,URG,PSH这五个标志为,且SYN为1的报文
匹配tcp第二次握手的报文
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
上述可以简写成
用ALL
来表示SYN,ACK,FIN,RST,URG,PSH
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN-j REJECT
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN,ACK -j REJECT
修改某条规则:
iptables -R INPUT 1 -s 192.168.0.1 -j DROP
清空所有规则:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t raw -F
iptables -t raw -X
0X01 实现对总流量限制、TCP流量限制、SYN包限制、ACK包限制:
****本机程序访问本机程序的数据包同样会经过INPUT链****
#!/bin/bash
iptables -N all-chain # 用来限制总流量/IP
iptables -N tcp-chain # 限制tcp流量/IP
iptables -N SYN-chain # 限制SYN包流量/IP
iptables -N ACK-chain # 限制ACK包流量/IP
iptables -N all-limit # 限制总触发阀值
iptables -N tcp-limit # 限制tcp总触发阀值
iptables -N SYN-limit # 限制SYN总触发阀值
iptables -N ACK-limit # 限制ACK总触发阀值
# INPUT-chain
iptables -A INPUT -s 127.0.0.1 -j ACCEPT # 本机访问本机的所有数据包放行
iptables -A INPUT -j all-chain # 所有流量转到all-chain处理
iptables -A INPUT -j tcp-chain # tcp流量转到tcp-chain
iptables -A INPUT -p tcp --syn -j SYN-chain # 第一次发送的SYN包转到SYN-chain
iptables -A INPUT -p tcp --tcp-flags ALL ACK -j ACK-chain # 所有ACK包转到ACK-chain
# FORWARD-chain
iptables -A FORWARD -s 127.0.0.1 -j ACCEPT # 本机访问本机的所有数据包放行
iptables -A FORWARD -j all-chain # 所有流量转到all-chain处理
iptables -A FORWARD -j tcp-chain # tcp流量转到tcp-chain
iptables -A FORWARD -p tcp --syn -j SYN-chain # 第一次发送的SYN包转到SYN-chain
iptables -A FORWARD -p tcp --tcp-flags ALL ACK -j ACK-chain # 所有ACK包转到ACK-chain
# all-chain总流量限制
iptables -A all-chain -j all-limit
iptables -A all-chain -m hashlimit --hashlimit-name all-chain --hashlimit 300/sec --hashlimit-burst 300 --hashlimit-mode srcip -j RETURN
# 日志记录,限制每分钟最多记录三次,防止日志爆炸
iptables -A all-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:all-chain"
iptables -A all-chain -j DROP
# all-limit
iptables -A all-limit -m limit --limit 10000/sec --limit-burst 5000 -j RETURN
iptables -A all-limit -j DROP
# tcp-chain总流量限制
iptables -A tcp-chain -j tcp-limit
iptables -A tcp-chain -m hashlimit --hashlimit-name tcp-chain --hashlimit 80/sec --hashlimit-burst 80 --hashlimit-mode srcip -j RETURN
iptables -A tcp-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:tcp-chain"
iptables -A tcp-chain -j DROP
# tcp-limit
iptables -A tcp-limit -m limit --limit 100/sec --limit-burst 100 -j RETURN
iptables -A tcp-limit -j DROP
# SYN-chain总流量限制
iptables -A SYN-chain -j SYN-limit
iptables -A SYN-chain -m hashlimit --hashlimit-name SYN-chain --hashlimit 30/sec --hashlimit-burst 30 --hashlimit-mode srcip -j ACCEPT
iptables -A SYN-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:SYN-chain"
iptables -A SYN-chain -j DROP
# SYN-limit
iptables -A SYN-limit -m limit --limit 25/sec --limit-burst 25 -j RETURN
iptables -A SYN-limit -j DROP
# ACK-chain总流量限制
iptables -A ACK-chain -j ACK-limit
iptables -A ACK-chain -m hashlimit --hashlimit-name ACK-chain --hashlimit 30/sec --hashlimit-burst 30 --hashlimit-mode srcip -j ACCEPT
iptables -A ACK-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:ACK-chain"
iptables -A ACK-chain -j DROP
# ACK-limit
iptables -A ACK-limit -m limit --limit 25/sec --limit-burst 25 -j RETURN
iptables -A ACK-limit -j DROP
设计思路:
****如何永久保存iptables规则****
1.
systemctl stop firewalld
systemctl disable firewalld
2.
yum install iptables-services
3.
systemctl enable iptables
4.
systemctl restart iptables
5.
service iptables save
默认保存路径为 /etc/sysconfig/iptables
iptables实现目的IP转发,利用nat表output链修改数据包目的ip地址
iptables -t nat -A OUTPUT -d 192.168.2.9 -j DNAT --to-destination 192.168.2.10