Suricata Bridge Firewall: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 235: | Zeile 235: | ||
<pre> | <pre> | ||
| + | #!/usr/sbin/nft -f | ||
#!/usr/sbin/nft -f | #!/usr/sbin/nft -f | ||
define open = enp0s8 | define open = enp0s8 | ||
| − | define | + | define filter = enp0s9 |
flush ruleset | flush ruleset | ||
table bridge filter { | table bridge filter { | ||
| Zeile 243: | Zeile 244: | ||
type filter hook forward priority 0; policy drop; | type filter hook forward priority 0; policy drop; | ||
meta iifname $open queue num 0 | meta iifname $open queue num 0 | ||
| − | meta iifname $ | + | meta iifname $filter queue num 0 |
ct state established,related accept | ct state established,related accept | ||
# Arp freischalten | # Arp freischalten | ||
iif $open ether type arp accept | iif $open ether type arp accept | ||
| − | iif $ | + | iif $filter ether type arp accept |
| − | ####icmp von | + | ####icmp von filter nach open freischalten |
| − | iif $ | + | iif $filter oif $open ip protocol icmp ct state new accept |
| − | ####dns von | + | ####dns von filter nach open freischalten |
| − | iif $ | + | iif $filter oif $open udp dport 53 ct state new accept |
| − | ####http von | + | ####http von filter nach open freischalten |
| − | iif $ | + | iif $filter oif $open tcp dport 80 ct state new accept |
| − | ####https von | + | ####https von filter nach open freischalten |
| − | iif $ | + | iif $filter oif $open tcp dport 443 ct state new accept |
| − | ####alles von open nach | + | ### port 22,80,443 nach innen erlauben |
| − | iif $open oif $ | + | 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 | #### Loggen von abgelehnten Paketen | ||
log prefix " nft-drop" | log prefix " nft-drop" | ||
| − | |||
} | } | ||
| − | |||
} | } | ||
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


