Zone-based Firewall-Konfiguration im Cisco IOS

In die IOS-Version 12.4.(6)T wurde eine neue Möglichkeit der Firewall-Konfiguration eingebaut, die Zonen-basierte Konfiguration. Diese Konfiguration erinnert dabei mehr an die Konfiguration der PIXv7 und ist auch angelehnt an die QoS-Konfiguration im IOS.

Funktion dieses Features:

Alle beteiligten Interfaces werden den konfigurierten Zoenen zugewiesen. Wenn mehrere Interfaces in einer Zone sind kann zwischen diesen Netzen ohne Einschränkung kommuniziert werden. Traffic zwsichen unterschiedlichen Zonen ist standardmäßig verboten und muß explizit erlaubt werden.

Der Beispiel-Router:

Für dieses recht einfache Beispiel habe ich einen Cisco 1802W verwendet, der zwei interne Interfaces (Vlan1, Dot11Radio0) und ein externes Interface zum Internet (Dialer0) hat.


KI-R#sh ver
Cisco IOS Software, C180X Software (C180X-ADVIPSERVICESK9-M), Version 12.4(9)T

Die Anforderung:

Zwischen den zwei internen Interfacen soll frei kommuniziert werden können, der gesamte Traffic ins Internet soll per statefull Inspection überprüft werden, kein Traffic soll vom Internet in das interne LAN gelassen werden. Im letzten Schritt wird noch ein WAN-Interface hinzugefügt.

Die Konfiguration:

Anlegen der Zonen. In diesem Beispiel werden zwei Zonen benötigt, Intern und Extern:


KI-R(config)#zone ?
 security  Security zone

KI-R(config)#zone security ?
 WORD  Name of security zone

KI-R(config)#zone security Extern
KI-R(config-sec-zone)#?
Zone configuration commands:
 description  Zone description
 exit         Exit from zone configuration mode
 no           Negate or set default values of a command

KI-R(config-sec-zone)#description All Interfaces facing to the Internet
KI-R(config-sec-zone)#zone security Intern
KI-R(config-sec-zone)#description All Interfaces facing to the internal LAN
KI-R(config-sec-zone)#exit

Die Interface werden in einem späteren Schritt den Zonen zugewiesen.

Die Zonen, die miteinander kommunizieren sollen werden zu Zonen-Paaren verbunden. Es müssen immer nur Zonen-Paare für die initiierenden Verbindungen konfiguriert werden, der Rückweg wird von der Statefull Inspection automatisch erlaubt


KI-R(config)#zone-pair ?
 security  Zone-pair name

KI-R(config)#zone-pair security ?
 WORD  Name of zone-pair

KI-R(config)#zone-pair security Intern-Extern ?
 source  Source zone
KI-R(config)#zone-pair security Intern-Extern source ?
 WORD  Name of source zone
 self    Self zone

KI-R(config)#zone-pair security Intern-Extern source Intern ?
 destination  Destination zone

KI-R(config)#zone-pair security Intern-Extern source Intern destination Extern
KI-R(config-sec-zone-pair)#?
 Zone configuration commands:
 description     Zone description
 exit            Exit from zone pair configuration mode
 no              Negate or set default values of a command
 service-policy  Configure CBAC Service Policy

KI-R(config-sec-zone-pair)#
KI-R(config-sec-zone-pair)#description Access from internal LAN to Internet
KI-R(config-sec-zone-pair)#exit

Hierbei wurde also ein Zonenpaar konfiguriert, bei dem der Traffic in der Zone Intern initiiert wird und in die Zone Extern gesendet wird. Man sieht auch, daß die einzige Funktion im Zonen-Paar eine Service-Policy ist, diese muß aber später erst noch konfiguriert werden.

Als nächstes wird bestimmt welche Interfaces zu welcher Zone gehören:


KI-R(config)#interface vlan 1
KI-R(config-if)#zone-member ?
 security  Security zone

KI-R(config-if)#zone-member security ?
 WORD  Name of zone defined

KI-R(config-if)#zone-member security Intern
KI-R(config-if)#interface dot11Radio 0
KI-R(config-if)#zone-member security Intern
KI-R(config-if)#
KI-R(config-if)#int dialer 0
KI-R(config-if)#zone-member security Extern

Die Interfaces Vlan1 und Dot11Radio0 gehören jetzt also zu einer gemeinsamen Zone und sollten miteinander kommunizieren können:


C:Documents and SettingsKarsten>ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection 2:

Connection-specific DNS Suffix  . : iwen.local
IP Address. . . . . . . . . . . . : 10.255.255.131
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.255.255.1

