Erlaube nur bestimmten ausgehenden Verkehr auf bestimmten Schnittstellen

15

Ich habe eher ein seltsames Problem. Ich habe einen Server mit zwei Netzwerkschnittstellen eth0und eth1. Jeder ist mit einem anderen Netzwerk verbunden. Jedes Netzwerk verfügt über ein Internet-Gateway. Der Server verfügt über verschiedene ausgehende Verbindungen: http (einige Skripte auf den Server Scrape-Websites), NFS-Client, Samba-Client, DNS-Client und ein E-Mail-Abrufprogramm, um nur einige zu nennen.

Aus Gründen, auf die ich nicht eingehen möchte, muss ich diese ausgehenden Clients so aufteilen, dass ausgehender http-, nfs-, samba- und dns-Verkehr nur angefordert wird, eth0während alles andere durchgeht eth1.

Ich habe ein paar Google-Suchanfragen gelesen und es sieht so aus, iptablesals würde ich es brauchen, aber ich habe wirklich keine Ahnung. Ich bin nur daran gewöhnt, eingehende Firewall-Regeln zu verwalten ufw.

Könnte mich jemand mit ein paar Beispielregeln beginnen und mir sagen, wie ich das System dazu bringen kann, diese Regeln beim Booten zu übernehmen? Idealerweise ohne mich von meiner SSH-Verbindung auszuschließen (ich kann physischen Zugang bekommen, aber ich möchte lieber nicht).

Bearbeiten Ich kann die Clients auf zwei Benutzer aufteilen, wenn es möglich ist, den gesamten ausgehenden Datenverkehr von einem Konto auf eine Benutzeroberfläche zu beschränken. Auf dem Papier scheint es vielleicht einfacher zu sein.

Oli
quelle

Antworten:

12

Ich würde eine separate Routingtabelle und eine Richtlinie einrichten, um markierte Pakete mithilfe dieser Tabelle weiterzuleiten und iptables / netfilter bestimmte Pakete markieren zu lassen.

Erstellen Sie eine Tabelle: echo 1 known >> /etc/iproute2/rt_tables

Erstellen Sie eine Routing-Regel (der ipBefehl stammt von iproute2 ): ip rule add from all fwmark 1 table known

Wir haben eine Tabelle mit dem Namen "known" erstellt und eine Routing-Regel erstellt, die besagt, dass jedes Paket mit einer Markierung von 1 gemäß der Tabelle "known" geroutet wird. Ich habe es nur bekannt genannt, weil es für die Liste der bekannten Protokolle ist - Sie können es benennen, was Sie wollen. Nun richten wir die bekannte Tabelle ein, um den richtigen Weg zu finden.

ip route add default dev eth0 table known

Iptables-Regeln erstellen:

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

In diesem Beispiel werden Pakete an den NFS-Ports (111, 2049) mit einer 1 gekennzeichnet. Diese Regel wird der Tabelle 'mangle' hinzugefügt. Dies unterscheidet sich von den Routingtabellen und kann nicht geändert werden. Die Mangle-Tabelle dient speziell dazu, Pakete auf eine andere Weise als NAT zu ändern.

Um alles andere über die andere Schnittstelle zu routen, fügen wir der Standardroutingtabelle eine Route hinzu.

ip route add default dev eth1

Um dies wirklich zu verstehen, lesen Sie die Abschnitte 4 und 11 des LARTC-Howto .

Shawn J. Goff
quelle
Naja das ist eigentlich viel einfacher als ich befürchtet hatte. Der Linux Networking Stack ist wirklich ein schönes Biest, oder ?! Ich habe dies kurz getestet und alles scheint wie erwartet zu funktionieren. Ich überwache jede Schnittstelle über iftopund sie zeigen jeweils die richtige Art von Verkehr. Ich danke dir sehr.
Oli
Ich weiß nicht, wie iptables oder iproute2 ihre Konfiguration speichern. Muss ich diese Regeln bei jedem Booten abfeuern?
Oli
@Oli Sie werden beim Neustart gelöscht. Sie können die Regeln mit iptables-saveund speichern und wiederherstellen iptables-restore. Wenn Sie NetworkManager verwenden, können Sie Dispatcher-Skripts einrichten, um den Prozess zu automatisieren. Leider enthält die offizielle NM-Seite keine Dokumentation zu dieser Funktion, aber die Dokumentation zu Ubuntu und Arch Linux erwähnt sie beide.
Shawn J. Goff
5

Nun, der " einfachste " Weg sollte sein, die einzelnen Programme anzuweisen, eine bestimmte Schnittstelle (oder die IP-Adresse der Schnittstelle) zu verwenden. Zum Beispiel:

