使用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

原文地址:https://www.cnblogs.com/workingdiary/p/13571476.html