在Windows中使用python将原始套接字绑定到接口

时间:2017-01-26 15:16:17

标签: python windows sockets

从Windows下绑定到指定接口的套接字读取原始数据包,还显示在其他接口上接收的数据包。这是Windows下的限制吗?

import socket as s
HOST = '192.168.1.101' # s.gethostbyname(s.gethostname())
socket = s.socket(s.AF_INET, s.SOCK_RAW)
socket.bind((HOST, 0))

while True:
    print(str(socket.recv(1000)))

代码遵循How to bind a raw socket to a specific interface using python in linux centOSthe docs中给出的示例。如果可能,如何实现预期结果?

2 个答案:

答案 0 :(得分:0)

我已添加到您的代码中:

socket.ioctl(s.SIO_RCVALL, s.RCVALL_ON)

然后在使用Python 3.5的Windows 7上运行:

import socket as s

HOSTS = ('169.254.222.66', '10.50.220.132')
for HOST in HOSTS:
    print('---', HOST)
    socket = s.socket(s.AF_INET, s.SOCK_RAW)
    socket.bind((HOST, 0))
    socket.ioctl(s.SIO_RCVALL, s.RCVALL_ON)
    for i in range(10):
        x = socket.recvfrom(65535)
        print(x[1], ' '.join(['%02x' % b for b in x[0]][:20]))
    socket.ioctl(s.SIO_RCVALL, s.RCVALL_OFF)

作为输出我得到了:

--- 169.254.222.66
('169.254.222.66', 0) 45 00 00 8d 6e d4 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 07 2d 6e d5 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 09 ad 6e d7 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 0a 3d 6e d9 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 04 3d 6e db 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 00 dd 6e dc 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 07 bd 6e dd 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 08 5d 6e df 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 06 4d 6e e1 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
('169.254.222.66', 0) 45 00 06 cd 6e e3 40 00 80 06 00 00 a9 fe de 42 a9 fe cc 5f
--- 10.50.220.132
('10.50.220.158', 0) 45 00 00 a1 64 18 00 00 01 11 7e 69 0a 32 dc 9e ef ff ff fa
('10.50.220.132', 0) 45 00 00 28 7d 4e 40 00 80 06 e3 cc 0a 32 dc 84 ac d9 06 25
('10.50.220.247', 0) 45 00 00 4e 02 9e 00 00 80 11 66 a6 0a 32 dc f7 0a 32 df ff
('10.50.221.3', 0) 45 00 00 4e 35 57 00 00 80 11 33 e1 0a 32 dd 03 0a 32 df ff
('10.50.220.149', 0) 45 00 00 f1 37 5f 40 00 04 11 67 db 0a 32 dc 95 ef ff ff fa
('10.50.220.149', 0) 45 00 00 f1 b3 04 40 00 40 11 a0 30 0a 32 dc 95 ff ff ff ff
('10.50.220.247', 0) 45 00 00 4e 02 9f 00 00 80 11 66 a5 0a 32 dc f7 0a 32 df ff
('10.50.221.3', 0) 45 00 00 4e 35 58 00 00 80 11 33 e0 0a 32 dd 03 0a 32 df ff
('10.50.220.176', 0) 45 00 00 4e 19 14 00 00 80 11 50 77 0a 32 dc b0 0a 32 df ff
('10.50.221.3', 0) 45 00 00 4e 35 59 00 00 80 11 33 df 0a 32 dd 03 0a 32 df ff

所以在我的测试中,没有混合接口

答案 1 :(得分:0)

此问题可能是由于数据包未使用您期望的接口。您可以在不希望用于路由的接口上增加接口度量标准。这将允许您想要使用的界面成为首选。

在Windows 7中:

  1. 转到控制面板
  2. 选择网络和共享
  3. 选择更改适配器设置
  4. 选择非首选路由
  5. 的界面
  6. 从列表中选择Internet协议版本4(TCP / IPv4)
  7. 选择高级
  8. 取消选择自动指标
  9. 添加足够大的接口度量标准,以允许任何其他接口为首选。