上次想使用 iptables 转发80 端口,试了一段时间,没有成功。哪位知道是什么原因,还麻烦告诉我。

这次使用 iptables 禁用 80 443 出站,经过试验可以成功。

通过 iptables -A OUTPUT -p tcp --dport 80  -j REJECT 和 iptables -A OUTPUT -p tcp --dport 443  -j REJECT 来禁止出站

通过 iptables -F 来恢复

bash shell 不太熟悉,使用 python 2.7 来实现 (python3 未测试也许可以)

通过 os.system("iptables -A OUTPUT -p tcp --dport 80  -j REJECT") 来添加 iptables rule

读取 vnstat 的显示结果通过 commands.getstatusoutput("vnstat -i eth0 -d")  或 subprocess.check_output(["vnstat", "-i", "eth0", "-d"])

但经过测试发现 commands.getstatusoutput("vnstat -i eth0 -d") 结果,只可以 print 输入,不可以在使用 正则 来拆分出想要的结果。

所以本文使用 subprocess.check_output(["vnstat", "-i", "eth0", "-d"])

vnstat -i eth0 -d 结果执行如下

eth0  /  daily

             day         rx      |     tx      |    total    |   avg. rate
------------------------+-------------+-------------+---------------
// 10.00 MiB | 10.00 MiB | 20.00 MiB | 6.58 kbit/s
// 10.00 MiB | 20.00 MiB | 30.00 MiB | 10.36 kbit/s
------------------------+-------------+-------------+---------------
estimated -- | -- | -- |

正则是 [\d|/]{10})\s+([\w\.\s]+)[^\d]+([\w\.\s]+)[^\d]+([\w\.\s]+)

匹配出 结果[('01/01/2018', '10.00 MiB ', '10.00 MiB ', '20.00 MiB '), ('01/02/2018', '10.00 MiB ', '20.00 MiB ', '30.00 MiB ')]

本文使用 python 实现,不使用 crontab ,使用简单 通过,在 python 中一个 while 来定时读取 vnstat 的结果,当流量超出后,能调整 定时sleep 时间,以节省cpu 。

 #!/usr/bin/python
#coding:utf-8
'''
author:ningci dev
date:2017-04-30 05:54
此python 脚本检测网卡流量使用情况,当达到设定值时,就会使用 iptables 关闭 80 443
'''
import time
import os
import re
import string
import subprocess #每天限制流量使用450M
DAY_LIMIT_OF_MB = 450
#流量未超时每5分钟检查一次
INTVAL_NORMAL = 300
#流量超出后每1小时检查一次
INTVAL_SLEEP = 3600 class NetLimit: def __net_up(self):
os.system("iptables -F")
self.inteval = INTVAL_NORMAL def __net_down(self):
os.system("iptables -A OUTPUT -p tcp --dport 80 -j REJECT")
os.system("iptables -A OUTPUT -p tcp --dport 443 -j REJECT")
self.inteval = INTVAL_SLEEP def __check_flow(self):
vnstat_days = subprocess.check_output(["vnstat", "-i", "eth0", "-d"])
#使用正则匹配每行匹配当前日期
vnstat_rows = re.findall(r"([\d|/]{10})\s+([\w\.\s]+)[^\d]+([\w\.\s]+)[^\d]+([\w\.\s]+)", vnstat_days)
#输出格式 [('01/01/2018', '10.00 MiB ', '10.00 MiB ', '20.00 MiB '), ('01/02/2018', '10.00 MiB ', '20.00 MiB ', '30.00 MiB ')]
for vnstat_row in vnstat_rows:
#比较当前日期
if time.strftime("%m/%d/%Y", time.localtime(time.time())) == vnstat_row[0]:
total_day = vnstat_row[3]
#查询 流量单位 MiB , KiB 忽略不计
if 0 < total_day.find("MiB"):
#果然是不如 PHP 方便,PHP 可以直接转为 int
#使用 空格拆分取数字
total_day = string.atof(total_day.split(" ")[0])
if total_day > DAY_LIMIT_OF_MB:
return True
return False def __init__(self):
self.__net_up()
#设定每5分钟执行一次
self.inteval = INTVAL_NORMAL def run(self):
while True:
self.__net_down() if self.__check_flow() else self.__net_up()
print("run ..")
time.sleep(self.intval) NetLimit().run()

使用方法,sudo python2.7 NetLimit.py &

