J'ai un programme que je voudrais tester en mode hors ligne sans supprimer mon réseau actuel. Ce programme devrait toujours se connecter aux sockets locaux, y compris les sockets de domaine Unix et le bouclage. Il doit également écouter en boucle et être visible pour les autres applications.
Mais les tentatives de connexion à une machine distante devraient échouer.
J'aimerais avoir un utilitaire qui fonctionne comme strace
/ unshare
/ sudo
et exécute simplement une commande avec Internet (et LAN) caché et tout le reste fonctionne:
$ offline my-program-to-test
Cette question a des indices sur la réponse: bloquer l'accès au réseau d'un processus?
Il y a quelques suggestions, comme exécuter comme un autre utilisateur puis manipuler iptables, ou unshare -n
. Mais dans les deux cas, je ne connais pas l'incantation pour que les sockets de domaine Unix et le bouclage soient partagés avec le système principal - les réponses à cette question me disent seulement comment dissocier tout le réseau.
Le programme que je teste doit toujours se connecter à mon serveur X et dbus et même être en mesure d'écouter en boucle les connexions d'autres applications du système.
Idéalement, je voudrais éviter de créer des chroots ou des utilisateurs ou des machines virtuelles ou similaires, car cela devient tout aussi ennuyeux que de débrancher le câble réseau. c'est-à-dire que la question est de savoir comment puis-je rendre cela aussi simple qu'un sudo
.
J'aimerais que le processus s'exécute à 100% normalement, sauf que les appels réseau spécifiant une adresse non locale échoueraient. Idéalement en gardant le même uid, le même homedir, le même pwd, le même tout sauf ... hors ligne.
J'utilise Fedora 18, donc les réponses Linux non transférables sont très bien (attendues, même).
Je suis même heureux de résoudre ce problème en écrivant un programme C, si c'est le cas, les réponses qui impliquent d'écrire C sont donc très bien. Je ne sais tout simplement pas quels syscalls ce programme C devrait faire pour révoquer l'accès au réseau externe tout en conservant le réseau local.
Tout développeur essayant de prendre en charge le "mode hors ligne" apprécierait probablement cet utilitaire!
la source
Cela peut également être réalisé avec les règles iptables correspondant aux groupes de contrôle. J'ai écrit un outil pour résumer les étapes. Bien qu'il nécessite des autorisations root pour la configuration initiale et soit par ailleurs un binaire setuid, je pense qu'il offre un moyen assez simple de résoudre le problème dans la question. Il nécessite une version iptables suffisamment récente et disposant des modules netfilter appropriés.
https://github.com/quitesimpleorg/qsni
la source
Je ne l'ai pas utilisé, mais je pense que vous pourriez potentiellement utiliser Comcast:
https://github.com/tylertreat/Comcast
réglé sur 100% de perte de paquets
Encore une fois, je n'ai pas testé cela, mais théoriquement, modifié à partir de leur fichier Lisez-moi, vous pouvez le faire:
Linux
Sous Linux, vous pouvez utiliser
iptables
pour supprimer les paquets entrants et sortants.Vous pouvez également utiliser
tc
ce qui prend en charge certaines options supplémentaires.Réinitialiser:
la source