Suricata Bridge Firewall: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(29 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 4: Zeile 4:
 
*Pakete, die durch eine Linux-Bridge laufen, werden aktiv durch Suricata geprüft
 
*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
 
*Suricata läuft im IPS-Modus über NFQUEUE und kann Pakete verwerfen
 +
 +
=Cloned die Maschine aus der Vorlage=
 +
*bridge-firewall
 +
 +
=Vorgaben=
 +
{| class="wikitable"
 +
! 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=
 +
{{#drawio:suritca-bridge-firewall}}
  
 
=Vorbereitung=
 
=Vorbereitung=
Zeile 23: Zeile 63:
  
 
auto enp0s3
 
auto enp0s3
iface enp0s3 inet dhcp
+
iface enp0s3 inet static
 +
address 172.17.2xx.21/24
 +
gateway 172.17.2xx.1
  
 
auto enp0s8
 
auto enp0s8
Zeile 42: 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 50: 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 58: Zeile 138:
  
 
default-log-dir: /var/log/suricata/
 
default-log-dir: /var/log/suricata/
 +
 +
unix-command:
 +
  enabled: yes
 +
  filename: /var/run/suricata-command.socket
  
 
nfq:
 
nfq:
Zeile 73: Zeile 157:
 
       filename: alert-debug.log
 
       filename: alert-debug.log
 
       append: yes
 
       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
 
pid-file: /var/run/suricata.pid
Zeile 82: Zeile 179:
 
classification-file: /etc/suricata/classification.config
 
classification-file: /etc/suricata/classification.config
 
reference-config-file: /etc/suricata/reference.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
 
</pre>
 
</pre>
  
Zeile 87: 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
Zeile 94: Zeile 243:
 
         chain forward {
 
         chain forward {
 
                 type filter hook forward priority 0; policy drop;
 
                 type filter hook forward priority 0; policy drop;
                 meta iifname "enp0s8" queue num 0
+
                 meta iifname $open queue num 0
                 meta iifname "enp0s9" 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>
 
=Starten im IPS-Modus=
 
* '''suricata -D -q 0 -c /etc/suricata/suricata.yaml'''
 
* oder dauerhaft mit eigener systemd-Datei:
 
* siehe [[Suricata als IPS mit systemd starten]]
 
  
 
=Beispielregeln=
 
=Beispielregeln=
 
* '''vim /etc/suricata/rules/local.rules'''
 
* '''vim /etc/suricata/rules/local.rules'''
 
<pre>
 
<pre>
 +
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 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;)
 
alert tcp any any -> any 80 (msg:"HTTP Traffic erkannt"; sid:10002;)
 
</pre>
 
</pre>
 +
 +
=Starten im IPS-Modus=
 +
* '''suricata -D -q 0 -c /etc/suricata/suricata.yaml'''
 +
* oder dauerhaft mit eigener systemd-Datei:
 +
* siehe [[Suricata als IPS mit systemd starten]]
  
 
=Log-Analyse=
 
=Log-Analyse=
 
* '''tail -f /var/log/suricata/fast.log'''
 
* '''tail -f /var/log/suricata/fast.log'''
 
 
=Hinweise=
 
=Hinweise=
 
* Pakete werden wirklich blockiert – nicht nur geloggt
 
* Pakete werden wirklich blockiert – nicht nur geloggt
 
* Testen mit Ping oder einfachem Curl
 
* Testen mit Ping oder einfachem Curl
 
* Performance beachten – NFQUEUE braucht CPU
 
* Performance beachten – NFQUEUE braucht CPU
 +
=eve=
 +
*[[EveBox]]

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