Auteur Sujet: Plusieurs IP sur 1 seul interface  (Lu 45870 fois)

0 Membres et 1 Invité sur ce sujet

Leon

  • Client SFR sur réseau Numericable
  • Modérateur
  • *
  • Messages: 5 991
Plusieurs IP sur 1 seul interface
« le: 13 mai 2013 à 19:18:04 »
Bonjour à tous.

Je continue avec mes questions bizarres. Est-il possible de définir plusieurs adresses IP pour une seule et unique interface Ethernet d'un PC? Je suppose que oui, ou plutôt je sais que oui, car je le fais déjà avec des machines virtuelles dans VMWare.
Mais sans machine virtuelle? Je suppose que c'est possible aussi. D'ailleurs, je sais que certains serveurs possèdent plusieurs IP, sans faire de la virtualisation pour autant. Mais je n'ai aucune idée de comment ça marche.

En parallèle, je sais qu'on peut faire cohabiter plusieurs "sous-réseaux" (au sens IP) au sein d'un même réseau Ethernet. Ca fonctionne très bien, il n'y a rien à configurer de particulier. Tout ceci sans VLAN, je précise!

Donc en voyant ces 2 aspects, j'envisage la chose suivante: à partir d'un seul PC, équipé d'une seule interface Ethernet, serait-il possible d'accéder à chacun de ces 2 sous réseaux (qui cohabitent sur le même réseau ethernet), donc avec 2 IP différentes? Juste avec des bidouilles logicielles? Sans VLAN? Le tout avec un PC Vista ou XP?
Si oui, comment différencier quel logiciel utilise quelle IP (et donc sous-réseau)?

N'hésitez pas à me dire si je ne suis pas clair. Et merci d'avance aux experts en réseau.

Leon.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 091
  • Paris (75)
Plusieurs IP sur 1 seul interface
« Réponse #1 le: 13 mai 2013 à 19:33:40 »
oui on peut, ça s’appelle du multi-homing (attention toutefois, ce terme a plusieurs sens suivant le contexte).

Sous Windows, on peut le faire avec l'interface graphique (bouton config avancée) ou en ligne de commande avec netsh.

Sauf cas speciaux, on ne différencie pas explicitement comment les logiciels utilisent tel ou tel IP. C'est le systeme (le routage en fait) qui s'en charge en fonction de la destination a atteindre.

