Autoriser uniquement certains trafics sortants sur certaines interfaces

15

J'ai un problème plutôt étrange. J'ai un serveur avec deux interfaces réseau eth0et eth1. Chacun est connecté à un réseau différent. Chaque réseau possède une passerelle Internet. Le serveur a diverses connexions sortantes : http (certains scripts sur les sites Web de serveur scrape), client nfs, client samba, client dns et un récupérateur de courrier électronique pour n'en nommer que quelques-uns.

Pour des raisons que je ne vais pas aborder, j'ai besoin de diviser ces clients sortants afin que le trafic http, nfs, samba et dns sortant soit uniquement demandé pendant eth0que tout le reste se déroule eth1.

J'ai lu quelques recherches sur Google et il semblerait que iptablesce dont j'ai besoin, mais je n'en ai vraiment aucune idée. Je ne suis habitué qu'à gérer les règles de pare-feu entrantes via ufw.

Quelqu'un pourrait-il me lancer avec quelques exemples de règles et me dire comment amener le système à adopter ces règles au démarrage? Idéalement sans me verrouiller hors de ma connexion SSH (je peux obtenir un accès physique, mais je préfère ne pas).

Modifier Je peux diviser les clients en deux utilisateurs s'il est possible de limiter tout le trafic sortant d'un compte à une interface. sur papier qui semble être plus facile.

Oli
la source

Réponses:

12

Je voudrais configurer une table de routage distincte et une politique pour acheminer les paquets marqués à l'aide de cette table et demander à iptables / netfilter de marquer certains paquets.

Créez une table: echo 1 known >> /etc/iproute2/rt_tables

Créez une règle de routage (la ipcommande provient d' iproute2 ): ip rule add from all fwmark 1 table known

Nous avons créé une table appelée "connue" et créé une règle de routage qui dit que tout paquet avec une marque égale à 1 est routé conformément à la table "connue". Je l'ai seulement appelé connu parce que c'est pour la liste des protocoles connus - vous pouvez le nommer comme vous voulez. Maintenant, nous configurons la table connue pour acheminer la bonne façon.

ip route add default dev eth0 table known

Créez des règles iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

L'exemple marque les paquets sur les ports NFS (111, 2049) avec un 1. Nous ajoutons cette règle à l'iptable 'mangle'. Ceci est différent des tables de routage et n'est pas modifiable; la table mangle est spécifiquement destinée à modifier les paquets d'une manière autre que NAT.

Maintenant, pour acheminer tout le reste via l'autre interface, nous ajoutons un itinéraire à la table de routage standard.

ip route add default dev eth1

Pour vraiment comprendre cela, lisez les sections 4 et 11 du howto LARTC .

Shawn J. Goff
la source
Eh bien, c'est en fait beaucoup plus simple que je ne le craignais. La pile de mise en réseau Linux est vraiment une belle bête, n'est-ce pas?! Je l'ai fait un test rapide et tout semble fonctionner comme prévu. Je surveille chaque interface via iftopet ils affichent chacun le bon type de trafic. Merci beaucoup.
Oli
Je ne sais pas comment iptables ou iproute2 stockent leur configuration. Dois-je désactiver ces règles à chaque démarrage?
Oli
@Oli Ils sont effacés lorsque vous redémarrez. Vous pouvez enregistrer et restaurer les règles avec iptables-saveet iptables-restore. Si vous utilisez NetworkManager, vous pouvez configurer des scripts de répartiteur pour automatiser le processus. Malheureusement, la page NM officielle n'a pas de documentation sur la fonctionnalité, mais la documentation Ubuntu et Arch Linux la mentionnent toutes les deux.
Shawn J. Goff
5

Eh bien, la façon la plus " simple " devrait être de demander aux programmes individuels d'utiliser une interface spécifique (ou l'ip de l'interface. Par exemple:

ping -I eth1 8.8.8.8

demande à ping d'utiliser eth1 comme interface source, tandis que

wget --bind-address 10.0.0.1 http://www.google.it/

demande à wget de passer l'interface qui a 10.0.0.1comme adresse IP.

Honnêtement, je ne sais pas si c'est possible avec tous les programmes dont vous avez besoin, mais c'est un début pour réduire les règles pour lesquelles vous devez écrire iptablesetiproute programmes.

Pour commencer, vous devriez lire ce tutoriel sur plusieurs connexions Internet . Une bonne lecture est aussi l' un des milliers de tutoriels iptables, expecially sur outbound filtering, process/ pid filteringet port filtering.

M. Shunz
la source
4

La bonne façon d'y parvenir est de lier () à l'interface que vous souhaitez utiliser pour les paquets sortants. Puisque vous pouvez ensuite configurer des itinéraires avec les commandes ip routeet ip rulepour contrôler la façon dont les paquets sont routés en fonction de leur interface sortante. Pour mon exemple, je suppose que le réseau suivant:

  • eth0:
    • Adresse: 192.168.0.2/24
    • Passerelle par défaut: 192.168.0.1
  • eth1:
    • Adresse: 192.168.1.2/24
    • Passerelle par défaut: 192.168.1.1

Je vais créer deux tables de routage, une pour le trafic sortant pour eth0 appelée alternative et une table pour eth1 appelée principale. La table de routage principale existe toujours et est la table normale utilisée par les commandes routeet ip route. La plupart des gens ne traitent jamais avec d'autres tables. Pour créer la table appelée alternative, nous ajouterons la ligne suivante à /etc/iproute2/rt_tables:

10    alternate

La table main a une priorité par défaut de 254. Les règles pour lesquelles la table de routage est en vigueur sont contrôlées par la ip rulecommande. Par défaut, cette commande affichera une liste des règles existantes qui devraient ressembler à ceci:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Cela signifie essentiellement qu'il recherchera une route dans la table localqui est une table spéciale maintenue par le noyau pour les routes locales telles que ma propre adresse IP. Il essaiera ensuite table main et table default. La table par défaut est normalement vide, donc s'il n'y a pas de correspondance dans main, il n'y a pas de route vers l'hôte. Tout d'abord, permet de remplir la table en alternance avec des règles pour eth0.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

Vous souhaiterez normalement que la alternatetable ressemble à la maintable. Les seules différences sont lorsque le routage doit être différent. Vous pouvez ne pas vouloir inclure la deuxième ligne ci-dessus si vous voulez littéralement que tout le trafic NFS, HTTP, etc. passe par la passerelle par défaut sur eth0 même s'il est destiné au réseau sur eth1. L'étape suivante consiste à ajouter une règle pour savoir quand utiliser cette table de routage alternative:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

Cette règle indique que tout trafic provenant d'une adresse sur le réseau 192.168.0 utilisera la alternatetable de routage au lieu de la maintable normale . La dernière étape consiste à s'assurer que tous les clients qui doivent utiliser y sont eth0liés. Avec wget, par exemple, set --bind-address=192.168.0.2, pour NFS, définissezclientaddr=192.168.0.2option de montage. Si vous utilisez LibWWW avec Perl, vous pouvez définir l'option localaddr dans LWP :: UserAgent pour contrôler l'interface locale à laquelle il se lie. Si vous avez un client dont vous ne pouvez pas contrôler la liaison et que la compilation n'est pas une option, vous pouvez peut-être utiliser une règle iptables pour modifier son adresse, mais il s'agit plus d'un piratage et peut ne pas fonctionner. Vous auriez besoin d'une règle SNAT configurée dans la chaîne PREROUTING de la table nat ou de la table mangle. Vous aurez toujours besoin des tables de routage modifiées données ci-dessus pour que cela fonctionne.

pingouin359
la source