本文介绍使用iptables进行 端口流量统计 。首先在iptables中增加规则,使其监控所选的端口的tcp和udp的输入输出。iptables不会自动保存规则,需要使用iptable-save保存配置。然后集成脚本文件设定好时间执行,实现统计一段时间内流量的效果。
1 iptables
使用以下命令使iptable统计$port端口的流量数据。将其中的$port替换为端口数字。
iptables -I INPUT -p tcp --dport $port
iptables -I INPUT -p udp --dport $port
iptables -I OUTPUT -p tcp --sport $port
iptables -I OUTPUT -p udp --sport $port
将规则保存到文件。/etc/iptables/iptables.rules是archlinux中iptables的默认配置文件位置,其他发行版版本配置文件位置可能会有所不同。保存后仍不会自动加载,需要将iptables服务启动并设置为自启动
iptables-save >> /etc/iptables/iptables.rules
systemctl enable iptables
systemctl start iptables
使用以下命令查看端口流量的统计结果。
iptables -n -v -t filter -L INPUT
iptables -n -v -t filter -L OUTPUT
使用下面命令清零统计数据。定时执行可实现统计一个时间段的。
iptables -Z
2 编写脚本
为了后面实现定时运行,所以把上节中内容总结成脚本。将下面代码保存到/etc/port_monitor/port_monitor。然后使用chmod +x /etc/port_monitor/port_monitor,赋予可执行权限。脚本有add、save、check、write、zero几个参数。在没有输入参数时显示帮助信息。
#!/bin/bash
if [ "$1" == "add" ]; then
let "while_flag=1"
echo "enter a number for a port or others for exit"
while((while_flag))
do
echo -n "->"
read port
if [[ $port =~ ^-?[0-9]+$ ]]; then
iptables -I INPUT -p tcp --dport $port
iptables -I INPUT -p udp --dport $port
iptables -I OUTPUT -p tcp --sport $port
iptables -I OUTPUT -p udp --sport $port
else
let "while_flag=0"
fi
done
exit 0
fi
if [ "$1" == "save" ]; then
iptables-save >> /etc/iptables/iptables.rules
exit 0
fi
if [ "$1" == "check" ]; then
iptables -n -v -t filter -L INPUT
iptables -n -v -t filter -L OUTPUT
exit 0
fi
if [ "$1" == "write" ]; then
echo "*******************************************************************" >> record.dat
date >> record.dat
iptables -n -v -t filter -L INPUT >> record.dat
iptables -n -v -t filter -L OUTPUT >> record.dat
exit
fi
if [ "$1" == "zero" ]; then
iptables -Z
var=`date "+%Y-%m-%d %H:%M:%S"`
echo "Flow set to zero at ${var}." > record.dat
exit 0
fi
echo "./prot_monitor.sh [COMMAND]"
echo " [COMMAND] Describe"
echo " add add new port need to be monitored"
echo " save save rules are using"
echo " check print record for now"
echo " write write record into file"
echo " zero reset record data"
exit 0
其中第一行虽然为注释格式,但是不可删除。他将帮助系统识别该文件为shell脚本文件。
最后修改环境变量,使得我们可以像运行其他程序一样仅在命令行中输入一个词就运行程序。archlinux中环境变量配置文件在/etc/bash.bashrc中。在该文件尾,添加如下行
export PATH=$PATH:/etc/port_monitor
3 定时运行
使用Linux系统执行定时任务中介绍的方法定时执行上节编写的脚本。运行crontab -e编辑定时计划,添加如下行。在每月1号4点59记录统计数据,然后在5点清零。
59 4 1 * * port_monitor write
0 5 1 * * port_monitor zero