使用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 destination0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x3F/0x02 reject-with icmp-port-unreachable0 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包流量/IPiptables -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-chainiptables -A INPUT -p tcp --syn -j SYN-chain # 第一次发送的SYN包转到SYN-chainiptables -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-chainiptables -A FORWARD -p tcp --syn -j SYN-chain # 第一次发送的SYN包转到SYN-chainiptables -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 firewalldsystemctl disable firewalld2.
yum install iptables-services3.
systemctl enable iptables4.
systemctl restart iptables5.
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
使用iptables进行流量控制相关推荐
- iptables+tc流量统计
TC(HTB)+iptables作流量控制 一.环境和要求: 线路:ADSL:2M/512K eth0:10.0.0.136,外网口 eth1:192.168.1.1,内网口 业务需求:保证正常的网页 ...
- iptables基于域名的本机流量控制
iptables+ipset根据域名配置流量控制 背景 解决流程 一.iptables配置 二.ipset命令 三.nslookup 四.iptables配置ipset 定时任务配置 总结 背景 公司 ...
- Linux网管流量控制(iptables QOS)
linux网关之流量控制(iptables Qos) 来源: ChinaUnix博客 日期: 2006.07.27 13:22 (共有条评论) 我要评论 linux网关之流量控制(Qos) ...
- linux 限制单个ip流量,centos 的單ip流量控制-CentOS下利用iptables限速及限制每IP連接數...
第一步:建立adsl連接,在系統設置--網絡設置處有.在圖形界面下很容易搞定. 第二步:打開IP轉發和偽裝(也就是路由與NAT) 1.作為根用戶打開/etc/sysconfig/network文件,在 ...
- Linux系统中的防火墙的实现:iptables/netfilter
防火墙:包括软件防火墙(基于iptables/netfilter的包过滤防火墙)和硬件防火墙,在主机或网络边缘对经由防火墙的报文以一定条件进行检测过滤的一系列组件. Linux系统中的防火墙的实现: ...
- 服务器安全之iptables iptables
服务器安全之iptables 感谢老男孩老师为我们讲解iptables 优化之路 iptables防火墙简介 Netfilter/Iptables(以下简称Iptables)是unix/linux自 ...
- Linux 高级流量控制
原文链接:https://www.ibm.com/developerworks/cn/linux/1412_xiehy_tc/index.html Linux 高级流量控制 本篇主要讲用 TC 对 L ...
- iptables常用配置规则
防洪水***: iptables -t nat -F Flood iptables -t nat -I Flood -j DROP iptables -t nat -I Flood -m limit ...
- 基于系统的流量控制(Qos)
一. Linux 系统 1. 限制流出速度 限制流出速度,主要通过tc这个工具,常用的有三个队列: tbf队列,令牌桶队列,适用于流量×××: cbq队列,分类的队列,用于实现精细的qos控制,配置复 ...
- 动态iptables 防火墙
文档选项 打印本页 将此页作为电子邮件发送 级别: 初级 Daniel Robbins (drobbins@gentoo.org), 总裁兼 CEO, Gentoo Technologies, Inc ...
最新文章
- 自学python清单-python学习清单
- PostgreSQL 恢复大法 - 恢复部分数据库、跳过坏块、修复无法启动的数据库
- AttachThreadInput
- 第30讲:如何爬app的数据
- 使用SAP云平台portal服务将SAP UI5应用部署到portal上
- 【Java 网络编程】网络通信原理、TCP、UDP 回显服务
- matlab如何求解定积分,matlab如何求解定积分
- qemu中vCPU对应的线程
- git-在现有代码基础上获取远程最新代码
- 数据中台与业务中台是什么关系?_光点科技
- Functional JavaScript: 使用 Transducer 提升函数式性能
- ABC182 E - Akari(扫描)
- android技术帖,android好帖子
- bttray.exe
- vulnhub Photographer: 1
- 设置计算机网络密码怎么设置路由器,192.168.1.1
- 【医学图像分割】CT医学图像的预处理(重采样)
- 第一周:数据的描述性统计
- 英语-新视野大学英语四课后翻译(全)
- HTML 粗体与斜体