OSX 连接共享与 Scapy
我正在使用Scapy这个工具来监听网络流量,代码如下:
from scapy.all import *
import sys
filter = sys.argv[1]
def Responder():
def getPacket(pkt):
if Raw in pkt: print pkt[Raw]
return getPacket
sniff(filter=filter, prn=Responder())
这段代码在我浏览网页的时候运行得很好。
但是,当我开启连接共享后,运行这个脚本时就出现了以下错误:
bash-3.2# sudo python sniffy.py "tcp port 80"
Traceback (most recent call last):
File "sniffy.py", line 1, in <module>
from scapy.all import *
File "/Library/Python/2.7/site-packages/scapy/all.py", line 25, in <module>
from route import *
File "/Library/Python/2.7/site-packages/scapy/route.py", line 162, in <module>
conf.route=Route()
File "/Library/Python/2.7/site-packages/scapy/route.py", line 22, in __init__
self.resync()
File "/Library/Python/2.7/site-packages/scapy/route.py", line 31, in resync
self.routes = read_routes()
File "/Library/Python/2.7/site-packages/scapy/arch/unix.py", line 87, in read_routes
ifaddr = scapy.arch.get_if_addr(netif)
File "/Library/Python/2.7/site-packages/scapy/arch/__init__.py", line 36, in get_if_addr
return socket.inet_ntoa(get_if_raw_addr(iff))
File "/Library/Python/2.7/site-packages/scapy/arch/pcapdnet.py", line 188, in get_if_raw_addr
return i.get(ifname)["addr"].data
File "dnet.pyx", line 990, in dnet.intf.get
OSError: Device not configured
我尝试在脚本的开头加上 "conf.iface=en1"
,但还是出现同样的错误。en1是一个有效的网络接口。
我还按照这里的建议,把arch/unix.py文件第34行的代码从 "os.popen("netstat -rn")
" 改成了 "os.popen("netstat -rn | grep -v vboxnet")
",但问题依然没有解决。
3 个回答
看起来scapy在处理桥接接口时遇到了一些问题。我也遇到了同样的问题,最后通过过滤掉互联网共享的桥接接口解决了。在这种情况下,正确的解决办法是用 "netstat -rn | grep -v vboxnet | grep -v bridge"
这个命令来替换掉原来的字符串。
我在用OSX 10.10.3,花了很长时间想让scapy正常工作。我尝试用pip安装scapy、scapy-real、dnet和dnet-real,但还是遇到同样的错误。这让我非常沮丧,所以我听从了上面Adam B的建议,决定添加一个需要修改的unix.py文件所在的文件夹。
在/usr/local/lib/python2.7/site-packages/scapy/arch/目录下,用vim、nano或其他文本编辑器打开unix.py文件。
把第37行改成:
fs=os.popen("netstat -rn | grep -v vboxnet") # -f inet
这样应该就能正常工作了。不过我还是遇到了一个错误,提示说无法导入python gnuplot wrapper,也无法导入PyX。
我在用OSX 10.5.9,花了很长时间想让scapy正常工作。在安装了dnet和pcap库之后,我也遇到了“OSError: Device not configured”的错误。我尝试把unix.py文件中的第34行替换成:
"netstat -rn | grep -v vboxnet"
但还是出现了同样的错误。不过,当我在if语句的“else”部分改动第37行时:
def read_routes():
if scapy.arch.SOLARIS:
f=os.popen("netstat -rvn") # -f inet
elif scapy.arch.FREEBSD:
f=os.popen("netstat -rnW") # -W to handle long interface names
else:
# f=os.popen("netstat -rn") # -f inet
f=os.popen("netstat -rn | grep -v vboxnet") # -f inet
结果就正常了!