ping -I eth1 8.8.8.8

weist ping an, eth1 als Quellschnittstelle zu verwenden, während

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

Weist wget an , die Schnittstelle zu durchlaufen , die 10.0.0.1eine IP-Adresse hat.

Ehrlich gesagt weiß ich nicht, ob es mit allen Programmen, die Sie benötigen, möglich ist , aber es ist ein Anfang, die Regeln, für iptablesdie Sie schreiben müssen, und die iprouteProgramme zu reduzieren.

Zu Beginn sollten Sie dieses Tutorial über mehrere Internetverbindungen lesen . Eine gute Lektüre ist auch eine der Tausenden von Tutorials zu iptables, insbesondere zu outbound filtering, process/ pid filteringund port filtering.

Herr Shunz
quelle
4

Der richtige Weg dazu ist, bind () an die Schnittstelle, die Sie für ausgehende Pakete verwenden möchten. Da Sie dann Routen mit den Befehlen ip routeund einrichten ip rulekönnen, um zu steuern, wie Pakete basierend auf ihrer ausgehenden Schnittstelle weitergeleitet werden. Für mein Beispiel gehe ich von folgendem Netzwerk aus:

  • eth0:
    • Adresse: 192.168.0.2/24
    • Standardgateway: 192.168.0.1
  • eth1:
    • Adresse: 192.168.1.2/24
    • Standardgateway: 192.168.1.1

Ich werde zwei Routing-Tabellen erstellen, eine für ausgehenden Datenverkehr für eth0 mit dem Namen alternate und eine für eth1 mit dem Namen main. Die Routing-Tabelle main ist immer vorhanden und die normale Tabelle, die von den Befehlen routeund verwendet wird ip route. Die meisten Leute beschäftigen sich nie mit anderen Tabellen. Um die Tabelle mit dem Namen alternate zu erstellen, fügen wir die folgende Zeile hinzu /etc/iproute2/rt_tables:

10    alternate

Die Standardpriorität der Tabelle main ist 254. Die Regeln, für die die Routing-Tabelle gilt, werden vom ip ruleBefehl gesteuert . Standardmäßig druckt dieser Befehl eine Liste der vorhandenen Regeln aus, die ungefähr so ​​aussehen sollten:

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

Dies bedeutet im Grunde, dass nach einer Route in der Tabelle localgesucht wird, die eine spezielle Tabelle ist, die vom Kernel für lokale Routen wie z. B. meine eigene IP-Adresse verwaltet wird. Dann werden table main und table default ausprobiert. Die Tabellenvorgabe ist normalerweise leer. Wenn also keine Übereinstimmung in main vorliegt, gibt es keine Route zum Host. Lassen Sie uns zunächst die Tabelle abwechselnd mit den Regeln für eth0 füllen.

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

Normalerweise soll die alternateTabelle ähnlich wie die mainTabelle aussehen . Die einzigen Unterschiede bestehen darin, dass das Routing unterschiedlich sein sollte. Möglicherweise möchten Sie die zweite Zeile oben nicht einfügen, wenn der gesamte NFS-, HTTP- usw. Datenverkehr über das Standardgateway auf eth0 geleitet werden soll, auch wenn er für das Netzwerk auf eth1 bestimmt ist. Im nächsten Schritt fügen Sie eine Regel hinzu, wann diese alternative Routingtabelle verwendet werden soll:

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

Diese Regel besagt, dass jeder Datenverkehr, der von einer Adresse im 192.168.0-Netzwerk kommt, die alternateRouting-Tabelle anstelle der normalen mainTabelle verwendet. Der letzte Schritt besteht darin, sicherzustellen, dass alle Clients, die eth0bind verwenden müssen, daran gebunden sind. Mit setzen Sie wgetzum Beispiel --bind-address=192.168.0.2für NFS dasclientaddr=192.168.0.2Mount-Option. Wenn Sie LibWWW mit Perl verwenden, können Sie die Option localaddr in LWP :: UserAgent festlegen, um die lokale Schnittstelle zu steuern, an die es gebunden ist. Wenn Sie zufällig einen Client haben, den Sie nicht steuern können, können Sie möglicherweise mithilfe einer iptables-Regel die Adresse ändern. Dies ist jedoch eher ein Hack und funktioniert möglicherweise nicht. Sie benötigen eine SNAT-Regel, die in der PREROUTING-Kette der nat-Tabelle oder der mangle-Tabelle eingerichtet ist. Sie benötigen weiterhin die oben angegebenen geänderten Routingtabellen, damit dies funktioniert.

penguin359
quelle