C:Documents and SettingsKarsten>ping 10.255.254.151

Pinging 10.255.254.151 with 32 bytes of data:

Reply from 10.255.254.151: bytes=32 time=65ms TTL=127
Reply from 10.255.254.151: bytes=32 time=85ms TTL=127
Reply from 10.255.254.151: bytes=32 time=110ms TTL=127
Reply from 10.255.254.151: bytes=32 time=133ms TTL=127

Ping statistics for 10.255.254.151:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 65ms, Maximum = 133ms, Average = 98ms

Der PC 10.255.255.131 steht im Netz Vlan1, der PC 10.255.254.151 im wireless LAN hinter dem Interface Dot11Radio0. Die PCs können sich also erreichen.

Von Intern nach Extern soll natürlich auch kommuniziert werden können:


C:Documents and SettingsKarsten>ping 217.160.219.88

Pinging 217.160.219.88 with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 217.160.219.88:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:Documents and SettingsKarsten>

Erwartungsgemäß geht das noch nicht, da Traffic zwischen den Zonen exlizit erlaubt werden muß. Dafür wird also eine Policy geschrieben. Bei dieser darf das Netz 10.255.252.0/22 auf das Internet zugreifen. Dieses Netz wird in einer Class-Map vom Typ inspect konfiguriert; die für die Firewall-Konfiguration neu eingeführt wurden:


KI-R(config)#ip access-list sta InternalNetworks
KI-R(config-std-nacl)#permit 10.255.252.0 0.0.3.255
KI-R(config-std-nacl)#exit
KI-R(config)#class-map type inspect AnyInternalTraffic
KI-R(config-cmap)#match access-group name InternalNetworks
KI-R(config-cmap)#
KI-R(config-cmap)#exit

Ähnlich wie im MQC (Modular QoS CLI) wird diese Klasse in einer Policy-Map verwendet und mit einer Funktion versehen. Auch diese Policy-Map ist vom Typ inspect:


KI-R(config)#policy-map type inspect Intern-Extern
KI-R(config-pmap)#?
 Policy-map configuration commands:
 class        policy criteria
 description  Policy-Map description
 exit         Exit from policy-map configuration mode
 no           Negate or set default values of a command
 rename       Rename this policy-map

KI-R(config-pmap)#class ?
 WORD            class-map name
 class-default   System default class matching otherwise unclassified packets
 type            type of the class-map

KI-R(config-pmap)#class type inspect AnyInternalTraffic
KI-R(config-pmap-c)#?
 Policy-map class configuration commands:
 drop            Drop the packet
 exit            Exit from class action configuration mode
 inspect         Context-based Access Control Engine
 no              Negate or set default values of a command
 pass            Pass the packet
 police          Police
 service-policy  Deep Packet Inspection Engine
 urlfilter       URL Filtering Engine

Im letzten Punkt ist zu sehen was mit dem in der Class-Map beschriebenen Traffic gemacht werden kann:

  • drop: Der beschriebene Traffic wird verworfen. Das ist auch das Standardverhalten für Traffic, der nicht weiter in einer Class-Map beschrieben ist.
  • inspect: Die Stateful Inspection wird angewendet, also das, was auch schon im CBAC (Context Based Access Control) gemacht wurde.
  • pass: Der beschriebene Traffic wird einfach ohne weitere Behandlung durchgelassen.
  • police: Die Datenrate des Traffics wird auf einen konfigurierten Wert begrenzt.
  • service-policy: Eine Inspizierung bin in den Layer7 wird für den in der Class-Map beschriebenen Traffic konfiguriert (Application-Firewall).
  • urlfilter: Ein URL-filtering Server (z.B. Wensense oder N2H2) wird abgefragt, ob die vom User angeforderte URL erlaubt ist.

Für dieses Beispiel soll der Traffic einfach inspiziert werden:


KI-R(config-pmap-c)#inspect
%No specific protocol configured in class AnyInternalTraffic for inspection.
All protocols will be inspected

KI-R(config-pmap-c)#exit
KI-R(config-pmap)#exit
KI-R(config)#

Diese Service-Policy wird jetzt in dem konfigurierten Zonen-Paar verwendet:


KI-R(config)#zone-pair security Intern-Extern
KI-R(config-sec-zone-pair)#service-policy ?
 type  Service Policy type

KI-R(config-sec-zone-pair)#service-policy type ?
 inspect  Configure CBAC Service Policy type inspect

KI-R(config-sec-zone-pair)#service-policy type inspect ?
 WORD  policy-map name

KI-R(config-sec-zone-pair)#service-policy type inspect Intern-Extern
KI-R(config-sec-zone-pair)#exit
KI-R(config)#

