Vielen Dank für das Lesen dieser Frage. Habe schon eine Weile an C-Sockeln gearbeitet - speziell an c thread-tcp-Buchsen mit tls. Verwenden der OpenSSL-API.C Threaded Sockets - tcp mit TLS, kann nicht IP/Ether Paket Header
Ich habe seit einiger Zeit ein Problem, wo ich die Quelle IP und Port bekommen kann - z. B. printf("Connection: %s:%d\n",inet_ntoa(d->addr.sin_addr), ntohs(d->addr.sin_port));
.
Das Problem ist, dass ich alle Daten benötige - Ethernet und IP, wo ich Quell- und Ziel-IPs, MAC-Adressen, Protokoll, TTL ansehen kann und die Liste geht weiter.
Versuchte mehrere Beispiele aus dem Web wie dies von Binary Gezeiten
data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , &saddr_size);
unsigned short iphdrlen;
struct iphdr *iph = (struct iphdr *)Buffer;
iphdrlen =iph->ihl*4;
memset(&source, 0, sizeof(source));
source.sin_addr.s_addr = iph->saddr;
memset(&dest, 0, sizeof(dest));
dest.sin_addr.s_addr = iph->daddr;
fprintf(logfile," |-Checksum : %d\n",ntohs(iph->check));
fprintf(logfile," |-Source IP : %s\n",inet_ntoa(source.sin_addr));
fprintf(logfile," |-Destination IP : %s\n",inet_ntoa(dest.sin_addr));
Aber ich halte auf „Junk-Daten“ zu bekommen. Grundsätzlich sind die IPs und andere Felder seltsam und zufällig.
SSL_read() legt die Daten in einen Puffer (die HTTPS-Anfrage im Grunde), zu diesem Zeitpunkt bin ich schon zu spät? Ich habe versucht, den Socket vor dem Versuch SSL_Accept() zu lesen, also Lesen von einem unverschlüsselten Socket, bekomme ich immer noch die Junk-Daten.
Grundsätzlich kann jede Hilfe mit:
1) c Beispiele
2) brauche ich BIO zu benutzen?
3), was Prozess, den ich zu erfassen folgen, dass die Daten
in meinem Haupt ich nur Schleife zB
for (; ;) {
memset(&d->addr, 0, sizeof(d->addr));
d->len = sizeof(d->addr);
if ((d->client = accept(d->server, (struct sockaddr*)&d->addr, &d->len)) > 0) {
pthread_create(&connection_thread, NULL, handleGuestConnection, (void *) d);
hier ist ein Ausschnitt aus der Gewinde Funktion:
data *d = socketData;
SSL *ssl;
ssl = SSL_new(d->ctx);
SSL_set_fd(ssl, d->client);
int returnStatus = handleGuestSSLAccept(ssl);
switch (returnStatus) {
case 1: {
break;
//Bad Socket
}
case 2: {
char *reply = HTTPHeaderResponse(2);
write(d->client, reply, strlen(reply));
break;
//Redirect
}
case 3: {
char buf[1024] = {0};
int bytes = SSL_read(ssl, buf, sizeof(buf));
if (bytes > 0) {
buf[bytes] = '\0';
char *reply = HTTPHeaderResponse(3);
SSL_write(ssl, reply, strlen(reply));
}
break;
//Good
}
}
Sie müssen verstehen, dass die Korrespondenz zwischen SSL-Daten und TCP-Paketen wird nicht 1 sein -bis 1. Es kann so ziemlich alles sein. Am besten nehmen Sie die Low-Level-Daten vollständig getrennt auf, z. B. mit einem Thread, der libpcap oder ähnliches verwendet. –
Kann ich fragen, warum Sie die Low-Level-Details des Protokolls sehen wollen? Ist das nur eine Lernübung? Wenn ja, empfehle ich 'wireshark'.Für TLS haben die Kommandozeilen-Tools 'openssl s_client' und' s_server' eine schöne Debug-Option für das TLS-Messaging. Wenn Sie versuchen, Clients zu überprüfen, indem Sie die Protokolldetails überprüfen, gibt es vielleicht einen besseren Weg, um das zu erreichen, was Sie versuchen wollen ... – lockcmpxchg8b
@DavidSchwartz - Ich habe das untersucht, kennen Sie irgendwelche Beispiele? Ich konnte nicht erfolgreich eine funktionierende Version – allThingsLinux