Suricata Bridge Firewall: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 6: Zeile 6:
  
 
=Cloned die Maschine aus der Vorlage=
 
=Cloned die Maschine aus der Vorlage=
*proxy
+
*bridge-firewall
 +
 
 
=Vorgaben=
 
=Vorgaben=
 
{| class="wikitable"
 
{| class="wikitable"
Zeile 31: Zeile 32:
 
| '''Netz''' || LAN
 
| '''Netz''' || LAN
 
|}
 
|}
 +
=Netzwerkadapter=
 +
*Fügen zwei Adapter
 +
*2. Adapter DMZ
 +
*3. Adapter DMZ-SAFE
  
 
=Weiteres=
 
=Weiteres=
Zeile 38: Zeile 43:
  
 
=Schaubild=
 
=Schaubild=
[[Datei:Suri-bridge.png]]
+
{{#drawio:suritca-bridge-firewall}}
  
 
=Vorbereitung=
 
=Vorbereitung=
Zeile 61: Zeile 66:
 
  address 172.17.2xx.21/24
 
  address 172.17.2xx.21/24
 
  gateway 172.17.2xx.1  
 
  gateway 172.17.2xx.1  
 +
 
auto enp0s8
 
auto enp0s8
 
iface enp0s8 inet manual
 
iface enp0s8 inet manual
Zeile 78: Zeile 84:
 
=Suricata Bridge Firewall=
 
=Suricata Bridge Firewall=
 
{{#drawio:bridge-fw}}
 
{{#drawio:bridge-fw}}
 +
=Handling=
 +
*brctl show
 +
bridge name bridge id STP enabled interfaces
 +
vmbr0 8000.0efa13a3b0ca no enp0s8
 +
enp0s9
 +
 +
=Grundfirewall ohne Suricata=
 +
*cat  /etc/nftables.conf
 +
<pre>
 +
#!/usr/sbin/nft -f
 +
define open    = enp0s8
 +
define filter  = enp0s9
 +
flush ruleset
 +
table bridge filter {
 +
        chain forward {
 +
                type filter hook forward priority 0; policy drop;
 +
                ct state established,related accept
 +
                # Arp freischalten
 +
        iif $open ether type arp accept
 +
                iif $filter ether type arp accept
 +
                ####icmp von filter nach open freischalten
 +
                #iif $filter oif $open ip protocol icmp ct state new accept
 +
                ####dns von filter nach open freischalten
 +
                #iif $filter oif $open udp dport 53 ct state new accept
 +
                ####http von filter nach open freischalten
 +
                #iif $filter oif $open tcp dport 80 ct state new accept
 +
                ####https von filter nach open freischalten
 +
                #iif $filter oif $open tcp dport 443 ct state new accept
 +
                ####alles von open nach filter freischalten
 +
                #iif $open oif $filter ct state new accept
 +
                #### Loggen von abgelehnten Paketen
 +
                log prefix " nft-drop"
 +
        }
 +
}
 +
 +
 +
 +
</pre>
  
 
=Konfiguration Suricata=
 
=Konfiguration Suricata=
Zeile 86: Zeile 130:
 
vars:
 
vars:
 
   address-groups:
 
   address-groups:
     LAN: "[172.17.113.0/24]"
+
     LAN: "[172.17.213.0/24]"
     DMZ: "[10.88.113.0/24]"
+
     DMZ: "[10.88.213.0/24]"
     SERVER: "[172.16.113.0/24]"
+
     SERVER: "[172.16.213.0/24]"
 
     INT: "[$LAN,$DMZ,$SERVER]"
 
     INT: "[$LAN,$DMZ,$SERVER]"
 
     HOME_NET: "$INT"
 
     HOME_NET: "$INT"
Zeile 190: Zeile 234:
 
*cat  /etc/nftables.conf
 
*cat  /etc/nftables.conf
 
<pre>
 
<pre>
 +
   
 +
#!/usr/sbin/nft -f
 
#!/usr/sbin/nft -f
 
#!/usr/sbin/nft -f
 
 
define open    = enp0s8
 
define open    = enp0s8
define safe = enp0s9
+
define filter = enp0s9
 
flush ruleset
 
flush ruleset
 
table bridge filter {
 
table bridge filter {
 
         chain forward {
 
         chain forward {
                 type filter hook forward priority 0; policy accept;
+
                 type filter hook forward priority 0; policy drop;
 
                 meta iifname $open queue num 0
 
                 meta iifname $open queue num 0
                 meta iifname $safe queue num 0
+
                 meta iifname $filter queue num 0
                }
+
                ct state established,related accept
            }
+
                # Arp freischalten
 +
                iif $open ether type arp accept
 +
                iif $filter ether type arp accept
 +
                ####icmp von filter nach open freischalten
 +
                iif $filter oif $open ip protocol icmp ct state new accept
 +
                ####dns von filter nach open freischalten
 +
                iif $filter oif $open udp dport 53 ct state new accept
 +
                ####http von filter nach open freischalten
 +
                iif $filter oif $open tcp dport 80 ct state new accept
 +
                ####https von filter nach open freischalten
 +
                iif $filter oif $open tcp dport 443 ct state new accept
 +
                ### port 22,80,443 nach innen erlauben
 +
                iif $open oif $filter tcp dport { 22, 80, 443 } ct state new accept
 +
                ### icmp nach innen erlauben
 +
                iif $open oif $filter ip protocol icmp ct state new accept
 +
                ####alles von open nach filter freischalten
 +
                #iif $open oif $filter ct state new accept
 +
                #### Loggen von abgelehnten Paketen
 +
                log prefix " nft-drop"
 +
        }
 +
}
 +
 
  
 
</pre>
 
</pre>

Aktuelle Version vom 3. Juli 2025, 08:16 Uhr

Suricata als IPS auf einer Bridge

Ziel
  • Pakete, die durch eine Linux-Bridge laufen, werden aktiv durch Suricata geprüft
  • Suricata läuft im IPS-Modus über NFQUEUE und kann Pakete verwerfen

Cloned die Maschine aus der Vorlage

  • bridge-firewall

Vorgaben

Einstellung Wert
Name bridge-firewall.it2xx.int
IP-Adresse 172.17.2xx.21/24
Gateway 172.17.2xx.1
Nameserver 10.88.2xx.21
Search-Domain it2xx.int
Benutzername kit
Benutzerpasswort kit
Administrator root
Administratorpasswort radler
Netz LAN

Netzwerkadapter

  • Fügen zwei Adapter
  • 2. Adapter DMZ
  • 3. Adapter DMZ-SAFE

Weiteres

  • In den Nameserver eintragen
  • Firewall anpassen so das ihr von eurem Host mit ssh draufkommt.


Schaubild

Vorbereitung

Suricata muss im NFQUEUE-Modus laufen
  • af-packet Abschnitt in der YAML entfernen oder auskommentieren
  • nfq-Modus konfigurieren

Vorab

Bei Virtualisierungen Bridge Ports auf Promisc setzen

Vm-promisc-1.png

Installation der Bridgeutils

  • apt install bridge-utils suricata

/etc/network/interfaces

auto lo
iface lo inet loopback

auto enp0s3
iface enp0s3 inet static 
 address 172.17.2xx.21/24
 gateway 172.17.2xx.1 

auto enp0s8
iface enp0s8 inet manual

auto enp0s9
iface enp0s9 inet manual

auto vmbr0
iface vmbr0 inet manual
    bridge_ports enp0s8 enp0s9
    bridge_fd 5
    bridge_stp no
  • ifup vmbr0

Suricata Bridge Firewall

Handling

  • brctl show
bridge name	bridge id		STP enabled	interfaces
vmbr0		8000.0efa13a3b0ca	no		enp0s8

enp0s9

Grundfirewall ohne Suricata

  • cat /etc/nftables.conf
#!/usr/sbin/nft -f
define open    = enp0s8
define filter  = enp0s9
flush ruleset
table bridge filter {
        chain forward {
                type filter hook forward priority 0; policy drop;
                ct state established,related accept
                # Arp freischalten
	        iif $open ether type arp accept
                iif $filter ether type arp accept
                ####icmp von filter nach open freischalten 
                #iif $filter oif $open ip protocol icmp ct state new accept
                ####dns von filter nach open freischalten 
                #iif $filter oif $open udp dport 53 ct state new accept
                ####http von filter nach open freischalten 
                #iif $filter oif $open tcp dport 80 ct state new accept
                ####https von filter nach open freischalten 
                #iif $filter oif $open tcp dport 443 ct state new accept
                ####alles von open nach filter freischalten 
                #iif $open oif $filter ct state new accept
                #### Loggen von abgelehnten Paketen
                log prefix " nft-drop"
        }
}



Konfiguration Suricata

  • vim /etc/suricata/suricata.yaml
%YAML 1.1
---
vars:
  address-groups:
    LAN: "[172.17.213.0/24]"
    DMZ: "[10.88.213.0/24]"
    SERVER: "[172.16.213.0/24]"
    INT: "[$LAN,$DMZ,$SERVER]"
    HOME_NET: "$INT"
    EXTERNAL_NET: "!$INT"

default-log-dir: /var/log/suricata/

unix-command:
  enabled: yes
  filename: /var/run/suricata-command.socket

nfq:
  mode: repeat
  repeat-mark: 1
  repeat-mask: 1

outputs:
  - fast:
      enabled: yes
      filename: fast.log
      append: yes
  - alert-debug:
      enabled: yes
      filename: alert-debug.log
      append: yes
  - eve-log:
      enabled: yes
      filetype: regular
      filename: eve.json
      types:
        - alert
        - http
        - dns
        - tls
        - flow
        - ssh
        - stats


pid-file: /var/run/suricata.pid

default-rule-path: /etc/suricata/rules
rule-files:
  - local.rules

classification-file: /etc/suricata/classification.config
reference-config-file: /etc/suricata/reference.config
app-layer:
  protocols:
    http:
      enabled: yes
    tls:
      enabled: yes
    dcerpc:
      enabled: yes
    smb:
      enabled: yes
    ftp:
      enabled: yes
    ssh:
      enabled: yes
    smtp:
      enabled: yes
    dns:
      enabled: yes
    modbus:
      enabled: yes
    enip:
      enabled: yes
    dnp3:
      enabled: yes
    nfs:
      enabled: yes
    ntp:
      enabled: yes
    tftp:
      enabled: yes
    ikev2:
      enabled: yes
    krb5:
      enabled: yes
    dhcp:
      enabled: yes
    snmp:
      enabled: yes
    sip:
      enabled: yes
    rfb:
      enabled: yes
    mqtt:
      enabled: yes
    rdp:
      enabled: yes
    http2:
      enabled: yes
    imap:
      enabled: yes

Regeln zur Weiterleitung an Suricata

  • cat /etc/nftables.conf
    
#!/usr/sbin/nft -f
#!/usr/sbin/nft -f
define open    = enp0s8
define filter  = enp0s9
flush ruleset
table bridge filter {
        chain forward {
                type filter hook forward priority 0; policy drop;
                meta iifname $open queue num 0
                meta iifname $filter queue num 0
                ct state established,related accept
                # Arp freischalten
                iif $open ether type arp accept
                iif $filter ether type arp accept
                ####icmp von filter nach open freischalten 
                iif $filter oif $open ip protocol icmp ct state new accept
                ####dns von filter nach open freischalten 
                iif $filter oif $open udp dport 53 ct state new accept
                ####http von filter nach open freischalten 
                iif $filter oif $open tcp dport 80 ct state new accept
                ####https von filter nach open freischalten 
                iif $filter oif $open tcp dport 443 ct state new accept
                ### port 22,80,443 nach innen erlauben
                iif $open oif $filter tcp dport { 22, 80, 443 } ct state new accept
                ### icmp nach innen erlauben
                iif $open oif $filter ip protocol icmp ct state new accept
                ####alles von open nach filter freischalten 
                #iif $open oif $filter ct state new accept
                #### Loggen von abgelehnten Paketen
                log prefix " nft-drop"
        }
}


Beispielregeln

  • vim /etc/suricata/rules/local.rules
drop icmp $HOME_NET any -> 1.1.1.1 any (msg:"ICMP von intern nach 1.1.1.1  geblockt"; sid:10001;)
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP von extern geblockt"; sid:10001;)
alert tcp any any -> any 80 (msg:"HTTP Traffic erkannt"; sid:10002;)
alert tcp any any -> any 80 (msg:"HTTP Traffic erkannt"; sid:10002;)

Starten im IPS-Modus

Log-Analyse

  • tail -f /var/log/suricata/fast.log

Hinweise

  • Pakete werden wirklich blockiert – nicht nur geloggt
  • Testen mit Ping oder einfachem Curl
  • Performance beachten – NFQUEUE braucht CPU

eve