使用iptables监测端口流量

测试工作中需要在发布一定数据量后停止进程,在网上找到使用iptables实现类似功能的例子,修改如下。

#20200811

PORT=1000 #1000为检测的端口

#iptables -A:追加规则

iptables -A OUTPUT -p udp --sport $PORT #此处开始监测该端口输出的udp数据

pid=`ps -ef|grep "process 1" |grep -v grep |awk '{print $2}'` #process是使用该端口的进程

PID_FILE=./record_$PORT.pid #把进程号保存到文件

echo $pid > $PID_FILE

MAX=1000 #1000为指定的最大流量

SLEEP_TIME=0.1 #监测的时间间隔,这里需要观察一下实际流量情况,设置合理的间隔

while true

do

#iptables参数:

#-L:查看规则

#-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名

#-v:显示详细信息

#-t: 后面接table, 如filter或者nat,如果不写默认是filter

#filter: 预设规则表,拥有INPUT、FORWARD和OUTPUT三个规则链,用来进行封包过滤的动作

#命令的结果为该端口输出的流量

value_string=`iptables -n -v -L -t filter |grep -i "spt:$PORT" |awk -F' ' '{print $2}'`

echo $value_string |grep 'K'

if [ $? = 0 ]; then

value=`echo $value_string |tr -d 'K'`

#如果流量大于指定最大值,停止进程并删除iptables规则

if [ $value -gt $MAX ]; then

kill -9 `cat $PID_FILE`

rm $PID_FILE

iptables -D OUTPUT -p udp --sport $PORT

break

fi

fi

sleep $SLEEP_TIME

done

参考:

Centos6.5 iptables的Filter详解

https://blog.csdn.net/canot/article/details/51289176

iptables命令、规则、参数详解

https://www.cnblogs.com/zclzhao/p/5081590.html