Sonntag, 1. November 2009

Policy Based Routing mit Juniper SRX Firewalls

Eine häufig nachgefragte Funktionalität ist jene, dass bestimmte Daten, bestimmte Protokolle anders geroutet werden sollen als der Rest. Speziell in der Welt der ScreenOS basierten Firwalls hat sich hierfür der Begriff Policy Based Routing (PBR) etabliert. In ScreenOS gibt es hierfür ganz konkrete Befehle innerhalb des Virtual Router Kontextes.

Umsteiger auf JUNOS suchen erst einmal vergeblich nach einem Pendant. Erst einmal womöglich erfolglos. Denn in JUNOS gibt es keine konkreten Befehle für PBR. Vielmehr kann man das allgemeine Konzept der Firewall Filter, das wir so einsetzen können, dass das gewünschte Resultat dabei herausschaut.

Nehmen wir einmal folgendes Szenario: Eine SRX Firewall ist an zwei Internet Service Provider angeschlossen. Der Web Traffic des Webservers soll über Provider B geroutet werden, aller anderer Verkehr über Provider A.



Der eingehende Traffic muss nicht speziell behandelt werden. Das zu ISP B zugewandte Interface mit auf die passende IP-Adresse konfiguriert und es wird eine Destination NAT Regel angelegt. Jedoch: Die Antwort-Pakete des Webservers würden über ISP A hinausgeleitet. Grund ist: Die Default-Route 0.0.0.0/0 verweist mit besserer Metrik auf ISP A. Wir hätten also die Situation des asymetrischen Routings. Um dies zu beheben gehen wir wie folgt vor:

Als erstes brauchen wir eine zusätzliche Routing-Instanz die eine Default-Route zu ISP B enthält:

set routing-instances HTTP-Redirect instance-type forwarding
set routing-instances HTTP-Redirect routing-options static route 0.0.0.0/0 next-hop 2.1.1.1

Als zweites erstellen wir einen Firewall Filter der bewirkt, dass unser gewünschter Verkehr in diese Routing Instanz "umgeleitet" wird.

set firewall family inet filter HTTP-Redirect-Filter term term1 from source-address 192.168.1.10/32
set firewall family inet filter HTTP-Redirect-Filter term term1 from destination-port http
set firewall family inet filter HTTP-Redirect-Filter term term1 then routing-instance HTTP-Redirect
set firewall family inet filter HTTP-Redirect-Filter term term2 then accept

Dabei unterstellen wir, dass 192.168.1.10 die IP-Adresse unseres Webservers ist. Als nächstes müssen wir den Filter an das Interface binden, an das der Webserver angeschlossen ist. In unserem Beispiel ist das ge-0/0/2.0:

set interfaces ge-0/0/2 unit 0 family inet filter input HTTP-Redirect-Filter

Jedoch ist dies noch nicht genug: Das Problem hierbei liegt daran, dass die Router in der Routing-Tabelle aus unserer neuen Instanz nicht aktiv wird. Es fehlen nämlich die lokalen und die direkten Routers die normalerweise durch das Setzten der IP-Adresse erzeugt werden. Z.B. hat unser Interface zu ISP B die IP-Adresse 2.1.1.2/24. Dadurch wird automatisch die Route 2.1.1.2/32 und die Route 2.1.1.0/24 erzeugt. Beide sind Voraussetzungen dafür, dass eine Route mit Next Hop 2.1.1.1 überhaupt aktiv werden kann.

Zur Lösung gibt es in JUNOS dafür das Konzept der RIB Gruppe. Konkret kopieren wir die direkten und lokalen Routes von der Standard-Routingtabelle inet.0 in unsere Instanz.

set routing-options interface-routes rib-group inet MyRIB-Group
set routing-options rib-groups MyRIB-Group import-rib inet.0
set routing-options rib-groups MyRIB-Group import-rib HTTP-Redirect.inet.0

Die erste Routing-Tabelle ist immer die Quelle, die zweite das Ziel.

Mit Hilfe dieses technischen Konstrukts können wir die Routing Tabelle korrekt befüllen und haben alle notwendigen Arbeiten für das PBR abgeschlossen.

Im Firewall Filter könnte man weitere Bedingungen in der from Klausel unterbringen und damit unter Umständen noch aufwendigere Szenarien zu realisieren.