Die erzeugte Konfiguration sieht jetzt folgendermaßen aus:


!
class-map type inspect match-all AnyInternalTraffic
 match access-group name InternalNetworks
!
policy-map type inspect Intern-Extern
 class type inspect AnyInternalTraffic
  inspect
class class-default
!
zone security Intern
 description All Interfaces facing to the internal LAN
zone security Extern
 description All Interfaces facing to the Internet
zone-pair security Intern-Extern source Intern destination Extern
 description Access from internal LAN to Internet
 service-policy type inspect Intern-Extern
!
interface Dot11Radio0
 zone-member security Intern
!
interface Vlan1
 zone-member security Intern
!
interface Dialer0
 zone-member security Extern
!
ip access-list standard InternalNetworks
 permit 10.255.252.0 0.0.3.255

Ein paar show-Befehle um die Konfiguration zu analysieren:

  • Anzeigen der Zonen:
    
    KI-R#show zone security
     zone self
     Description: System defined zone
    
    zone Intern
     Description: All Interfaces facing to the internal LAN
     Member Interfaces:
      Vlan1
      Dot11Radio0
      Virtual-Dot11Radio1
    
    zone Extern
     Description: All Interfaces facing to the Internet
     Member Interfaces:
      Dialer0
    
    KI-R#
    
  • die Zonen-Paare:
    
    KI-R#show zone-pair security
     Zone-pair name Intern-Extern
     Description: Access from internal LAN to Internet
     Source-Zone Intern  Destination-Zone Extern
     service-policy Intern-Extern
    
    KI-R#
    
  • die Class-Map:
    
    KI-R#show class-map type inspect
    Class Map type inspect match-all AnyInternalTraffic (id 5)
     Match access-group name InternalNetworks
    
    KI-R#
    
  • die Policy-Map:
    
    KI-R#show policy-map type inspect
     Policy Map type inspect Intern-Extern
      Class AnyInternalTraffic
       Inspect
      Class class-default
    
    KI-R#
    

Ein Test der Verbindung ins Internet:


C:Documents and SettingsKarsten>ping security-planet.de

Pinging security-planet.de [217.160.219.88] with 32 bytes of data:

Reply from 217.160.219.88: bytes=32 time=35ms TTL=54
Reply from 217.160.219.88: bytes=32 time=34ms TTL=54
Reply from 217.160.219.88: bytes=32 time=35ms TTL=54
Reply from 217.160.219.88: bytes=32 time=34ms TTL=54

Ping statistics for 217.160.219.88:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 34ms, Maximum = 35ms, Average = 34ms

Jetzt kann aus der internen Zone in die externe Zone kommuniziert werden, die Antwortpakete kommen dank statefull Inspection zurück.

Natürlich kann man sich auch anschauen was die Firewall so gemacht hat (davor habe ich noch ein wenig mehr Traffic erzeugt):


KI-R#show policy-map type inspect zone-pair
Zone-pair: Intern-Extern

Service-policy inspect : Intern-Extern

Class-map: AnyInternalTraffic (match-all)
Match: access-group name InternalNetworks
Inspect
Packet inspection statistics [process switch:fast switch]
tcp packets: [54:679]
udp packets: [46:154]
icmp packets: [0:24]
smtp packets: [0:160]
dns packets: [14:0]

Session creations since subsystem startup or last reset 136
Current session counts (estab/half-open/terminating) [1:0:0]
Maxever session counts (estab/half-open/terminating) [37:25:1]
Last session created 00:00:22
Last statistic reset never
Last session creation rate 2
Last half-open session total 0

Class-map: class-default (match-any)
Match: any
Drop (default action)
1407 packets, 45481 bytes
KI-R#

Testweise soll der Router aus dem Internet heraus angesprochen werden:


KI-R#sh ip int brief | i Dialer0
Dialer0                    87.122.158.202  YES IPCP   up               up

karsten@urania:~$ ping 87.122.158.202
PING 87.122.158.202 (87.122.158.202): 56 data bytes
64 bytes from 87.122.158.202: icmp_seq=0 ttl=246 time=36.6 ms
64 bytes from 87.122.158.202: icmp_seq=1 ttl=246 time=34.8 ms
64 bytes from 87.122.158.202: icmp_seq=2 ttl=246 time=34.3 ms
64 bytes from 87.122.158.202: icmp_seq=3 ttl=246 time=34.2 ms

--- 87.122.158.202 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 34.2/34.9/36.6 ms
karsten@urania:~$

