日常在售的大口子 VPS 套餐很多都有流量限制,预付费的还好,流量用完之后就会有类似停机的保护策略,可后付费就有点危险了,以阿里云国际版新手套餐 2.0 为例,网友笑称当流量包用完之后可以一夜跑掉一套房。

所以我们使用 Linux 系统下的一大杀器 iptables 来限制我们的流量开销,当流量达到阈值时就不再相应请求,以此来避免一夜回到解放前的尴尬局面。

iptables 命令回顾

我们先来回顾一下 iptables 的基础知识

iptables 结构:

1
2
3
4
5
6
7
8
Table {
Chain {
Rule {
(match, match, ...)
target
}
}
}

iptables 规则语法:

1
2
3
$ iptables      <指定链和操作-chain>        <指定匹配规则-match>        <指定匹配后的操作-target>
// 示例:
$ iptables -A OUTPUT -m tcp -dport 80 -j ACCEPT

基础版

规则编写

根据 iptables 的使用方法,我们可以很轻易的写出一个限制流量的规则

1
2
$ iptables -A OUTPUT -p tcp -m quota --quota 1024000 -j ACCEPT
$ iptables -A OUTPUT -p tcp -j DROP

规则解释

  • -A OUTPUT 代表在 OUTPUT 链中添加一条规则,OUTPUT 是 iptables 规则中的一个链(Chain),代表流出的流量包,总共有三个(INPUT, FORWARD, OUTPUT),区分不同场景的规则;
  • -p tcp 是iptables的协议参数 --protocol,匹配规则的一部分;
  • -m quota --quota 1024000 是该条规则的另一匹配规则(match),匹配通过则执行后面指定的操作(target)。这里用 quota 做匹配,限制1M流量(1024000 Bytes);
  • -j ACCEPT 指定匹配成功后的执行操作,ACCEPT 代表接受,DROP 代表丢弃包;

这两条规则合起来:

第一条指定:对于流出的tcp协议包,如果流量没有超过限制,则允许通过。

当第一条规则匹配失败,即流量超过后,顺序第二条规则生效。第二条规则指定:拒绝所有的tcp协议流出包。

两者合起来,流量限制内通过,流量超出后拒绝,达到控制流量的目的。

另,针对tcp端口匹配有两种:–sport, –dport,其区别是包的连接两段的方向

  • --sport,source port,指定连接的来源段
  • --dport,destination port,指定链接的目的端

完整版

基础版中 iptables 规则限制了我们的流量为 1M,超出 1M 后我们的服务器就 GG 了,这显然不是我们想要的效果。

我们需要的是以月为单位进行流量控制,单月超标之后禁止流量流出,下月重新计算。

1
2
3
4
5
6
7
8
9
10
11
12
# 删除链:throttle1t
iptables -F throttle1t
iptables -F OUTPUT
iptables -P OUTPUT ACCEPT

# 创建链:throttle1t
iptables -N throttle1t
# 1020054732800 = 1024 * 1024 * 1024 * 950 = 950GB
iptables -A throttle1t -m quota --quota 1020054732800 -j RETURN
iptables -A throttle1t -j DROP

iptables -A OUTPUT -o eth0+ -j throttle1t

在配合 crontab 每月 1 号 0 点 0 分定时重置计数器即可

1
0 0 1 * * /sbin/iptables -Z throttle1t

这样我们就可安心的使用流量了~

评论

富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善