使用iptables进行流量控制

前言: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

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值