Bind en rå stikkontakt til en grænseflade ved hjælp af python i Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Hvis du læser råpakker fra en stikkontakt, der er bundet til en bestemt grænseflade under Windows, vises også pakkerne, der modtages på andre grænseflader. Er dette en begrænsning under 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)))


Koden følger eksemplet i Sådan bindes en rå sokkel til en bestemt grænseflade ved hjælp af python i linux centOS og docs. Hvis det er muligt, hvordan kan det forventede resultat opnås? [6]

Bedste reference


Jeg tilføjede til din kode:


socket.ioctl(s.SIO\_RCVALL, s.RCVALL\_ON)


Så på Windows 7 ved hjælp af Python 3.5 løb jeg:


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)


Som output fik jeg:


--- 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


Så i min test var der ingen blanding af grænseflader

Andre referencer 1


Dette problem kan skyldes, at pakkerne ikke bruger det interface, du forventer. Du kan øge grænsefladen metrisk på den grænseflade, som du ikke vil bruge til routing. Dette gør det muligt at bruge den grænseflade, du ønsker at foretrække.


I Windows 7:



  1. Gå til kontrolpanel

  2. Vælg netværk og deling

  3. Vælg Skift adapterindstillinger

  4. Vælg den grænseflade, der ikke er foretrukket til routing

  5. Vælg Internet Protocol Version 4 (TCP/IPv4) fra listen

  6. Vælg Avanceret

  7. Fravælg automatisk metrisk

  8. Tilføj et grænseflademetrisk stort nok til at tillade, at andre grænseflader foretrækkes.