在Python中用socket捕获指定网卡的流量


搜索(Python socket bind interface):http://search.aol.com/aol/search?q=python+socket+bind+interface

指定连接到Internet的网卡:

http://www.quora.com/Which-Python-library-allows-us-to-specify-network-interface-to-connect-to-the-Internet

  1. Get the IP address for the interface that you want.
import socket
import fcntl
import struct
def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,
        struct.pack('256s', ifname[:15])
    )[20:24])

You can use it like this:
>>> get_ip_address('lo')
'127.0.0.1'
>>> get_ip_address('eth0')
'38.113.228.130'

Source: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

  1. Create a new socket bind it to your interface.
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))
  1. And then:
s.connect(('http://www.google.com/', 80))

比较好的参考链接:

 

在Windows和Linux系统上面socket模块里面有的内容有一些都不一样o(╯□╰)o,在Windows上OK:

s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)# Enable promiscuous mode
In [3]: socket.SIO_RCVALL
Out[3]: 2550136833L

In [4]: socket.RCVALL_ON
Out[4]: 1

在Linux上会出现错误:

In [47]: socket.RCVALL_ON
...
AttributeError: 'module' object has no attribute 'RCVALL_ON'
...
AttributeError: 'module' object has no attribute 'SIO_RCVALL'

所以文章:http://www.pythonforpentesting.com/2014/03/python-raw-sockets.html 中介绍的无法用于Linux系统上。

不过在文章:

http://www.pythonforpentesting.com/2014/09/packet-injection-capturing-response.html,中提到的绑定指定网卡,可以有:

socket_bind

socket_bind2

 

, ,

《“在Python中用socket捕获指定网卡的流量”》 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注