2016-06-21 6 views
0

Ich versuche, eine Buchse an die spezifische (Loopback) zu binden Schnittstelle lo außerhalb Verkehr zu verhindern, dass mit ihm zu stören:Bindung Buchse an spezifische Schnittstelle

int bind_socket(uint8_t *iface, uint8_t port) { 
     int rv; 
     struct sockaddr_in addr; 
     rv = socket(AF_INET, SOCK_STREAM, 0); 
     if (rv < 0) return -1; 
     if (setsockopt(rv, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface)) < 0) { 
       return -2; 
     } 
     bzero((char *) &addr, sizeof(addr)); 
     addr.sin_family = AF_INET; 
     addr.sin_addr.s_addr = INADDR_ANY; 
     addr.sin_port = htons(port); 
     if (bind(rv, (struct sockaddr *) &addr, sizeof(addr)) < 0) 
       return -3; 
     return rv; 
} 

... 

int ss; 
ss = bind_socket("lo", 100); 

Allerdings, wenn ich nmap localhost -e wlpXsX ausführen, sollte ich nicht sein Die Ausgabe, die den Socket anzeigt, ist über diese Schnittstelle verfügbar. Es wird stattdessen als verfügbar gemeldet; und ich kann nicht in der Lage sein, den Grund dafür zu finden. Warum ist diese Schnittstelle global mit einem Programm verfügbar, das dafür ausgelegt ist, dass es für alle anderen Schnittstellen nicht verfügbar ist?

+0

XY Problem? Wenn Sie nur einen Socket für die lokale Kommunikation benötigen, warum verwenden Sie überhaupt den AF_INET-Socket? – SergeyA

Antwort

2

Sie schrieb:

Ich versuche, eine Buchse an die spezifische (Loopback) -Schnittstelle

zu binden, aber sie codiert:

addr.sin_addr.s_addr = INADDR_ANY; 

INADDR_ANY (0.0.0.0) ist nicht die Loopback-Schnittstelle. Sie müssen es INADDR_LOOPBACK (127.0.0.1) ändern statt:

addr.sin_addr.s_addr = htons(INADDR_LOOPBACK); 
+0

Er sagte, er wolle an die Schnittstelle binden, nicht an die Adresse. Was ist mit 127.0.0.2, das ist auch Loopback. –

+0

Diese Antwort löst mein Problem nicht. Ich kann den Socket von anderen Schnittstellen immer noch erkennen. – motoku

0

Es scheint nmap die Schnittstelle Schalter wurde ignoriert, und das Routing seine Sonden durch die Loopback-Schnittstelle sowieso. Vorbei an meine LAN-Adresse als Ziel statt localhost und meine LAN-Schnittstelle als die Schnittstelle Argument nmap das beabsichtigte Ergebnis der Fassung hergestellt ist unsichtbar außerhalb des lokalen Host mit dem folgenden Quelltext:

int bind_lo(int port) { 
     int rv; 
     const char iface[] = "lo"; 
     struct sockaddr_in addr; 
     rv = socket(AF_INET, SOCK_STREAM, 0); 
     if (rv < 0) return -1; 
     bzero((char *) &addr, sizeof(addr)); 
     addr.sin_family = AF_INET; 
     addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 
     addr.sin_port = htons(port); 
     if (bind(rv, (struct sockaddr *) &addr, sizeof(addr)) < 0) 
       return -2; 
     if (setsockopt(rv, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface) + 1) < 0) { 
       return -3; 
     } 
     return rv; 
}