Suricata Bridge Firewall: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(→Regeln) |
|||
| (36 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 15: | Zeile 55: | ||
=Installation der Bridgeutils= | =Installation der Bridgeutils= | ||
| − | *apt install bridge-utils | + | *apt install bridge-utils suricata |
| + | |||
=/etc/network/interfaces= | =/etc/network/interfaces= | ||
<pre> | <pre> | ||
| Zeile 22: | Zeile 63: | ||
auto enp0s3 | auto enp0s3 | ||
| − | iface enp0s3 inet static | + | iface enp0s3 inet static |
| − | address | + | address 172.17.2xx.21/24 |
| − | gateway | + | gateway 172.17.2xx.1 |
auto enp0s8 | auto enp0s8 | ||
| Zeile 43: | 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 51: | Zeile 130: | ||
vars: | vars: | ||
address-groups: | address-groups: | ||
| − | LAN: "[172.17. | + | LAN: "[172.17.213.0/24]" |
| − | DMZ: "[10.88. | + | DMZ: "[10.88.213.0/24]" |
| − | SERVER: "[172.16. | + | SERVER: "[172.16.213.0/24]" |
INT: "[$LAN,$DMZ,$SERVER]" | INT: "[$LAN,$DMZ,$SERVER]" | ||
HOME_NET: "$INT" | HOME_NET: "$INT" | ||
| Zeile 59: | 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 74: | 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 83: | 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> | ||
=Regeln zur Weiterleitung an Suricata= | =Regeln zur Weiterleitung an Suricata= | ||
| − | *nftables | + | *cat /etc/nftables.conf |
| + | <pre> | ||
| + | |||
| + | #!/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" | ||
| + | } | ||
| + | } | ||
| − | |||
| − | |||
| − | + | </pre> | |
| − | |||
| − | |||
| − | |||
=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
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
- suricata -D -q 0 -c /etc/suricata/suricata.yaml
- oder dauerhaft mit eigener systemd-Datei:
- siehe Suricata als IPS mit systemd starten
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


