流量统计 iptables

  • 部分转载自:使用IPTABLES实现对特定IP,端口流量的精确统计

对特定IP进行流量统计

  • 例如我要统计服务器上的IP:192.168.0.10的入网流量:
  • iptables -I INPUT -d 192.168.0.10
  • 统计该IP的出网流量:
  • iptables -I OUTPUT -s 192.168.0.10

统计特定端口的流量

  • 方法和统计IP的流量差不多,使用-p指定端口类型,–dport指定端口号。 例如我要统计服务器上的IP:127.0.0.1,1080端口的入网流量:
  • sudo iptables -I INPUT -d 127.0.0.1 -p tcp –dport 1080
  • 统计该IP 80端口的出网流量:
  • sudo iptables -I OUTPUT -s 127.0.0.1 -p tcp –sport 1080 出口流量统计命令
  • 上面的命令中,参数-d是目标IP,-s是源IP。因为入网的流量发送至127.0.0.1 这个IP,因此把127.0.0.1 作为目标IP可以统计入网的流量。出网时,127.0.0.1 发出的流量,因此把127.0.0.1 作为OUTPUT的源IP可以统计流量。 不仅如此,还可以对特定来源IP,来源端口,出网的目的IP,出网的目的端口进行统计,根据需要使用-s,–sport,-d,–dport几个参数即可。

查看流量

  • iptables -n -v -L -t filter 默认是使用易读的单位,也就是自动转化成M,G。如过需要Bytes做单位,则增加一个-x参数
  • iptables -n -v -L -t filter -x

作为路由时的流量统计

  • 如果服务器是做路由的,那么使用上面的命令把规则插入至INPUT/OUTPUT链中就无效了,因为那些IP根本不是在你的服务器上。但是那些IP的流量,都需要经过你的服务器的转发,因此把对于的规则插入至FORWARD表即可。、 例如我要统计IP为192.168.0.10的服务器入网流量:
  • iptables -I FORWARD -d 192.168.0.10
  • 统计该IP的出网流量:
  • iptables -I FORWARD -s 192.168.0.10
  • 需要注意的是,此时添加统计出网和入网流量的规则,不再需要分INPUT链和OUTPUT链,因为你服务器只负责根据目标IP,进行转发。

iptables规则的保存

  • 一般重启后iptables规则会丢失,因此需要进行保存操作。
  • 基于Red Hat:
  • service iptables save
  • 基于Debian:
  • 先保存:
  • iptables-save > /etc/iptables.rules
  • 恢复:
  • iptables-restore < /etc/iptables.rules

s流量检测控制方法

  • 端口的出口流量统计命令
  • sudo iptables -I OUTPUT -s 127.0.0.1 -p tcp –sport 1080
  • 然后去定时检测统计流量,查看统计流量信息:
  • sudo iptables -n -v -L -t filter
  • sudo iptables -n -v -L -t filter |grep -i –color -B 3 spt:1080 定期检测命令,流量带颜色
  • sudo iptables -n -v -L -t filter |grep -i ‘spt:1080’ |awk -F’ ’ ‘{print $2}’ 只输出具体流量值
  • 然后自己写个crontab脚本,每分钟去读取流量统计出来的流量值,判断下,超过预设流量即停止s服务
  • 当然你可能开启多个s服务,需要保存他们的进程id,超出流量的就kill 这个id
    #启动服务并记录进程id到文件
    PORT=1080
    PID_FILE=~/shadow_$PORT.pid
    #开启对应端口流量统计
    sudo iptables -I OUTPUT -s 127.0.0.1 -p tcp --sport $PORT
    s -c s.json -p $PORT > logshadow.log 2>&1 &
    echo "$!" > $PID_FILE
    #定时检测 流量超出则停止服务,比如限制每天流量100M
    PORT=1080
    PID_FILE=~/shadow_$PORT.pid
    MAX=100
    SLEEP_TIME=20 #每20秒检测流量一次
    while true
    do
      value_string=`sudo iptables -n -v -L -t filter |grep -i "spt:$PORT"|awk -F' ' '{print $2}'`
      grep 'M' $value_string
      if [ $? = 0 ] ;then
       value=`echo $value_string |tr -d 'M'`
       if [ $value -gt $MAX ]; then
          kill -9 `cat $PID_FILE`
          rm $PID_FILE
          #关闭流量统计
          sudo iptables -D OUTPUT -s 127.0.0.1 -p tcp --sport $PORT
          break
        fi
      fi
      sleep $SLEEP_TIME
    done

你可能感兴趣的:(Linux)