首页 » Linux » 使用iptables进行端口流量统计

使用iptables进行端口流量统计

本文介绍使用iptables进行端口流量统计。首先在iptables中增加规则,使其监控所选的端口的tcp和udp的输入输出。iptables不会自动保存规则,需要使用iptable-save保存配置。然后集成脚本文件设定好时间执行,实现统计一段时间内流量的效果。

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

编写脚本

为了后面实现定时运行,所以把上节中内容总结成脚本。将下面代码保存到/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

定时运行

使用Linux系统执行定时任务中介绍的方法定时执行上节编写的脚本。运行crontab -e编辑定时计划,添加如下行。在每月1号4点59记录统计数据,然后在5点清零。

59 4 1 * * port_monitor write
0 5 1 * * port_monitor zero

参考

发表评论

电子邮件地址不会被公开。 必填项已用*标注