python抓包截取http记录日志

武星有个需求,需要记录所有内部上网访问网页的记录,原本他让青青在网关上安装Squid,因为代理的局限性,存在问题,我觉得可以使用抓包解决,就说让我来做吧,最终实现需求,代码如下:

 

 

 
#!/usr/bin/python
 
import pcap
import dpkt
import re

 
 
 
def main():
        pc=pcap.pcap(name="eth1")                                             # 抓取 eth1
        pc.setfilter('tcp port 80')                                                       # 过滤表达式 tcp port 80
 
        for p_time, p_data in pc:                                                      # 
                  ret = main_pcap(p_time, p_data)
                        if ret:
                                print ret 
               
def main_pcap(p_time, p_data):                                                 # 解码
        out_format = "%s\t%s\t%s\t%s\t%s\tHTTP/%s"
        p = dpkt.ethernet.Ethernet(p_data)                                     # 
        ret = None
        if p.data.__class__.__name__ == 'IP':
                ip_data = p.data
                src_ip = '%d.%d.%d.%d' % tuple(map(ord,list(ip_data.src)))
                dst_ip = '%d.%d.%d.%d' % tuple(map(ord,list(ip_data.dst)))
                if p.data.data.__class__.__name__=='TCP':
                        tcp_data = p.data.data
                        if tcp_data.dport==80:
                                if tcp_data.data:
                                        h = dpkt.http.Request(tcp_data.data)                                            # http解码
                                        pre = "^/.*$"
                                        if match(pre, h.uri):                                                                           # url 重写
                                                http_headers = h.headers
                                                host = h.headers['host']
                                                url = "http://" + host + h.uri
                                        else:
                                                url = h.uri
 
                                        # datetime srcip dstip GET /index.htm HTTP/1.1                       # 输出日志格式
                                        ret = out_format % (p_time, src_ip, dst_ip, h.method, url, h.version)
 
        
        return ret
 
def match(pre, line):
        p = re.compile(pre)
        m = p.match(line)
        return m


# 脚本运行也达到了武星预期的要求,OK。

# 后续记录下referer 还是很有必要的。

======================================================================================

安装

1. python 2.5

2. pypcap               python的抓包函数库

http://code.google.com/p/pypcap/downloads/list

3. dpkt                     python的解包函数库

http://code.google.com/p/dpkt/downloads/list

4. winpcap             python支持pacp的驱动

如果有wireshark的话,就直接安装wireshark吧,里面带着winpcap

 

在Linux中有个库叫做libpcap可以胜任。libpcap是一个简单而又强大的数据包捕获函数库,可以在多种操作系统上运行。

关于libpcap有几个很好的教程:

http://www.tcpdump.org/pcap.htm (官方向导,英文,写得很适合新手)

http://blog.csdn.net/bat603/archive/2006/09/04/1175729.aspx (主要函数中文说明)

http://blog.csdn.net/bat603/archive/2006/09/04/1176251.aspx (入门源码)


转自:http://blog.sina.com.cn/s/blog_62f28d560100yh3n.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值