最近正在学习iptables+tc做流量控制,根据流量控制原理,首先需要识别数据包并打上标签,tc根据标签才能进一步处理。

Mark values are stored in the skb (socket buffer) structure used by the Linux kernel to track packets; the mark value is not part of the packet itself and cannot be seen with tcpdump, ethereal or any other packet sniffing program. They can be seen in an iptables/ip6tables trace.
— shorewall
packet marking

由于标签仅存在于skb(socket buffer)中,数据包发送到本地程序或离开linux之后是不带任何标签的,因此通过tcpdump无法看到标签状态。

那如何查看每一个经过的数据包是否真的被iptables打好标签呢?那就需要查看dmesg,因为默认情况下,iptables将利用syslog,这就给系统管理员带来很大的困扰,因为iptables的log很快将吞噬dmesg信息,如果能有某种办法将iptables的数据包日志写到另一个单独的文件就好了,ulogd应运而生。

ulogd守护进程能够将流经netfilter的数据包原原本本地输出到一个单独的文本中,通过插件还可以输出到mysql和postgresql数据库中长期保存,为系统管理员进一步分析提供了便利。netfilter存在于内核中,而linux内核维护小组对内核的改动相当谨慎,因此一些新的功能和patch不能及时应用到netfilter中,于是诞生了patch-o-matic,后来衍生成xtables-addons。若要正常使用ulogd,除了安装ulogd软件包之后,还需要安装xtables-addons。目前ulogd有两个版本,一个是v1,一个是v2,其中v2将取代v1,debian squeeze官方源的ulogd是v1。

安装

xtables-addons在debian repo中是以源码的方式存在,所以还不能直接通过apt/aptitude直接安装,需要编译:

$ sudo aptitude install xtables-addons-common
$ sudo aptitude install module-assistant build-essential xtables-addons-source
$ sudo module-assistant auto-install xtables-addons-source
$ sudo aptitude install ulogd

配置

shorewall.conf
LOGFILE=/var/log/ulog/syslogemu.log (1)
1 syslogemu的意思是以syslogd的格式
rules
ACCEPT(SSH):$LOG
params
LOG=ULOG
account
account(net-loc,192.168.2.0/24) - eth0 eth1
account(net-loc,192.168.2.0/24) - eth1 eth0 (1)
1 account是单向的,因此需要写两条规则

这样,就可以通过以下两条命令看到每个IP的流量了:

$ iptaccount -l net-loc

或者

$ shorewall show ipa net-loc

接下来要做的就是配置tcrules,实现Per-IP的流量限速。

  • 打开iptables的trace功能

    $ sudo shorewall iptrace
  • 关闭iptables的trace功能

    $ sudo shorewall noiptrace

验证

  1. 首先开启ulog和iptables的iptrace功能

  2. 接着检查dmesg最后一个数据包的时间为:[1796969.936261]

  3. 过10秒后再检查,最后一个数据包的时间是:[1796969.936261]

说明iptables已经将数据包记录到ulog中了。