ubunto python + vnstat 限制每天流量使用 使用iptables的更多相关文章

  1. ubuntu下vnstat监控网卡流量

    vnstat使用 vnstat 是另一个可以用来监视带宽使用量的程序.它比ipac-ng更简单易用. vnstat的一个优点是它不是一个运行的守护程序,所以它几乎不占用内存.它由 cron 任务创建, ...

  2. Debian 9.x "stretch" 安装 vnStat 统计服务器流量

    vnStat 是一款开源的 Linux 下统计网卡流量的软件,可以很方便地查看当前.当天.当月的流量统计报告,下面我们介绍下在 Debian 9.x 下安装 vnstat 的简单方法 首先,使用 ip ...

  3. python检测当前网卡流量信息,用于查看实时网速

    可以用来检测是否有挖矿程序在运行的一个子条件 # coding:utf-8 __author__ = 'chenhuachao' import wmi import time import platf ...

  4. python利用scapy嗅探流量

    能实时监测流量, 只显示有问题的流量, 可疑流量要显示出在那个数据包里 所有流量都保存到为pcap 每5000个包保存一个 第3个自动下载到本地       def sniff(count=0, st ...

  5. 监控linux流量python版

    python版监控linux流量 直接上代码,使用OptionParser来传入参数 #coding:utf-8 #------------- #Author:Hu #Data:20150520 #- ...

  6. python 第三方模块 转 https://github.com/masterpy/zwpy_lst

    Chardet,字符编码探测器,可以自动检测文本.网页.xml的编码. colorama,主要用来给文本添加各种颜色,并且非常简单易用. Prettytable,主要用于在终端或浏览器端构建格式化的输 ...

  7. python第三方库,你要的这里都有

    Python的第三方库多的超出我的想象. python 第三方模块 转 https://github.com/masterpy/zwpy_lst   Chardet,字符编码探测器,可以自动检测文本. ...

  8. 【转帖】Python 重复造轮子/造轮子找模子,你都应该熟读该文

    Chardet,字符编码探测器,可以自动检测文本.网页.xml的编码. colorama,主要用来给文本添加各种颜色,并且非常简单易用. Prettytable,主要用于在终端或浏览器端构建格式化的输 ...

  9. linux下使用iptables统计ip/端口流量

    1.添加ip/端口的流量统计 入网流量: iptables -A INPUT -d 出网流量: iptables -A OUTPUT -s 2.查看流量统计信息 iptables -L -v -n - ...

随机推荐

  1. FastDFS安装部署

    博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 服务器信息: Storage:192.168.247.20 Traker:192.168.247.21 一.搭建环境准备 ...

  2. 2015-09-15-git配置

    https://help.github.com/articles/set-up-git/ git上传是忽略一些文件 在每个git的项目中有一个.gitignore文件,将忽略的文件或文件夹输入即可. ...

  3. [LC] 238. Product of Array Except Self

    Given an array nums of n integers where n > 1,  return an array output such that output[i] is equ ...

  4. spring mvc +@Valid +@RequestBody 来做参数校验返回400,并且不显示具体message 如何解决

    参考文档: https://www.oschina.net/question/115867_2282711   谢谢原作者

  5. css3 transform 变形属性详解

    本文主要介绍了css3 属性transform的相关内容,针对CSS3变形.CSS3转换.CSS3旋转.CSS3缩放.扭曲和矩阵做了详细的讲解.希望对你有所帮助. 这个很简单,就跟border-rad ...

  6. 洛谷-P3809-后缀排序(后缀数组)

    看了求后缀数组的倍增法之后很快就理解了,但是自己写的倍增法用map排序还是超时了.然后看了两天别人写的模板,题目是通过了,但感觉代码还是半懂半背的.以后多熟悉熟悉吧: 后缀数组 #include &q ...

  7. 吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法(续一)

    #-----------------------------------# # R in Action (2nd ed): Chapter 18 # # Advanced methods for mi ...

  8. js 实现数据结构 -- 散列(HashTable)

    原文: 在Javascript 中学习数据结构与算法. 概念: HashTable 类, 也叫 HashMap 类,是 Dictionary 类的一种散列表实现方式. 散列算法的作用是尽可能快地在数据 ...

  9. python 有关堡垒机的那些事

    堡垒机为了保证系统或服务器的安全性,防止运维和开发人员胡乱操作服务器,导致不必要的损失,使用堡垒机来完成对运维和开发人员的授权.用户统一登录堡垒机账号来操作系统或服务器.堡垒机等于成了生产系统的SSO ...

  10. MySQL5.7报错[ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock的解决方法

    发现MySQL服务器因系统磁盘写满导致服务停了,清理磁盘后启动服务时无法正常启动,查看localhost.err日志发现如下报错: [ERROR] Unix socket lock file is e ...