web-dev-qa-db-fra.com

lier le socket à l'interface réseau

Comment puis-je lier un socket à une interface réseau particulière? J'ai essayé d'utiliser setsockopt côté serveur, mais les clients peuvent toujours accéder au service via les interfaces eth0 et lo.

Je peux y parvenir en définissant l'adresse IP particulière à l'aide de serv_addr.sin_addr.s_addr.

Mais je soupçonne que nous pouvons nous lier à une interface en utilisant uniquement setsockopt (sans mentionner l'adresse IP).

17
user2003595

Vous pouvez vous lier à une interface spécifique en définissant SO_BINDTODEVICE option de socket.

struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0");
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
    ... error handling ...
}

Avertissement : Vous devez être root et avoir le CAP_NET_RAW capacité pour utiliser cette option.

La deuxième méthode est que vous pouvez résoudre l'adresse IP liée à une interface avec getifaddrs () .

Suivez ce dernier lien pour un exemple complet.

24
Davide Berra

La seule façon de le faire est que vous mentionnez -

en définissant l'adresse IP particulière à l'aide de serv_addr.sin_addr.s_addr

Vous ne pouvez pas le faire sans connaître l'adresse de liaison.

Vous pouvez utiliser ioctls pour déterminer l'adresse IP actuelle si vous en avez besoin, bien qu'il puisse y avoir un moyen plus intelligent de le faire de nos jours - je n'ai pas fait beaucoup de choses dans les distributions Linux modernes ces derniers temps.

3
Joe