VPS提供商会在一个物理主机中提供多个VPS,该物理主机的资源将被这些VPS所分享,CPU、RAM、硬盘和带宽是四种最常见的资源。本文讨论的是如何为每台VPS划分一定的带宽;

每个VPS用户都希望能用尽他所能使用的带宽,这就导致带宽争抢的问题,经常有用户抱怨网速过慢,那如何保证每个VPS都能独占一定的带宽呢?首先,我们要能分拣出每个VPS的带宽利用率,然后利用iptables对VPS进行限速。本文解决的是第一个问题,使用netflow对每个VPS的流量进行监控。

netflow能提供比snmp更细粒度的流量统计数据,因此被广泛应用于网络管理。

一、安装

iptables中有一个ipt_NETFLOW的内核模块,它将统计每一条流经net_filter的flow,并将结果export到指定的collector中,在内核模块实现该功能的好处是性能和精确性。本站采用的就是这种实现方式。在CentOS中安装ipt_NETFLOW可以采用编译的方式,也可以安装CentALT这个源的二进制版本。

1.1 检查内核版本

$ sudo uname -r
2.6.18-238.el5xen

1.2 添加CentALT repo

官网的repo没有ipt_netflow二进制包,需要自行添加CentALT这个repo。

1.3 安装ipt_NETFLOW

$ sudo yum -y kmod-netflow-xen ipt_netflow
$ sudo rpm -ql kmod-netflow-xen
/lib/modules/2.6.18-164.2.1.1.el5xen
/lib/modules/2.6.18-164.2.1.1.el5xen/extra
/lib/modules/2.6.18-164.2.1.1.el5xen/extra/netflow
/lib/modules/2.6.18-164.2.1.1.el5xen/extra/netflow/ipt_NETFLOW.ko

$ sudo rpm -ql ipt_netflow
/lib64/iptables/libipt_NETFLOW.so

因为CentALT的rpm版本比xen hypervisor的内核版本低,因此需要将相应的文件手工拷贝到xen hypervisor的/lib/modules目录中

$ sudo mkdir -p /lib/modules/2.6.18-238.el5xen/extra/netflow
$ sudo cp /lib/modules/2.6.18-164.2.1.1.el5xen/extra/netflow/ipt_NETFLOW.ko /lib/modules/2.6.18-238.el5xen/extra/netflow/ipt_NETFLOW.ko

二、启动ipt_NETFLOW

2.1 手工启动

$ sudo depmod
$ sudo modprobe ipt_NETFLOW destination=127.0.0.1:2055

2.2 自启动

将ipt_NETFLOW添加到iptables_config中

$ sudo vim /etc/sysconfig/iptables-config
...
IPTABLES_MODULES="ipt_NETFLOW  ip_conntrack_netbios_ns .."

三、测试

以下是测试环境的网络拓扑:

  1. 客户机使用wget下载一个大文件,譬如一个操作系统的镜像文件;

  2. xen hypervisor启用ipt_NETFLOW,并将flow export到collector;

  3. 在collector中进行网络流量分析;

在本例中,客户机、netflow exportor、netflow collector使用同一台机器。

3.1 客户机

$ sudo wget --limit-rate=5k http://path/to/your/img.iso

3.2 xen hyperviso

  1. 启用ipt_NETFLOW,并将flow export到本机。此步骤见上文

  2. 配置ipt_netflow:

    $ sudo sysctl -a | grep netflow
    net.netflow.maxflows = 2000000
    net.netflow.aggregation = none
    net.netflow.destination = 192.168.33.68:2055
    net.netflow.sndbuf = 129024
    net.netflow.hashsize = 2080
    net.netflow.debug = 0
    net.netflow.inactive_timeout = 15
    net.netflow.active_timeout = 15

    net.netflow.active_timeout默认为1800s,需更改为15s,否则一条处于活动状态的flow需要等待30分钟才能输出统计结果

  3. 配置iptables规则:

    $ sudo iptables -A INPUT -j NETFLOW
    $ sudo iptables -A OUTPUT -j NETFLOW
    $ s+udo iptables -A FORWARD -j NETFLOW

    这几条语句应分别位于三条chain的最顶端。

  4. 启用iptables的bridge处理

    $ sudo sysctl net.bridge.bridge-nf-call-iptables=1

    默认配置为0,默认情况下,domU的流量不经过FORWARD,所以ipt_NETFLOW无法看到domU的流量。

    On XEN bridged domains, packets for the slave domains are being inspected at the "FORWARD" iptables chain, so this is what we have to play with.First step is to make sure that xen runs the packets for and from bridged domains through iptables. Make sure following sysctl mib has value "1" for ipv4:

    不过这个参数有安全性和性能上的问题,详见 https://bugzilla.redhat.com/show_bug.cgi?id=512206

3.3 netflow collector

等待10分钟之后,执行nfdump语句:

$ sudo nfdump -o "fmt:%ts %sap -> %dap %bps %byt %fl" -r ../29/nfcapd.201201290610 -a '(src ip 150.65.7.130 and port=80)'
Date flow start              Src IP Addr:Port          Dst IP Addr:Port       bps    Bytes Flows
2012-01-29 06:09:12.252     150.65.7.130:80    ->    192.168.33.68:43989    44705    1.6 M    18
Summary: total flows: 18, total bytes: 1.6 M, total packets: 1640, avg bps: 44705, avg pps: 5, avg bpp: 948
Time window: 2012-01-29 06:09:12 - 2012-01-29 06:13:50
Total flows processed: 240, Blocks skipped: 0, Bytes read: 12508
Sys: 0.000s flows/second: 0.0        Wall: 0.000s flows/second: 1935483.9

在5分钟的间隔中,总共下载了1.6MB,换算成速率就是:1.6MB X 1000/300 = 5.3KB/s,与wget的速率限制几乎吻合。

五、结论

通过上面的例子可以证明netflow能够很精确地监控到单IP(VPS)速率。