Pour les logiciels type 'serveurs' (qui 'écoutent' sur port en attente de quelque chose) soit ils ont prévu le cas et permettent de choisir sur quel(s) ip(s) ils ecoutent (generalement ca s'appele la/les bind address(es) dans leur config), soit il n'ont pas prévu et dans ce cas ils n’écoutent que sur une seule IP , la première définie (dite IP principale).

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Plusieurs IP sur 1 seul interface
« Réponse #2 le: 13 mai 2013 à 19:56:58 »
Exemple sous Linux :

ifconfig eth0 1.1.1.1 netmask 255.0.0.0
ifconfig eth0:1 2.2.2.2 netmask 255.0.0.0
ifconfig eth0:2 3.3.3.3 netmask 255.0.0.0

etc etc etc

On peut très bien définir des adresses IP d'un meme réseau IP : ça s'appelle de l'aliasing. Ca peut etre pratique dans le cas de la migration d'un ancien serveur.

Leon

  • Client SFR sur réseau Numericable
  • Modérateur
  • *
  • Messages: 5 991
Plusieurs IP sur 1 seul interface
« Réponse #3 le: 13 mai 2013 à 20:01:40 »
Merci pour la rapidité de la réponse!
Pour les logiciels type 'serveurs' (qui 'écoutent' sur port en attente de quelque chose) soit ils ont prévu le cas et permettent de choisir sur quel(s) ip(s) ils ecoutent (generalement ca s'appele la/les bind address(es) dans leur config), soit il n'ont pas prévu et dans ce cas ils n’écoutent que sur une seule IP , la première définie (dite IP principale).
Et côté "client"? Peut-on choisir laquelle des 2 IP va être choisie par un logiciel client sur le PC qui possède 2 IP? Le logiciel qui va initier une connexion TCP? Si non, comment va se faire le choix?

Est-ce que par exemple une adresse IP de destination qui est déjà dans un des 2 sous-réseaux (donc joignable directement sans passeer par une passerelle/routeur) sera systématiquement atteinte depuis l'IP du PC qui est sur le même sous-réseau?

Merci d'avance.

Leon.

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Plusieurs IP sur 1 seul interface
« Réponse #4 le: 13 mai 2013 à 20:04:59 »
En priorité ce sont les règles de routage qui s'appliquent : si une IP est accessible en direct, on l'utilise. Si on essaye de forcer le trafic du client à passer par une autre interface, il est probable (voir meme certain) que le serveur réponde par l'interface étant directement connecté au client.

Dans les cas posant problèmes en multi-homing, les controleurs de domaine Windows en font partie (à l'époque NT4 c'était meme interdit).

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 091
  • Paris (75)
Plusieurs IP sur 1 seul interface
« Réponse #5 le: 13 mai 2013 à 20:24:04 »
Et côté "client"? Peut-on choisir laquelle des 2 IP va être choisie par un logiciel client sur le PC qui possède 2 IP? Le logiciel qui va initier une connexion TCP? Si non, comment va se faire le choix?

Est-ce que par exemple une adresse IP de destination qui est déjà dans un des 2 sous-réseaux (donc joignable directement sans passeer par une passerelle/routeur) sera systématiquement atteinte depuis l'IP du PC qui est sur le même sous-réseau?

coté 'client', c'est exactement comme avec 2 cartes réseaux, y'a pas de différence.
on ne choisi pas l'IP, c'est le systeme qui fait le choix en fonction de l'IP distante
c'est le principe du routage comme a expliqué BadMax.

Leon

  • Client SFR sur réseau Numericable
  • Modérateur
  • *
  • Messages: 5 991
Plusieurs IP sur 1 seul interface
« Réponse #6 le: 13 mai 2013 à 21:01:53 »
Effectivement, je viens de tester à l'instant.
 
L'adresse IP source utilisée depuis le PC qui possède 2 adresses IP, c'est l'adresse IP la plus "proche" de la destination, selon la table de routage du PC; et c'est vrai que l'adresse de destination soit sur le même sous-réseau ou derrière un routeur/passerelle. Donc ça me semble assez optimal comme méthode de fonctionnement. Ca m'arrange bien en fait.

Leon.

Electrocut

  • Abonné Orange Fibre
  • *
  • Messages: 512
  • Pont-Péan (35)
Plusieurs IP sur 1 seul interface
« Réponse #7 le: 13 mai 2013 à 21:32:06 »
Je rajouterais qu'avec la commande netstat (sous Linux comme sous Windows), on peut regarder sur quelle(s) interface(s) écoute telle application serveur.

Exemple sous Windows :

C:\>netstat -an

Connexions actives

  Proto  Adresse locale         Adresse distante       État
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
...
  TCP    127.0.0.1:2559         0.0.0.0:0              LISTENING
  TCP    127.0.0.1:4370         0.0.0.0:0              LISTENING
  TCP    127.0.0.1:4380         0.0.0.0:0              LISTENING
...
  TCP    192.168.1.2:139        0.0.0.0:0              LISTENING

Si adresse locale = 0.0.0.0, écoute sur toutes les interfaces à la fois.
Si adresse locale = 127.0.0.1, n'écoute que sur l'interface locale
Si adresse locale = 192.168.1.2, n'écoute que sur l'interface 192.168.1.2 (associée ici à la carte Ethernet, j'ai qu'une adresse IP)

L'application serveur choisit l'interface lors de l'appel à la fonction système bind().

corrector

  • Invité
Plusieurs IP sur 1 seul interface
« Réponse #8 le: 14 mai 2013 à 02:20:41 »
Bonjour à tous.

Je continue avec mes questions bizarres.
Ces questions me semblent normales!

Est-il possible de définir plusieurs adresses IP pour une seule et unique interface Ethernet d'un PC?
Sans problème. Pouvoir faire cela n'est pas exigé par les RFC pour les OS supportant IPv4, mais tous les OS supportant IPv4 le permettent. En IPv6 le support par l'OS est obligatoire.

Je suppose que oui, ou plutôt je sais que oui, car je le fais déjà avec des machines virtuelles dans VMWare.
Les machines virtuelles ont leurs propres interfaces Ethernet, distinctes de l'interface de l'hôte : le trafic interne d'une interface Ethernet d'une machine virtuelle ne remonte pas forcèment au niveau d'une interface Ethernet de l'hôte.

Mais sans machine virtuelle? Je suppose que c'est possible aussi. D'ailleurs, je sais que certains serveurs possèdent plusieurs IP, sans faire de la virtualisation pour autant. Mais je n'ai aucune idée de comment ça marche.
Avoir plusieurs adresses IP c'est comme avoir une seule adresse IP, mais plusieurs fois.

En parallèle, je sais qu'on peut faire cohabiter plusieurs "sous-réseaux" (au sens IP) au sein d'un même réseau Ethernet. Ca fonctionne très bien, il n'y a rien à configurer de particulier.
Il n'y pas de raison que ça ne fonctionne pas.

Je crois qu'on appelle ça le "partage de média".

Tout ceci sans VLAN, je précise!
Les VLAN c'est de la triche!

Donc en voyant ces 2 aspects, j'envisage la chose suivante: à partir d'un seul PC, équipé d'une seule interface Ethernet, serait-il possible d'accéder à chacun de ces 2 sous réseaux (qui cohabitent sur le même réseau ethernet), donc avec 2 IP différentes?
Oui.

Remarque : J'ai indiqué l'autre fois qu'un routeur IP est toujours un machin qui a plusieurs IP, sur plusieurs sous-réseaux. Mais la réciproque est fausse. Ton PC a plusieurs IP, sur plusieurs sous-réseaux, sans être un routeur.

Juste avec des bidouilles logicielles? Sans VLAN?
Bien sûr sans VLAN, créer un VLAN c'est créer un lien Ethernet virtuel distinct, ce serait de la triche!

Si oui, comment différencier quel logiciel utilise quelle IP (et donc sous-réseau)?
Convention IP

En IP, 0 est un joker : adresse non spécifiée, adresse non liée.

En IPv4 le joker d'adresse IP est donc 0.0.0.0.
En IPv6 le joker d'adresse IP se note [::] se qui correspond à l'adresse nulle (que des 0).

Pour visualiser l'adresse IP d'écoute

Sous Windows Vista, tu peux voir toutes les socket TCP avec netstat -ta; les socket d'écoute apparaissent en état "LISTENING".

Tu vois l'adresse locale et l'adresse distante de chaque socket. L'adresse distante d'une socket d'écoute est toujours non-spécifiée par définition.

Une socket connectée a toujours ses deux adresses spécifiées.

Pour configurer l'adresse IP d'écoute

Comme administrateur

Tu dois configurer chaque logiciel serveur séparèment : consulter la doc du logiciel en question; quelques exemples :

Pour Apache 2.2 : directive Listen :

Listen [IP-address:]portnumber

Pour sshd : directive ListenAddress dans /etc/ssh/sshd_config

Pour vsftpd : directive listen_address dans vsftpd.conf

Pour les services démarrés par un "super serveur" (comme le classique /usr/sbin/in.telnetd) : dans la config du service dans le "super serveur" :

xinetd : directive bind

Comme programmeur C

La séquence minimal pour ouvrir un TCP passivement est :

/* créer une socket :
   type d'adresses pour cette socket :

   PF_INET : de domaine d'adressage "IP" (IPv4)
   ou bien
   PF_INET6 : de domaine d'adressage IPv6
   (pour passer en IPv6, il faut rajouter "6" dès qu'il est question d'adresse IP)

   type de socket :

   SOCK_STREAM :
   définit la sémantique de la socket :
   - socket de type connecté nécessitant une ouverture passive (listen) et active (connect) de l'autre coté
   - socket fournissant à l'application un flux d'octets, sans délimitation des messages (piège pour des débutants!)
   
   protocole :

   IPPROTO_TCP : je choisis explicitement le protocole TCP
   (mais en pratique on peut aussi laisser 0 qui demande le choix par défaut, qui est toujours TCP)
*/
s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);

// si s < 0 l'appel a échoué (examiner errno)
if (s < 0) // en cas d'erreur
  { perror ("socket"); exit (1); } // afficher un message puis quitter

/* une adresse d'extrémité de TCP est constituée d'un port et d'une adresse IP
   sockaddr_in : adresse IPv4 + port */
sockaddr_in addr;
// initialisation :
addr.sin_family = AF_INET; // adresse IP (IPv4)
addr.sin_port = 80; // choix de port TCP
addr.sin_addr = INADDR_ANY; // INADDR_ANY = adresse 0

// lier la socket à une adresse d'extrémité de TCP
err = bind (s, &addr, sizeof addr);

// si err = -1 l'appel a échoué (examiner errno)
if (err != 0) // en cas d'erreur
  { perror ("bind"); exit (1); } // afficher un message puis quitter

/* ouverture passive du TCP
   backlog  : 5
   "Le paramètre backlog définit une longueur maximale pour la file des connexions en attente."
*/
err = listen (s, 5);
// si err = -1 l'appel a échoué (examiner errno)
if (err != 0) // en cas d'erreur
  { perror ("listen"); exit (1); } // afficher un message puis quitter


Voilà la façon habituelle de démarrer un serveur TCP :
- l'adresse locale de la socket d'écoute est 0:80, ce qui signifie *:80
- l'adresse distante d'une socket d'écoute est toujours *:*

Si tu veux lier ton serveur à une adresse IP précise, par exemple pour avoir plusieurs différents sur la machine, tu remplaces INADDR_ANY par une adresse IP de ta machine.

Remarque : un pare-feu ne permet pas de choisir l'adresse locale d'une socket. Seule la programmation le permet.

N'hésitez pas à me dire si je ne suis pas clair. Et merci d'avance aux experts en réseau.
Clair comme de l'eau de source.
« Modifié: 14 mai 2013 à 05:33:43 par corrector »

corrector

  • Invité
Plusieurs IP sur 1 seul interface
« Réponse #9 le: 14 mai 2013 à 02:28:59 »
oui on peut, ça s’appelle du multi-homing (attention toutefois, ce terme a plusieurs sens suivant le contexte).
Ce terme est surtout utilisé pour ceux qui font du BGP.

ils n’écoutent que sur une seule IP , la première définie (dite IP principale).
Faux.

Il n'y a rien de tel. Fais des netstat -a.

corrector

  • Invité
ifconfig est dépassée
« Réponse #10 le: 14 mai 2013 à 02:31:37 »
Exemple sous Linux :

ifconfig eth0 1.1.1.1 netmask 255.0.0.0
ifconfig eth0:1 2.2.2.2 netmask 255.0.0.0
ifconfig eth0:2 3.3.3.3 netmask 255.0.0.0
Pourrait-on enfin arrêter d'utiliser cette commande obsolète depuis 10 ans?

Il faut utiliser ip

On peut très bien définir des adresses IP d'un meme réseau IP : ça s'appelle de l'aliasing. Ca peut etre pratique dans le cas de la migration d'un ancien serveur.
Les "alias" d'interfaces sont obsolètes sous linux depuis une dizaine d'années!

Voir Documentation/networking/alias.txt :
IP-aliases are an obsolete way to manage multiple IP-addresses/masks
per interface. Newer tools such as iproute2 support multiple
address/prefixes per interface, but aliases are still supported
for backwards compatibility.
« Modifié: 14 mai 2013 à 04:35:03 par corrector »

corrector

  • Invité
Choix de l'adresse source
« Réponse #11 le: 14 mai 2013 à 02:33:24 »
Peut-on choisir laquelle des 2 IP va être choisie par un logiciel client sur le PC qui possède 2 IP?
Programmation C

Le logiciel peut le choisir explicitement avec bind :
s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s < 0) // en cas d'erreur
  { perror ("socket"); exit (1); } // afficher un message puis quitter

// adresse locale de socket

sockaddr_in loc;
loc.sin_family = AF_INET;
loc.sin_port = ...;
loc.sin_addr = ...;

err = bind (s, &loc, sizeof loc);
if (err != 0) // en cas d'erreur
  { perror ("bind"); exit (1); } // afficher un message puis quitter

// adresse distante de socket

sockaddr_in dist;
dist.sin_family = AF_INET;
dist.sin_port = ...;
dist.sin_addr = ...;

// ouverture active du TCP

err = connect (s, &dist, sizeof dist);
if (err != 0) // en cas d'erreur
  { perror ("connect"); exit (1); } // afficher un message puis quitter

Choix de l'utilisateur

L'utilisateur peut choisir l'adresse source avec certains utilitaires; p.ex.

telnet
Citer
     -s src_addr
             Set the source IP address for the telnet connection to src_addr,
             which can be an IP address or a host name.

ssh
Citer
     -b bind_address
        Use bind_address on the local machine as the source address of
        the connection.  Only useful on systems with more than one
        address.

Sinon, ou s'il "choisit" l'adresse joker, c'est un paramètre de la table de routage.
« Modifié: 14 mai 2013 à 03:27:18 par corrector »