Consentire solo un determinato traffico in uscita su determinate interfacce


15

Ho un problema piuttosto strano. Ho un server con due interfacce di rete eth0e eth1. Ciascuno è collegato a una rete diversa. Ogni rete ha un gateway internet. Il server ha varie connessioni in uscita : http (alcuni script sul server scrape i siti Web), client nfs, client samba, client dns e un fetcher e-mail per citarne solo alcuni.

Per motivi che non affronterò, ho bisogno di dividere questi client in uscita in modo che il traffico in uscita http, nfs, samba e dns sia richiesto solo eth0mentre tutto il resto passa eth1.

Ho letto alcune ricerche su Google e sembra che iptablessia quello di cui avrò bisogno, ma in realtà non ne ho idea. Sono abituato a gestire solo le regole del firewall in entrata ufw.

Qualcuno potrebbe iniziare con alcune regole di esempio e dirmi come fare in modo che il sistema adotti queste regole all'avvio? Idealmente senza bloccarmi fuori dalla mia connessione SSH ( posso ottenere l'accesso fisico, ma preferirei non farlo).

Modifica Posso dividere i client su due utenti se è possibile limitare tutto il traffico in uscita da un account a un'interfaccia. sulla carta sembra che potrebbe essere più facile.

Risposte:


12

Vorrei impostare una tabella di routing separata e una politica per instradare i pacchetti contrassegnati utilizzando quella tabella e fare in modo che iptables / netfilter contrassegnino determinati pacchetti.

Crea una tabella: echo 1 known >> /etc/iproute2/rt_tables

Crea una regola di routing (il ipcomando proviene da iproute2 ): ip rule add from all fwmark 1 table known

Abbiamo creato una tabella chiamata "noto" e creato una regola di routing che dice che qualsiasi pacchetto con un segno uguale a 1 viene instradato secondo la tabella "noto". L'ho chiamato noto solo perché è per l'elenco di protocolli noti: puoi nominarlo come vuoi. Ora impostiamo la tabella nota per instradare nel modo corretto.

ip route add default dev eth0 table known

Crea regole 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'esempio contrassegna i pacchetti sulle porte NFS (111, 2049) con un 1. Stiamo aggiungendo questa regola all'iptable 'mangle'. Questo è diverso dalle tabelle di routing e non è modificabile; la tabella mangle è specifica per alterare i pacchetti in modo diverso da NAT.

Ora, per instradare tutto il resto attraverso l'altra interfaccia, aggiungiamo un percorso alla tabella di routing standard.

ip route add default dev eth1

Per capirlo davvero, leggi le sezioni 4 e 11 dell'HOWC di LARTC .


Beh, in realtà è molto più semplice di quanto avessi temuto. Lo stack di rete di Linux è davvero una bella bestia, vero ?! Ho fatto questo test rapido e tutto sembra funzionare come previsto. Sto monitorando ogni interfaccia tramite iftope stanno mostrando il giusto tipo di traffico. Grazie mille.
Oli,

Non so come iptables o iproute2 memorizzino la loro configurazione. Devo disattivare queste regole ad ogni avvio?
Oli,

@Oli Vengono cancellati al riavvio. È possibile salvare e ripristinare le regole con iptables-savee iptables-restore. Se si utilizza NetworkManager, è possibile impostare gli script dispatcher per automatizzare il processo. Sfortunatamente, la pagina NM ufficiale non ha documentazione sulla funzionalità, ma la documentazione di Ubuntu e Arch Linux la menziona entrambe.
Shawn J. Goff,

5

Bene, il modo " più semplice " dovrebbe essere quello di istruire i singoli programmi a utilizzare un'interfaccia specifica (o l'ip dell'interfaccia. Ad esempio:

ping -I eth1 8.8.8.8

indica a ping di usare eth1 come interfaccia sorgente, mentre

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

indica a wget di passare attraverso l'interfaccia che ha 10.0.0.1come indirizzo IP.

Onestamente non so se sia possibile con tutti i programmi di cui hai bisogno, ma è un inizio per tagliare le regole per cui devi scrivere iptablese i iprouteprogrammi.

Per iniziare, dovresti leggere questo tutorial su più connessioni Internet . Una buona lettura è anche una delle migliaia di tutorial su iptables, specialmente su outbound filtering, process/ pid filteringe port filtering.


4

Il modo corretto per farlo è legare () all'interfaccia che si desidera utilizzare per i pacchetti in uscita. Poiché è quindi possibile impostare percorsi con i comandi ip routee ip ruleper controllare il modo in cui i pacchetti vengono instradati in base alla loro interfaccia in uscita. Per il mio esempio, assumerò la seguente rete:

  • eth0:
    • Indirizzo: 192.168.0.2/24
    • Gateway predefinito: 192.168.0.1
  • eth1:
    • Indirizzo: 192.168.1.2/24
    • Gateway predefinito: 192.168.1.1

Creerò due tabelle di routing, una per il traffico in uscita per eth0 chiamato alternate e una tabella per eth1 chiamata main. La tabella principale di routing esiste sempre ed è la tabella normale utilizzata dai comandi routee ip route. La maggior parte delle persone non ha mai a che fare con nessun altro tavolo. Per creare la tabella denominata alternativa, aggiungeremo la seguente riga a /etc/iproute2/rt_tables:

10    alternate

La tabella principale ha una priorità predefinita di 254. Le regole per le quali è attiva la tabella di routing sono controllate dal ip rulecomando. Per impostazione predefinita, quel comando stamperà un elenco di regole esistenti che dovrebbero assomigliare a questo:

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

Questo in pratica dice che cercherà una route nella tabella localche è una tabella speciale gestita dal kernel per route locali come il mio indirizzo IP. Quindi proverà la tabella principale e la tabella predefinita. Il valore predefinito della tabella è normalmente vuoto, quindi se non esiste alcuna corrispondenza in main, non esiste alcun percorso verso l'host. Innanzitutto, lascia che la tabella di riempimento si alterni con le regole per 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

Normalmente vorrai che la alternatetabella sia simile alla maintabella. Le uniche differenze sono quando il routing dovrebbe essere diverso. È possibile che non si desideri includere la seconda riga sopra se si desidera letteralmente che tutto il traffico NFS, HTTP, ecc. Passi attraverso il gateway predefinito su eth0 anche se è destinato alla rete su eth1. Il prossimo passo è aggiungere una regola per quando usare questa tabella di routing alternativa:

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

Questa regola dice che tutto il traffico proveniente da un indirizzo sulla rete 192.168.0 utilizzerà la alternatetabella di routing invece della maintabella normale . L'ultimo passaggio è assicurarsi che tutti i client che devono utilizzare si eth0associno ad esso. Con wget, ad esempio, impostato --bind-address=192.168.0.2, per NFS impostare ilclientaddr=192.168.0.2opzione di montaggio. Se si utilizza LibWWW con Perl, è possibile impostare l'opzione localaddr in LWP :: UserAgent per controllare l'interfaccia locale a cui si lega. Se ti capita di avere un client che non riesci a controllare l'associazione e la compilazione dell'origine non è un'opzione, potresti essere in grado di usare una regola iptables per modificare il suo indirizzo, ma questo è più un hack e potrebbe non funzionare. Avresti bisogno di una regola SNAT impostata nella catena PREROUTING della tabella nat o della tabella mangle. Per funzionare, avrai comunque bisogno delle tabelle di routing modificate indicate sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.