日常在售的大口子 VPS 套餐很多都有流量限制,预付费的还好,流量用完之后就会有类似停机的保护策略,可后付费就有点危险了,以阿里云国际版新手套餐 2.0 为例,网友笑称当流量包用完之后可以一夜跑掉一套房。
所以我们使用 Linux 系统下的一大杀器 iptables 来限制我们的流量开销,当流量达到阈值时就不再相应请求,以此来避免一夜回到解放前的尴尬局面。
iptables 命令回顾
我们先来回顾一下 iptables 的基础知识
iptables 结构:
1 | Table { |
iptables 规则语法:
1 | $ iptables <指定链和操作-chain> <指定匹配规则-match> <指定匹配后的操作-target> |
基础版
规则编写
根据 iptables 的使用方法,我们可以很轻易的写出一个限制流量的规则
1 | $ iptables -A OUTPUT -p tcp -m quota --quota 1024000 -j ACCEPT |
规则解释
-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 | # 删除链:throttle1t |
在配合 crontab 每月 1 号 0 点 0 分定时重置计数器即可
1 | 0 0 1 * * /sbin/iptables -Z throttle1t |
这样我们就可安心的使用流量了~