[Python]Raw socket werkt niet goed

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 03-10 16:41

EXX

EXtended eXchange

Topicstarter
Ik zit met het volgende:

een systeem met daarop 3 LANs, elke LAN heeft 2 NICs die via bonding elkaar geschakelt zijn. We hebben dus netwerk bond0, bond1 en bond2.

Nu zitten er op LAN bond1 encapsulated data dmv het L2TP protocol. Deze data kan ik zien langskomen met tcpdump -i bond1 en de L2TP paketten worden verstuurd door een router mbv IP multicast adressen.

Nu moet ik op de server deze L2TP paketten omzetten naar standaard UDP/IP paketten. Het komt er op neer dat ik de L2TP paketten moet uitlezen en de data die erin zit weer versturen op hetzelfde LAN in UDP/IP multicast.

Om de data uit de L2TP paketten te halen gebruik ik een RAW socket:

Python:
1
2
3
4
5
try:
  l2tp_sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
except socket.error:
  print "RAW Socket could not be created."
  sys.exit()


Ik krijg packets binnen die ik kan verwerken, maar lang niet allemaal: ik krijg alleen maar packets van 1 multicast adres, niet van andere multicast adressen.

Als ik de socket ook nog eens bind aan het LAN waar de L2TP data opzit, krijg ik helemaal niks binnen:

Python:
1
2
3
4
5
try:
 l2tp_sock.bind(('bond1',0))
except socket.err:
  print "Error in  binding raw socket to bond1"
  sys.exit()


Dus zit ik met volgende vragen:
  • Waarom krijg ik niet alle L2TP data binnen?
  • Waarom krijg ik helemaal niks binnen als ik de raw socket met het LAN bond1 bindt, waar de L2TP data op staat?
Python versie: 2.7.5
Linux versie: Oracle Linux 7.5

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!

Beste antwoord (via EXX op 20-01-2020 12:22)


  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:52
Ik zie je nergens abonneren op een multicast adres? Als je dat eens probeert i.p.v. je huidige bind?

Zie bijv. hier:
https://pymotw.com/2/socket/multicast.html

Sinds de 2 dagen regel reageer ik hier niet meer

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:52
Ik zie je nergens abonneren op een multicast adres? Als je dat eens probeert i.p.v. je huidige bind?

Zie bijv. hier:
https://pymotw.com/2/socket/multicast.html

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 03-10 16:41

EXX

EXtended eXchange

Topicstarter
Als ik het goed heb, hoef je niet te abonneren, net omdat je een raw socket gebruikt: je haalt gewoon alle paketten binnen van de LAN, om dan vervolgens zelf de hele decoding uit te voeren.

tcpdump laat zien dat de L2TP paketten met verschillende multicast IP addressen op het LAN bond1 staan, maar mijn programma ziet maar L2TP data van 1 bepaald multicast adres.

Ik ga het proberen, maar ik heb het vermoeden dat het ziet zal werken.

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:52
EXX schreef op maandag 20 januari 2020 @ 11:49:
Als ik het goed heb, hoef je niet te abonneren, net omdat je een raw socket gebruikt: je haalt gewoon alle paketten binnen van de LAN, om dan vervolgens zelf de hele decoding uit te voeren.
Je hebt gelijk. Echter, als je niet op het niveau van raw sockets werkt (bijv. ARP) waarom zou je dan toch raw sockets willen gebruiken?

Voor raw socket verkeer zoals jij hem zoekt gebruik ik meestal libpcap. Die is er ook als python library.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 03-10 16:41

EXX

EXtended eXchange

Topicstarter
Zit die library ook standaard in Python 2.7.5? Ik moet nl. met de standaardversie aan de gang; zonder extra installaties van libraries dus.

Overigens zit er wel beweging in: een membership add via het raw socket gaat (zoals verwacht) niet, want het raw socket ondersteunt dat niet.

Maakt ik echter naast het raw socket een dummy UDP multicast socket aan, met membership add, krijg ik de data wel binnen op het raw socket.

Even verder testen met meerdere multicast adressen...

Edit:

Als ik voor elk multicast adres wat ik moet binnenhalen een dummy UDP multicast socket aanmaak met bijbehorende membership add, zie ik alle data voorbijkomen in het raw socket.

[ Voor 16% gewijzigd door EXX op 20-01-2020 12:14 ]

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:52
De vraag is of de data wel op je netwerk interface binnen komt zonder ook een lidmaatschap te hebben op het multicast adres. Dus naast je raw socket ook een multicast socket te openen lijkt dan de juiste route te zijn.

Wat je ook kan checken is of promiscuous mode wel aan staat op je netwerk adapter of je bond?

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 03-10 16:41

EXX

EXtended eXchange

Topicstarter
Een dummy UDP Multicast socket aanmaken met bijbehorende membership lost het probleem inderdaad op.

Ik heb met netstat -i even gekeken, er staat geen P flag bij de betreffende LAN, dus geen promiscuous mode. Des te beter dat het kan zonder de hele interface in promiscuous mode te gooien.

Even een antwoord op je eerdere vraag, waarom raw: omdat de standaard socket libraries geen L2TP kennen. L2TP is een layer boven op IP, dus geen standaard TCP of UDP setting.

[ Voor 39% gewijzigd door EXX op 20-01-2020 12:22 ]

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:52
EXX schreef op maandag 20 januari 2020 @ 12:19:
Een dummy UDP Multicast socket aanmaken met bijbehorende membership lost het probleem inderdaad op.

Ik heb met netstat -i even gekeken, er staat geen P flag bij de betreffende LAN, dus geen promiscuous mode. Des te beter dat het kan zonder de hele interface in promiscuous mode te gooien.
Probleem en oplossing zijn nu beide helder :)
Even een antwoord op je eerdere vraag, waarom raw: omdat de standaard socket libraries geen L2TP kennen. L2TP is een layer boven op IP, dus geen standaard TCP of UDP setting.
Ok

@EXX ik vind overigens dat dit antwoord CurlyMo in "[Python]Raw socket werkt niet goed" beter het probleem beschrijft met daarbij de oplossing.

[ Voor 12% gewijzigd door CurlyMo op 20-01-2020 13:09 ]

Sinds de 2 dagen regel reageer ik hier niet meer

Pagina: 1