由于最近给google cloud上的一台ss服务新增了一个端口用户,所以想试试如何统计每个ss端口的流量。查了下,发现大部分都是用系统自带的iptables来实现。
1. 使用iptables监控端口流量
1、在iptables的INPUT链插入两条规则:监控8379,8380端口的tcp输入流量 注意 -I 与 -A 的区别,-I表示在规则链首部插入规则,-A表示在规则链尾部追加规则 由于这两条规则没有-j参数,即对匹配到的流量不执行任何目标动作(ACCEPT/DROP/REJECT),只做记录。所以不会影响原有规则 iptables -I INPUT -p tcp --dport 8379 iptables -I INPUT -p tcp --dport 8380 2、在iptables的OUTPUT链插入两条规则:监控8379,8380端口的tcp输出流量 iptables -I OUTPUT -p tcp --sport 8379 iptables -I OUTPUT -p tcp --sport 8380 3、检查新增的规则(-n参数表示以数值方式显示地址与端口, -v表示显示包括流量在内的详细信息) iptables -n -v -L 4、保存iptables,否则重启就没了 service iptables save 5、统计端口流量 iptables -nv -L INPUT | grep 8379 iptables -nv -L INPUT | grep 8380 iptables -nv -L OUTPUT | grep 8379 iptables -nv -L OUTPUT | grep 8380
关于iptables的基础操作,可以参考之前的文章《iptables基本用法》
1.1 iptables删除规则
1、先列出规则号 iptables -nvL INPUT --line-numbers iptables -nvL OUTPUT --line-numbers 2、删除第n号规则 iptables -D INPUT 1 iptables -D OUTPUT 3
2. 使用shell脚本输出iptables统计信息
为了方便查看流量统计,写了一个shell脚本,并添加到crontab中每月自动运行
#!/bin/bash # 这是一个利用iptables进行端口流量统计的脚本 # 首先请保证已经在iptables规则中加入了要监控的端口 # 需要统计的端口 PORTS=(8379 8380) # 打印分割线 echo "**************************************************" # 打印日期 date # 统计iptables的INPUT链 echo "------------------------------" echo "INPUT chain:" for PORT in ${PORTS[@]}; do iptables -nv -L INPUT | grep $PORT done # 统计iptables的OUTPUT链 echo "------------------------------" echo "OUTPUT chain:" for PORT in ${PORTS[@]}; do iptables -nv -L OUTPUT | grep $PORT done # 输出换行 echo -e "\n"
3. crontab作业
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 每月1号02:00统计ss端口流量 0 2 1 * * /root/ss_statistics.sh >> /root/ss_traffic.txt