Man sieht, daß der Router vom Internet aus erreichbar ist. Die bisherigen Konfiguration bezog sich nur auf Traffic, der zwischen den Zonen läuft, und auf dem externen Interface (Dialer0) befindet sich keine ACL:


KI-R#show ip access-lists interface dialer 0

KI-R#

ACLs werden in dieser Konfiguration vor dem inter-Zonen-Traffic verarbeitet, daher können ACLs nicht mehr wie beim “ip inspect” angewendet werden. Für die Kontrolle des Traffics vom oder zum Router gibt es die Zone “self”, für die auch Policies konfiguriert werden können.


KI-R(config)#ip access-list extended Extern2Router
KI-R(config-ext-nacl)#permit esp any any
KI-R(config-ext-nacl)#permit udp any any eq isakmp non500-isakmp
KI-R(config-ext-nacl)#permit tcp any any eq 22
KI-R(config-ext-nacl)#exit
KI-R(config)#

KI-R(config)#class-map type inspect RouterTraffic
KI-R(config-cmap)#match access-group name Extern2Router
KI-R(config-cmap)#exit

KI-R(config)#policy-map type inspect RouterTraffic
KI-R(config-pmap)#class type inspect RouterTraffic
KI-R(config-pmap-c)#inspect

In der Access-List wird der Traffic für IPSec-VPNs und SSH erlaubt. Diese ACL wird in eine Class-Map eingebunden, diese wird widerum in einer Policy-Map eingebunden. Wie vorher auch schon wird die Policy-Map also Service-Policy auf ein Zonen-Paar angewendet:


KI-R(config)#zone-pair security Extern-Router source Extern destination self
KI-R(config-sec-zone-pair)#service-policy type inspect RouterTraffic
KI-R(config-sec-zone-pair)#

Dieses neue Zonen-Paar hat als Sourse die Zone Extern, die Destionation ist “self”, das ist der Router selbst.

Ein erneuter Ping-Test zeigt, daß jetzt der Traffic nicht mehr von dem Router verarbeitet wird:


karsten@urania:~$ ping 87.122.158.202
PING 87.122.158.202 (87.122.158.202): 56 data bytes

--- 87.122.158.202 ping statistics ---
6 packets transmitted, 0 packets received, 100% packet loss
karsten@urania:~$

Bedingt durch diese Einschränkung werden Antwortpakete für Traffic, der vom Router selbst initiiert ist, auch verworfen. Wir benötigen also noch eine Policy, in der der Traffic vom Router ins Internet inspiziert wird um die Antwortpakete zu erlauben. Auch das geht wieder mit der Zone “self”, die diesmal aber als Source auftaucht:


KI-R(config)#policy-map type inspect Router2Extern
KI-R(config-pmap)#class class-default
KI-R(config-pmap-c)#inspect
KI-R(config-pmap-c)#exit
KI-R(config-pmap)#exit

KI-R(config)#zone-pair security Router-Extern source self destination Extern
KI-R(config-sec-zone-pair)#service-policy type inspect Router2Extern
KI-R(config-sec-zone-pair)#^Z
KI-R#

Ein erneuter Test zeigt, daß der ausgehende Ping jetzt funktioniert:


KI-R#ping 217.160.219.88

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 217.160.219.88, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 32/34/36 ms
KI-R#

Und so sieht die gesamte Konfig jetzt aus:


class-map type inspect match-all AnyInternalTraffic
 match access-group name InternalNetworks
class-map type inspect match-all RouterTraffic
 match access-group name RouterTraffic
!
policy-map type inspect Router2Extern
 class class-default
  inspect
policy-map type inspect Intern-Extern
 class type inspect AnyInternalTraffic
  inspect
class class-default
policy-map type inspect RouterTraffic
 class type inspect RouterTraffic
  inspect
class class-default
!
zone security Intern
 description All Interfaces facing to the internal LAN
zone security Extern
 description All Interfaces facing to the Internet
zone-pair security Intern-Extern source Intern destination Extern
 description Access from internal LAN to Internet
 service-policy type inspect Intern-Extern
zone-pair security Extern-Router source Extern destination self
 description Access from Internet to Router
 service-policy type inspect RouterTraffic
zone-pair security Router-Extern source self destination Extern
 description Traffic from Router to Internet
 service-policy type inspect Router2Extern
!
interface Dot11Radio0
 zone-member security Intern
!
interface Vlan1
 zone-member security Intern
!
interface Dialer0
 zone-member security Extern
!
ip access-list standard InternalNetworks
 permit 10.255.252.0 0.0.3.255
ip access-list extended Extern2Router
 permit esp any any
 permit udp any any eq isakmp non500-isakmp
 permit tcp any any eq 22

