Linux 端口限流(tc + iptables)

一、相关概念

报文分组从输入网卡(入口)接收进来,经过路由的查找, 以确定是发给本机的,还是需要转发的。如果是发给本机的,就直接向上递交给上层的协议,比如TCP,如果是转发的, 则会从输出网卡(出口)发出。网络流量的控制通常发生在输出网卡处。虽然在路由器的入口处也可以进行流量控制,Linux也具有相关的功能, 但一般说来, 由于我们无法控制自己网络之外的设备, 入口处的流量控制相对较难。本文将集中介绍出口处的流量控制。流量控制的一个基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系, 每当内核需要将报文分组从网卡发送出去, 都会首先将该报文分组添加到该网卡所配置的队列中, 由该队列决定报文分组的发送顺序。
因此可以说,所有的流量控制都发生在队列中,详细流程图见下图。
Linux 端口限流(tc + iptables)_第1张图片
有些队列的功能是非常简单的, 它们对报文分组实行先来先走的策略。有些队列则功能复杂,会将不同的报文分组进行排队、分类,并根据不同的原则, 以不同的顺序发送队列中的报文分组。为实现这样的功能,这些复杂的队列需要使用不同的过滤器(Filter)来把报文分组分成不同的类别(Class)。这里把这些复杂的队列称为可分类(ClassfuI)的队列。通常, 要实现功能强大的流量控制, 可分类的队列是必不可少的。因此,类别(class)和过滤器(Filter)也是流量控制的另外两个重要的基本概念。图2所示的是一个可分类队列的例子。
Linux 端口限流(tc + iptables)_第2张图片

二、端口限流(TC和IPTABLES)

在Linux中,流量控制都是通过TC这个工具来完成的,但是如果对端口限流需要使用IPTABLES对端口绑定TC队列。通常, 要对网卡端口进行流量控制的配置,需要进行如下的步骤:

  • 为网卡配置一个队列;
  • 在该队列上建立分类;
  • 根据需要建立子队列和子分类;
  • 为每个分类建立过滤器;
  • 使用iptables对端口绑定tc队列。

接下来具体为80,22端口设置限流:

1.使用命令ifconfig查看服务器上的网卡信息,比如网卡eth0是用来对外的网络,也就是用户通过该网卡连接到系统,那么我们就对这个网卡进行带宽限制。

ifconfig

2.建立eth0队列

tc qdisc add dev eth0 root handle 1: htb default 20
命令解释:
add :表示要添加,
dev eth0 :表示要操作的网卡为eth0,
root :表示为网卡eth0添加的是一个根队列,
handle 1: 表示队列的句柄为1:,
htb :表示要添加的队列为HTB队列。
default 20: 是htb特有的队列参数,意思是所有未分类的流量都将分配给类别1:20。

3.建立根分类

tc class add dev eth0 parent 1:0 classid 1:1 htb rate 3Mbit
命令解释:
在队列1:0上创建根分类1:1 限速,类别htb,限速3Mbit。
rate 3Mbit:表示系统将为该类别确保3Mbit的带宽。

4.创建分类

tc class add dev eth0 parent 1:1 classid 1:11 htb rate 2Mbit ceil 3Mbit
命令解释:
以根分类1:1为父类创建分类1:11 ,限速 2Mbit ~3Mbit(htb可借用其它类带宽)。
ceil 3Mbit:表示该类别的最高可占用带宽为3mbit。

5.创建过滤器并制定handle

tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 11 fw flowid 1:11
prio 1:您可以设置额外的带宽优先级,prio数值越低优先级越高。
protocol ip:表示该过滤器应该检查报文分组的协议字段。
flowid 1:11: 表示将把该数据流分配给类别1:11。

6.使用iptable对端口绑定tc队列

iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 11
iptables -A OUTPUT -t mangle -p tcp --sport 22 -j MARK --set-mark 11

三、查看和删除规则

1.列出TC队列

tc -s qdisc ls dev eth0

2.删除TC队列

tc qdisc del dev eth0 root

3.删除iptables的mangle表

单纯的删除TC队列,在下次再次设置的时候,原有的mangle表规则仍会生效,所以如果想重新设置整个限流规则应该同时删除TC队列和mangle表。

列出mangle规则并分配编号:
iptables -L -t mangle --line-numbers
根据编号删除规则(x为规则编号):
iptables -t mangle -D POSTROUTING x

参考文章:

Linux tc QOS 详解
Linux上的TC流量控制几个例子(80端口流量限制)
LINUX中IPTABLES和TC对端口的带宽限制 端口限速

你可能感兴趣的:(Linux)