Hintergrund: Eine WLAN-Verbindung zwischen einem AccessPoint und einem WLAN-Client soll getestet werden, indem Daten versendet werden und ihr korrekter Empfang kontrolliert wird. Zu diesem Zwecke existiert ein PC mit zwei IP-Adressen in verschiedenen Subnetzen, wobei von der einen IP die Daten gesendet werden sollen und auf der anderen IP die Daten empfangen werden sollen. (192:168.0.100 und 192.168.1.100. Subnet-Mask jeweils 255.255.255.0)
Das Netzwerk besteht aus einem AccessPoint, einem WLAN-Client und einem Switch und natürlich dem PC mit den zwei IP-Adressen.
Der Client, der AP und der PC hängen am Switch. Client und AP sind per WLAN miteinander verbunden über dieselbe SSID.
Damit die Umsetzung von dem einen Subnetz ins andere gelingt, ist im Client NAT aktiviert, sprich alles was auf einem bestimmten Port am Client ankommt, wird auf einem anderen bestimmten Port an die andere IP des PC geschickt. Der PC weiss was er auf der einen IP losgeschickt hat und kontrolliert ob das auf der anderen IP empfangene identisch ist.
Umsetzung: Zu diesem Zwecke habe ich ein .Net-Programm geschrieben was genau dies über die Klassen TCP-Listener und TCP-Client realisiert.
Ich starte zunächst einen TCP-Listender der auf der IP 192.168.1.100:2222 (TCP-Listener-IP) auf eine eingehende Verbindung wartet.
Dann Starte ich den Client und versuche mich mit der IP des WLAN-Client über Port 3333 zu verbinden. Als AbsenderIP binde ich den TCP-Client an 192.168.0.100 (TCP-Client-IP). Der WLAN-Client macht NAT und schickt alles was auf 2222 kommt an TCP-Listener:2222 weiter.Der bekommt das Paket und schickt es an die Absenderadresse TCP-Client-IP zurück. Da diese in einem anderen Subnetz liegt, habe ich die „interne“ WLAN-Client-IP als Gateway eingetragen. Somit verbinde ich zwei Subnetze und die Verbindung wird erstellt. Dann kann ich Daten schicken und alles ist prima.
Fehler: Dies Funktioniert auch ohne Probleme, wenn ich den TCP-Listener und den TCP-Client auf zwei verschiedenen PCs laufen lasse mit eben diesen IP-Einstellungen.
Sobald ich aber nun versuche, dass auf einem PC zu machen, indem ich der NIC zwei IPs vergebe funktioniert das ganze nicht. Sobald ich versuche den Client mit dem Listener zu verbinden, bringt der Server einen Fehler und sagt: "Eine vorhandene Verbindung wurde vom Remotehost geschlossen“.
Wenn ich nun mit WireShark (Ethernet-Sniffer) mit die Pakete auf der Leitung angucke, sehe ich folgendes:
Nr. Time Source Destination Protocol Info
1 0.000000 NIC-MAC Broadcast ARP Who has WLAN-CLIENT-IP? Tell TCP-Client-IP
2 0.002052 WLAN-CLient-Mac NIC-MAC ARP WLAN-Client-IP is at WLAN-Client-Mac
3 0.002063 TCp-Client-IP WLAN-Client-IP TCP 1363 > 3333 [SYN] Seq=0 Len=0 MSS=1460
4 0.004889 TCp-Client-IP TCP-Listender-IP TCP 1363 > 2222 [SYN] Seq=0 Len=0 MSS=1460
5 3.006757 TCp-Client-IP WLAN-Client-IP TCP 1363 > 3333 [SYN] Seq=0 Len=0 MSS=1460
6 3.008415 192.168.1.2 TCp-Client-IP TCP 3333 > 1363 [RST, ACK] Seq=0 Ack=1 Win=0 Len=0
7 3.509698 TCp-Client-IP WLAN-Client-IP TCP 1363 > 3333 [SYN] Seq=0 Len=0 MSS=1460
8 3.510470 TCp-Client-IP TCP-Listender-IP TCP 1363 > 2222 [SYN] Seq=0 Len=0 MSS=1460
Die IP-Adressen und die MAC-Adressen habe ich so umbenannt, dass man sieht von welchem Device sie kommen.
Wie man erkennen kann wird zwar an den TCP-Listener ein SYN geschickt, dieser schickt aber niemals ein ACK zurück. Stattdessen wird die Verbindung vom WLAN-Client resetet.
Vermutung: Ich habe nun eine Vermutung, wo der Fehler liegen könnte.
Wenn ich TCP-Listener und TCP-Client im selben Subnetz laufen lasse und sie direkt (ohne Portumsetzung) starte, funktioniert es auf einem PC. Allerdings bekommt WireShark nichts davon mit. Ich denke, dass er die „interne“ Kommunikation einer NIC nicht abhören kann da in diesem Fall die Kommunikation nicht über die beiden WLAN-Devices stattfinet.
Ich denke also, dass der TCP-Listender das SYN ordnungsgemäß empfängt und ein ACK an den TCP-Client zurück schickt. Allerdings nicht über das Netzwerk, sondern intern in der Netzwerkkarte. Das würde auch erklären, warum WireShark nichts davon mitbekommt und beim abhören nie ein Packet den Absender TCP-Listerner-IP hat. Dazu habe ich aber zu wenig Ahnung vom Aufbau einer Netzwerkkarte und wie die „interne“ Kommunikation aussieht. Warum dann aber die Verbindung nicht aufgebaut wird, bleibt mir ein Rätsel.
Auch unklar bleibt mir, warum die WLAN-Cleint ohne dass es ein Reset vom TCP-Listener gab, ein Reset an den TCP-Client zurückschickt (Nummer 6).
Ich habe das ganze schon auch mit zwei NICs im PC getestet, das Ergebnis ist das selbe wie oben. Scheint also keinen Unterschied zu machen.
Ich weiss, dass hört sich sehr komplex an aber ich hoffe mein Problem ist einigermaßen deutlich rübergekommen.
Würde mich sehr freuen, wenn mir einer von euch einen Tipp geben könnte, warum die Kommunikation der beiden IP-Adressen nicht zu Stande kommt.
Mit freundlichen Grüßen, Axel Köhler