Jetzt soll die Konfig noch um ein WAN-Interface erweitert werden. Vom internen LAN zum WAN soll der gesamte Traffic erlaubt und inspiziert werden, aus dem WAN ins interne LAN nur ICMP, HTTP(S) und HTTP zum Cisco Secure ACS:

Die zusätzliche Zone:


zone WAN
 Description: Interface to LAB ans SI
 Member Interfaces:
  Tunnel10

Die Class-Map und ACL für den ACS-Traffic:


class-map type inspect match-all ICMP-Traffic
 match protocol icmp
class-map type inspect match-any HTTP-Traffic
 match protocol http
 match protocol https
 match access-group name ACS-Traffic

ip access-list extended ACS-Traffic
 permit tcp any host 10.255.255.12 eq 2002
 permit tcp any host 10.255.255.12 range 4444 4455

Die Policy-Map:


policy-map type inspect WAN2Intern
 class type inspect HTTP-Traffic
  inspect
 class type inspect ICMP-Traffic
  inspect
 class class-default
policy-map type inspect Intern2WAN
 class class-default
  inspect

Die Zonen-Paare:


zone-pair security Internal2WAN source Intern destination WAN
 description Access internal Networks to WAN (Lab/SI)
 service-policy type inspect Intern2WAN
zone-pair security WAN2Intern source WAN destination Intern
 description Access from Lab/SI to internal Network
 service-policy type inspect WAN2Intern

Insgesammt ist diese Art der Konfiguration sehr leistungsfähig. In diesem Beispiel war die Konfiguration dabei noch recht übersichtlich, da die Inspections sehr allgemein gehalten waren. In einem späteren Beispiel werde ich das nochmal verfeinern. Weiterhin sollte eine EasyVPN-Config auf virtuelle Tunnel-Interface umgestellt werden, damit diese auch einer Zone hinzugefügt werden können.
Noch nicht so leistungsfähig wie beim “ip inspect” sind die debug-Fähigkeiten. Da ist vermutlich etliches noch nicht fertig implementiert. Ich warte daher auf die nächsten neuen T-Releases und hoffe, daß dieses Feature weiter ausgebaut wird.

5 Replies to “Zone-based Firewall-Konfiguration im Cisco IOS”

  1. Hallo Karsten,

    kennst Du eine Lektüre die das Thema IOS Firewall ausführlicher behandelt. Alles was ich dazu bisher finden konnte, waren ehr Bücher bzw. Onlineartikel die das Thema in einem Nebenkapitel oder nur sehr oberflächlich mit 2-3 Seiten anriss. Leider scheint das Thema ehr nebenbei von Cisco behandelt zu werden.
    Zwei Fragen die sich mir vor kurzdem dazu gestellt haben:
    Als Beispiel empfielt Cisco für die IOS Zone-Based Firewall mittels ACLs nur noch IP Adressen zu filtern und zum filtern nach Protokollen/Ports auf die “match protocol” Funktion in der class-map zurückzugreifen. Wie sieht die Empfehlung diesbezüglich aus, wenn viele nicht-standart Ports mit herstellereigenen Protokollen ins Spiel kommen (z.B. SAP, Branchensoftware fuer Krankenhäuser, etc.).
    Als zweites Beispiel, wie sieht es mit dem nachträglichen verändern einer policy-map aus. Also dem neuordnen der class-maps bzw. dem einfügen einer class-map zwischen vorhanden?

    VG Tim

  2. Klasse Artikel, den ich durch Zufalle entdeckt habe, es gelang mir nie dies durchzuführen, nun werde ich es noch einmal in Angriff nehmen, hoffe es klappt nun…

  3. Hallo Karsten,

    es geht um den Teil mit dem Ping vom Router ins Internet:
    Zumindest in IOS Version 15.1(3)T lässt sich das inspect nicht mehr im class-default konfigurieren. Abhilfe schafft hier ebenfalls eine class-map.

    class-map type inspect Router2Extern
    match protocol icmp
    ! match protocol

    policy-map type inspect Router2Extern
    class type inspect Router2Extern
    inspect
    class class-default
    drop

    zone-pair security Router-Extern source self destination Extern
    service-policy type inspect Router2Extern

    VG Hannes

  4. EDIT:

    class-map type inspect Router2Extern
    match protocol icmp
    ! match protocol (weitere Protokolle z. B. DNS, NTP, etc.)

    1. Ja, auch bei mir geht das nicht mehr. Wobei ich mir jetzt nicht bewusst bin, wann das geändert wurde, oder ob das nur ein Bug ist. In der Doku finde ich zu der Einschränkung gerade nichts.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.