Linux: existe-t-il un moyen pratique d'exécuter un programme le liant à l'adresse IP de son choix?

11

Dans FreeBSD 4.9, il était très facile à réaliser avec une seule commande comme

jail [-u username]  path hostname ip-number command

si le chemin était, /vous utilisiez le même programme que d'habitude, mais toutes ses communications réseau étaient limitées à utiliser uniquement l'adresse IP donnée comme source. Parfois, c'est très pratique.

Maintenant, sous Linux, il y a LXC, qui ressemble beaucoup aux jailzones de FreeBSD (ou de Solaris) - pouvez-vous penser à une manière similaire d'exécuter un programme?

poige
la source
Avec quel programme essayez-vous de faire cela? De nombreux programmes sont suffisamment configurables pour pouvoir savoir à quelle IP se lier.
Warren Young
@WarrenYoung, merci KO, mais "beaucoup"! = "Tous"
poige
Un bon cas d'utilisation pour «emprisonner» un exécutable pour utiliser une adresse IP spécifique est d'exécuter plusieurs serveurs de jeu sur une machine sur une partie LAN. Par exemple, les jeux Valve ne diffusent que sur les ports 27015-27020 donc par IP, vous ne pouvez avoir que 6 serveurs. Donc, vous ajoutez des IP virtuelles sur une carte réseau, mais vous devez ensuite spécifier "+ ip <address>" sur la ligne de commande du serveur de jeu qui arrête de diffuser sa présence aux clients => aucun serveur visible dans le navigateur LAN. Donc "+ ip" ne fonctionnera pas. Par conséquent, nous devons emprisonner chaque serveur dans un environnement où il ne peut trouver qu'une seule adresse IP. Résultat: aucune limite dans #servers + clients voir tous les serveurs.
Timmos

Réponses:

12

Le démarrage du processus dans un espace de noms réseau qui ne peut voir que l'adresse IP souhaitée peut accomplir quelque chose de similaire. Par exemple, je supposais que je ne voulais que localhost disponible pour un programme particulier.

Tout d'abord, je crée l'espace de noms du réseau:

ip netns add limitednet

Les espaces de noms ont une interface de bouclage par défaut, donc j'ai juste besoin de la mettre en place:

sudo ip netns exec limitednet ip link set lo up

Maintenant, je peux exécuter un programme en utilisant ip netns exec limitednetet il ne pourra voir que l'interface de bouclage:

sudo ip netns exec limitednet ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

Si je voulais le limiter à une adresse autre que localhost, je pourrais ajouter d'autres interfaces dans l'espace de noms en utilisant:

ip link set DEVICE_NAME netns NAMESPACE

Je devrais expérimenter un peu plus pour comprendre comment ajouter une seule adresse IP dans un espace de noms dans le cas où une interface pourrait avoir plus d'une adresse IP

L' article de LWN sur les espaces de noms est également utile.

Steven D
la source
Mais il convient de mentionner que cela nécessiterait beaucoup plus de préparatifs car l'espace de noms du réseau a sa propre table de routage, etc. Si quelqu'un vient avec un moyen plus simple d'imiter jail, je vais l'utiliser. ;)
poige