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 IPEn 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'écouteSous 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 administrateurTu 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:]portnumberPour
sshd : directive
ListenAddress dans
/etc/ssh/sshd_configPour
vsftpd : directive
listen_address dans
vsftpd.confPour 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 CLa 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.