nftables für Anfänger

Alles rund um sicherheitsrelevante Fragen und Probleme.
MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

nftables für Anfänger

Beitrag von MoritzJ » 19.08.2020 20:32:16

Nabend,

ich habe seit einiger Zeit wieder einen VPS in Betrieb und habe mich mit den allgemeinen Sachen bzgl. Sicherheit auseinander gesetzt. Das einzige was mir noch fehlt ist die Sache mit der Firewall und nftables.

Zur Konfiguration:
Debian 10 mit SSH, HTTP, HTTPS, FTP (ev. später SFTP), Mailserver mit SMTP und POP3, SVN und Teamspeak3

Nach einigen Youtube Videos und dem kläglichen Versuch eine für mich verständliche Anleitung zu finden habe ich mal versucht etwas zusammen zu schustern. Herausgekommen ist folgendes:

Code: Alles auswählen

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
        chain input {
                type filter hook input priority 0;

                # allow from loopback
                iifname lo accept;

                # established/related connections
                ct state established,related accept;

                # invalid connections
                ct state invalid drop;

                # no ping floods
                ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 2/second accept;
                ip protocol icmp icmp type echo-request limit rate 2/second accept;

                tcp dport ssh ip saddr MEINEPRIVATEIP accept;
                tcp dport {http, https, ftp, smtp, pop3} accept;

		# TS3 configuration
                udp dport 9987 accept;
                tcp dport {30033, 10011} accept;

                policy drop;
                policy drop;
        }
        chain forward {
                type filter hook forward priority 0;
        }
        chain output {
                type filter hook output priority 0;
        }
}
Ist das so in Ordnung oder habe ich irgendwas wesentliches übersehen, resp. was könnte man noch besser machen? Habe zum Beispiel für die "output" chain noch gar nix definiert, macht das bei meinen Anwendungen überhaupt Sinn da was zu machen?
Gibt es irgendwo online ein gutes auch für Laien verständliches Kompendium das mir "nftables" erklärt (vielleicht auch mit Beispielen aus der Praxis)?

Danke für eure Hilfe! :)

TomL

Re: nftables für Anfänger

Beitrag von TomL » 20.08.2020 10:44:49

MoritzJ hat geschrieben: ↑ zum Beitrag ↑
19.08.2020 20:32:16
Ist das so in Ordnung
Mit sind da ein paar semantische Unstimmigkeiten aufgefallen.... und ein paar logische. Ist diese Regel schon aktiv und getestet? Meiner Meinung nach kanns sein, dass damit IPv6 tot gefiltert wird, also bis es quasi nicht mehr existiert. Sind die Privacy Extensions aktiviert.... IPv6 mit PE müsste man vor dem Hintergrund dieses Filter explizit prüfen, und ohne PE auch. Funktioniert FTP? Das würde mich auch wundern, weil die obligatorischen unprivilegierten Ports für FTP nicht freigegeben sind.... es sei denn, Du hättest bewusst das Application Layer Gateway für FTP aktiviert, was aber in einem normalen Setup nicht automatisch passiert. Der Ausgang der Input-Chain ist meiner Meinung nach auch eher 'unsauber', das kann man verbessern.

Also ist die Kernfrage: lebt der Filter schon und was funktioniert und was nicht.... oder ist das nur ein Entwurf auf dem Papier?
Gibt es irgendwo online ein gutes auch für Laien verständliches Kompendium das mir "nftables" erklärt (vielleicht auch mit Beispielen aus der Praxis)?
Da gibts nicht wirklich was .... weil einfach das Feld der Anforderungen so umfassend und variabel ist, dass man das m.M.n. eigentlich nicht in ein Kompendium fassen kann. Das, was für den einen passen kann, kann für den anderen die Deaktivierung der Sicherheit bedeuten.

Ich denke, der Weg hier übers Forum passt schon.... und ab dem Punkt, wo es die Trivialität verlässt, bietet sich die Netfilter-Mailing-Liste an. Aber das kann imho durchaus noch eine Zeitlang warten. Wir können ja mal sehen, was man an dem Filter verbessern kann.... dazu brauchts aber die Antworten auf meine Fragen.

mat6937
Beiträge: 2927
Registriert: 09.12.2014 10:44:00

Re: nftables für Anfänger

Beitrag von mat6937 » 20.08.2020 11:05:12

MoritzJ hat geschrieben: ↑ zum Beitrag ↑
19.08.2020 20:32:16
Gibt es irgendwo online ein gutes auch für Laien verständliches Kompendium das mir "nftables" erklärt (vielleicht auch mit Beispielen aus der Praxis)?
Es gibt was Wiki (howto) von nftables: https://wiki.nftables.org/wiki-nftables ... /Main_Page

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 20.08.2020 11:09:59

Moin,

danke für deine Antwort:
TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 10:44:49
Sind die Privacy Extensions aktiviert.
Keine Ahnung, da ich das aber nicht weiss (und ich das nur per "apt-get install nftables" installiert habe) gehe ich mal von Nein aus.
TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 10:44:49
Also ist die Kernfrage: lebt der Filter schon und was funktioniert und was nicht.... oder ist das nur ein Entwurf auf dem Papier?
Dieser Filter existiert nur auf dem Papier da der Server im Moment offline ist. Wollte nix einspielen was gar nicht funktioniert und ich mir nachher n Wolf suche. Lieber erst die Grundlagen zumindest einigermassen begreifen und dann auf dem Server ausprobieren um nachher die Fehlersuche zu vereinfachen.
TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 10:44:49
Mit sind da ein paar semantische Unstimmigkeiten aufgefallen.... und ein paar logische. Ist diese Regel schon aktiv und getestet? Meiner Meinung nach kanns sein, dass damit IPv6 tot gefiltert wird, also bis es quasi nicht mehr existiert. Sind die Privacy Extensions aktiviert.... IPv6 mit PE müsste man vor dem Hintergrund dieses Filter explizit prüfen, und ohne PE auch. Funktioniert FTP? Das würde mich auch wundern, weil die obligatorischen unprivilegierten Ports für FTP nicht freigegeben sind.... es sei denn, Du hättest bewusst das Application Layer Gateway für FTP aktiviert, was aber in einem normalen Setup nicht automatisch passiert. Der Ausgang der Input-Chain ist meiner Meinung nach auch eher 'unsauber', das kann man verbessern.
Meiner Meinung wäre bei meinem Setup "Application Layer Gateway" nicht aktiviert gewesen.

TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 10:44:49
Da gibts nicht wirklich was .... weil einfach das Feld der Anforderungen so umfassend und variabel ist, dass man das m.M.n. eigentlich nicht in ein Kompendium fassen kann. Das, was für den einen passen kann, kann für den anderen die Deaktivierung der Sicherheit bedeuten.
Und das war / ist genau mein Problem. Klar, sowas lernt man nicht von heute auf morgen und es braucht viel Erfahrung um da schlussendlich durchzublicken. Deswegen hatte ich das erstmal nur auf dem Papier versucht einfach um auch zumindest ansatzweise zu verstehen wie das abläuft.


@mat6937
Auf der Seite war ich auch, es gibt da auch ein Beispiel aber irgendwie war mir das nicht so ganz klar und deshalb mein Post hier :)

TomL

Re: nftables für Anfänger

Beitrag von TomL » 20.08.2020 11:31:57

MoritzJ hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 11:09:59
TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 10:44:49
Sind die Privacy Extensions aktiviert.
Keine Ahnung, da ich das aber nicht weiss (und ich das nur per "apt-get install nftables" installiert habe) gehe ich mal von Nein aus.
Die PE haben nichts mit dem Paketfilter zu tun... das ist im weitesten Sinne so etwas wie ein Pseudo-NAT, also ein Verbergen der Interface-ID .... technisch ein entgegenkommen an die Sorgen derer, die das obligatorische NAT für IPv4 des DSL-Routers als maßgeblichen Datenschutz sehen und die mit den PE diesen Mangel bei IPv6 beheben wollen. Für einen öffentlich erreichbaren Server ist das aber wohl eher kontraproduktiv. Aber dennoch besteht die Gefahr, dass der Filter IPv6 tötet.... das muss man testen, beobachten.

Ob die PE aktiviert sind, siehst Du an der Ergänzung "temporary dynamic". Diese temporär gültige IPv6 ist die für ausgehenden Verkehr bevorzugte. Der Kernel würde mit PE bei Restart des System eine neue temporäre IPv6 generieren, ohne PE wäre die Inteface-ID statisch, und die Site-ID wäre solange statisch, wie sich der ISP-Prefix nicht ändert.

Code: Alles auswählen

ip a
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 08:bb:kk:mo:wx:zz brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.30/24 brd 10.0.1.255 scope global dynamic wlp2s0
       valid_lft 861119sec preferred_lft 861119sec
    inet6 2022:1344:666:7660:a516:2231:1234 scope global temporary dynamic 
       valid_lft 7017sec preferred_lft 3417sec
    inet6 2022:1344:666:7660:ab1:45ff:5450:7454:64 scope global dynamic mngtmpaddr 
       valid_lft 7017sec preferred_lft 3417sec
Das wäre übrigens auch eine fehlende Antwort... hat das System überhaupt eine öffentliche IPv4 und IPv6.... wie ist das konfiguriert?
Dieser Filter existiert nur auf dem Papier da der Server im Moment offline ist.Wollte nix einspielen was gar nicht funktioniert und ich mir nachher n Wolf suche. Lieber erst die Grundlagen zumindest einigermassen begreifen und dann auf dem Server ausprobieren um nachher die Fehlersuche zu vereinfachen.

Eine gute Vorgehensweise.
Meiner Meinung wäre bei meinem Setup "Application Layer Gateway" nicht aktiviert gewesen.
Das kannst Du kontrollieren, mit

Code: Alles auswählen

# lsmod | grep conntrack
nf_conntrack_ftp       20480  0
Deswegen hatte ich das erstmal nur auf dem Papier versucht einfach um auch zumindest ansatzweise zu verstehen wie das abläuft.
Das kriegen wir hin.
Auf der Seite war ich auch, es gibt da auch ein Beispiel aber irgendwie war mir das nicht so ganz klar und deshalb mein Post hier
Deswegen würde ich die auch nicht mehr empfehlen. Ich halte die für die Anforderungen eines Beginners für Praxisfremd. Das ist ein wirklich gutes Nachschlagewerk, wenn man es bereits grundsätzlich verstanden hat und eine Lösung für ein konkretes Problem sucht. Für mich ist es das gleiche wie mit einem Buch über höhere Mathematik... es setzt voraus, dass man rechnen kann.

mat6937
Beiträge: 2927
Registriert: 09.12.2014 10:44:00

Re: nftables für Anfänger

Beitrag von mat6937 » 20.08.2020 11:41:55

MoritzJ hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 11:09:59
..., es gibt da auch ein Beispiel aber irgendwie war mir das nicht so ganz klar und deshalb mein Post hier :)
Naja, ich habe das ja auch nicht wegen dem Beispiel gepostet...

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 20.08.2020 11:52:03

Es handelt sich um einen gemieteten VPS mit vorinstalliertem Debian 10 Minimal Image (der nachher öffentlich erreichbar sein soll, also sprich nicht im geschlossenen Netzwerk).
Der Befehl "ip a" spuckt folgendes aus:

Code: Alles auswählen

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 4a:08:6f:d4:21:c3 brd ff:ff:ff:ff:ff:ff
    inet 45.132.246.229/22 brd 45.132.247.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2a03:4000:48:241:4808:6fff:fed4:21c3/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::4808:6fff:fed4:21c3/64 scope link
       valid_lft forever preferred_lft forever
also scheint PE wohl nicht aktiviert zu sein. Wie genau das konfiguriert ist weiss ich nicht (resp. ev. genügen ja die Angaben weiter oben). Meines Wissens nach ist die IP öffentlich (zumindest die IP4, die andere habe ich nicht ausprobiert) da ich bereits im Vorfeld ein paar Sachen ausprobiert habe und beispielsweise den Apache immer unter der IP erreichen konnte.

Code: Alles auswählen

lsmod | grep conntrack
kann ich im Moment nicht ausprobieren da der FTP Server nicht installiert ist im Moment. Der Server läuft zur Zeit nur mit dem Minimal Image, ohne irgendwelche Applikationen. Als FTP wird wohl "ProFTPD" zum Einsatz kommen falls das helfen sollte.

Ich kann aber auch den Server fix komplett installieren falls wir / ihr / du noch weitere Informationen brauchen für die nächsten Schritte.

@mat6937
Ne, ich hab dich schon richtig verstanden, als Kompendium dient es ja auch ... nur wenn man so "gar keine Ahnung hat" (etwas übertrieben aber ich denke du weisst was ich meine) dann weiss man auch nicht wo man suchen soll

TomL

Re: nftables für Anfänger

Beitrag von TomL » 20.08.2020 12:16:43

MoritzJ hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 11:52:03
Es handelt sich um einen gemieteten VPS mit vorinstalliertem Debian 10 Minimal Image (der nachher öffentlich erreichbar sein soll, also sprich nicht im geschlossenen Netzwerk).

Es sind beides öffentlich erreichbare IP-Adressen:

Code: Alles auswählen

$ ping -c 3 -w 0 45.132.246.229
PING 45.132.246.229 (45.132.246.229) 56(84) bytes of data.
64 bytes from 45.132.246.229: icmp_seq=1 ttl=56 time=19.4 ms
64 bytes from 45.132.246.229: icmp_seq=2 ttl=56 time=19.3 ms
64 bytes from 45.132.246.229: icmp_seq=3 ttl=56 time=18.5 ms

$ ping -c 3 -w 0 2a03:4000:48:241:4808:6fff:fed4:21c3
PING 2a03:4000:48:241:4808:6fff:fed4:21c3(2a03:4000:48:241:4808:6fff:fed4:21c3) 56 data bytes
64 bytes from 2a03:4000:48:241:4808:6fff:fed4:21c3: icmp_seq=1 ttl=56 time=33.7 ms
64 bytes from 2a03:4000:48:241:4808:6fff:fed4:21c3: icmp_seq=2 ttl=56 time=23.9 ms
64 bytes from 2a03:4000:48:241:4808:6fff:fed4:21c3: icmp_seq=3 ttl=56 time=23.7 ms
Du solltest dringend die laufenden Services kontrollieren und nicht benötigte Dienste umgehend entfernen. Darüber hinaus sofort den SSH-Password-Zugang für root oder User deaktivieren und die SSH-Anmeldung nur via Pubkey-Auth erlauben. Das ist das, was Du zwingend als erstes tun musst... bevor Du Dir Gedanken über den Paketfilter machst.

Code: Alles auswählen

# ss -tulpen
also scheint PE wohl nicht aktiviert zu sein.

Korrekt. Das würde ich auch zunächst nicht aktivieren.
Wie genau das konfiguriert ist weiss ich nicht
Über Kernelparameter in sysctl. Aber wie gesagt, das kannst Du erstmal hintenanstellen. Das oben gesagte zu Anmeldung und laufenden Services ist deutlich wichtiger.

Code: Alles auswählen

# lsmod | grep conntrack
kann ich im Moment nicht ausprobieren da der FTP Server nicht installiert ist im Moment.

Das hat nur indirekt mit dem installierten FTP-Server zu tun. Das ist ein Kernel-Modul und Du kannst mit dem Befehl einfach testen, ob es geladen ist.
Der Server läuft zur Zeit nur mit dem Minimal Image, ohne irgendwelche Applikationen.

Das bedeutet aber auch, dass Du die beschriebenen Statements zur Prüfung der Gegebenheiten via SSH absenden kannst.
Als FTP wird wohl "ProFTPD" zum Einsatz kommen falls das helfen sollte.
Den verwende ich auch, läuft sehr stabil.

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 20.08.2020 12:38:23

TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 12:16:43
Du solltest dringend die laufenden Services kontrollieren und nicht benötigte Dienste umgehend entfernen. Darüber hinaus sofort den SSH-Password-Zugang für root oder User deaktivieren und die SSH-Anmeldung nur via Pubkey-Auth erlauben. Das ist das, was Du zwingend als erstes tun musst... bevor Du Dir Gedanken über den Paketfilter machst.

Code: Alles auswählen

# ss -tulpen
Output

Code: Alles auswählen

ss -tulpen
Netid   State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port   
tcp     LISTEN   0        128              0.0.0.0:22            0.0.0.0:*       users:(("sshd",pid=501,fd=3)) ino:13732 sk:1 <->
tcp     LISTEN   0        128                 [::]:22               [::]:*       users:(("sshd",pid=501,fd=4)) ino:13734 sk:2 v6only:1 <->
Wie gesagt, ist nur das Minimal Image ohne irgendwelche Einstellungen (hatte den eben nur gestartet um das mit der PE abzuklären :) ) Der SSH Zugang für den root User wird im nächsten Schritt deaktiviert, das mit dem Pubkey hatte ich mir überlegt, allerdings wäre ich den Weg über einen einzelnen SSH User gegangen (Username: eine Kombi aus Buchstaben und Zahlen und PW: 16 Zeichen mit Klein und Grossbuchstaben inkl. Sonderzeichen). Denke aber der PubKey fügt (wie du sagst) nochmals eine zusätzliche Sicherheitsstufe ein.
TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 12:16:43

Code: Alles auswählen

# lsmod | grep conntrack
spuckt bei mir nix aus
TomL hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 12:16:43
Wie genau das konfiguriert ist weiss ich nicht
Über Kernelparameter in sysctl. Aber wie gesagt, das kannst Du erstmal hintenanstellen. Das oben gesagte zu Anmeldung und laufenden Services ist deutlich wichtiger.
Dann notier ich mir das mal für später

Rein vom Minimalimage her sind folgende services aktiv:

Code: Alles auswählen

service --status-all
 [ + ]  apparmor
 [ - ]  cloud-config
 [ - ]  cloud-final
 [ - ]  cloud-init
 [ - ]  cloud-init-local
 [ - ]  console-setup.sh
 [ + ]  cron
 [ + ]  dbus
 [ - ]  hwclock.sh
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ + ]  networking
 [ + ]  procps
 [ + ]  qemu-guest-agent
 [ + ]  rsyslog
 [ + ]  ssh
 [ - ]  sudo
 [ + ]  udev
Ich werde mich gleich mal hinsetzen und die Grundkonfiguration herstellen um die nftables testen zu können.

TomL

Re: nftables für Anfänger

Beitrag von TomL » 20.08.2020 14:39:58

MoritzJ hat geschrieben: ↑ zum Beitrag ↑
20.08.2020 12:38:23
Ich werde mich gleich mal hinsetzen und die Grundkonfiguration herstellen um die nftables testen zu können.
Du hast bereits eine gute Grundkonfiguration... insofern, dass keine unnötigen Dienste laufen.

Code: Alles auswählen

ss -tulpen
Netid   State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port   
tcp     LISTEN   0        128              0.0.0.0:22            0.0.0.0:*       users:(("sshd",pid=501,fd=3)) ino:13732 sk:1 <->
tcp     LISTEN   0        128                 [::]:22               [::]:*       users:(("sshd",pid=501,fd=4)) ino:13734 sk:2 v6only:1 <->
Das ist SSH ... und da wäre es jetzt unbedingt notwendig, den Pubkey-Auth einzurichten ... und natürlich den Password-Zugang für root und User zu deaktivieren. Das sollte Deine erste Maßnahme sein, weil davon derzeit das größte Risiko für eine Komnpromittierung des Servers ausgeht. Da hilft Dir auch der Paketfilter nicht wirklich.
Der SSH Zugang für den root User wird im nächsten Schritt deaktiviert, das mit dem Pubkey hatte ich mir überlegt, allerdings wäre ich den Weg über einen einzelnen SSH User gegangen (Username: eine Kombi aus Buchstaben und Zahlen und PW: 16 Zeichen mit Klein und Grossbuchstaben inkl. Sonderzeichen). Denke aber der PubKey fügt (wie du sagst) nochmals eine zusätzliche Sicherheitsstufe ein.
JA, root die Anmeldung verbieten.... und NEIN, kein Password-Zugang für den User. Ein Password ist nicht sicher, selbst ein anspruchsvolles ist das nicht wirklich. Ein Keyfile hingegen schon... denn Du bist der einzige, der über dieses Keyfile verfügt.

Code: Alles auswählen

# lsmod | grep conntrack
spuckt bei mir nix aus
Also ohne die Conntrack-Module ist 'Stateful' beim Untersuchen der Pakete nicht möglich.... auch nicht State etablished oder related. Du findest die Module in

Code: Alles auswählen

# find /usr/lib/modules -iname "*conntrack*"
und aktivierst die Module mit

Code: Alles auswählen

# modprobe nf_conntrack
# modprobe nf_conntrack_ftp

# lsmod | grep conntrack
nf_conntrack_ftp
nf_conntrack 
Achtung, das ist nicht persistent.... das heisst, das muss bei Systemstart erfolgen.
Dann notier ich mir das mal für später
Für den Server nicht so notwendig, für den Rechner zuhause (sofern Dual-Stack) ist das obligatorisch.

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 20.08.2020 15:03:39

Habe nun die Basisinstallation gemacht mit folgenden Einstellungen und Ergebnissen:

SSH
- Port geändert
- kein root Login mehr möglich
- neuen User erstellt mit PubKey Auth
- kein Passwortlogin mehr möglich

Teamspeak 3
- keine besonderen Massnahmen getroffen

Keyhelp Panel
- Administrationspanel mit automatischer Installation der folgenden Komponenten (Apache, PHP, MariaDB, ProFTPD, Postfix, Dovecot, phpmyAdmin, Roundcube, OpenSSL)
- keine besonderen Massnahmen getroffen
- ToDo: 2-Faktor Authentifizierung einrichten

nftables
- habe nftables als systemd Service aktiviert

Systemauswertungen
netstat -tulpen

Code: Alles auswählen

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      0          19941      1868/dovecot
tcp        0      0 127.0.0.1:783           0.0.0.0:*               LISTEN      0          16033      882/perl
tcp        0      0 0.0.0.0:30033           0.0.0.0:*               LISTEN      1001       26869      3225/./ts3server
tcp        0      0 0.0.0.0:721             0.0.0.0:*               LISTEN      0          14827      559/sshd
tcp        0      0 45.132.246.229:53       0.0.0.0:*               LISTEN      106        15478      561/named
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      106        15476      561/named
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      0          18440      1805/master
tcp        0      0 127.0.0.1:12345         0.0.0.0:*               LISTEN      114        15339      614/opendkim
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      106        15525      561/named
tcp        0      0 0.0.0.0:10011           0.0.0.0:*               LISTEN      1001       26886      3225/./ts3server
tcp        0      0 0.0.0.0:4190            0.0.0.0:*               LISTEN      0          19867      1868/dovecot
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      0          19943      1868/dovecot
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      0          19892      1868/dovecot
tcp        0      0 0.0.0.0:10022           0.0.0.0:*               LISTEN      1001       26890      3225/./ts3server
tcp        0      0 127.0.0.1:10023         0.0.0.0:*               LISTEN      0          13724      485/postgrey --pidf
tcp        0      0 127.0.0.1:10024         0.0.0.0:*               LISTEN      117        17051      1123/amavisd-new (m
tcp        0      0 127.0.0.1:10025         0.0.0.0:*               LISTEN      0          18541      1805/master
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      107        16082      724/mysqld
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN      0          18443      1805/master
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      0          19890      1868/dovecot
tcp6       0      0 :::143                  :::*                    LISTEN      0          19942      1868/dovecot
tcp6       0      0 ::1:783                 :::*                    LISTEN      0          16031      882/perl
tcp6       0      0 :::80                   :::*                    LISTEN      0          15876      718/apache2
tcp6       0      0 :::30033                :::*                    LISTEN      1001       26870      3225/./ts3server
tcp6       0      0 :::721                  :::*                    LISTEN      0          14838      559/sshd
tcp6       0      0 :::21                   :::*                    LISTEN      108        20261      1918/proftpd: (acce
tcp6       0      0 :::53                   :::*                    LISTEN      106        15472      561/named
tcp6       0      0 ::1:953                 :::*                    LISTEN      106        15526      561/named
tcp6       0      0 :::10011                :::*                    LISTEN      1001       26887      3225/./ts3server
tcp6       0      0 :::443                  :::*                    LISTEN      0          15880      718/apache2
tcp6       0      0 :::4190                 :::*                    LISTEN      0          19868      1868/dovecot
tcp6       0      0 :::993                  :::*                    LISTEN      0          19944      1868/dovecot
tcp6       0      0 :::995                  :::*                    LISTEN      0          19893      1868/dovecot
tcp6       0      0 :::10022                :::*                    LISTEN      1001       26891      3225/./ts3server
tcp6       0      0 ::1:10023               :::*                    LISTEN      0          13723      485/postgrey --pidf
tcp6       0      0 ::1:10024               :::*                    LISTEN      117        17052      1123/amavisd-new (m
tcp6       0      0 :::110                  :::*                    LISTEN      0          19891      1868/dovecot
udp        0      0 0.0.0.0:9987            0.0.0.0:*                           1001       26883      3225/./ts3server
udp        0      0 45.132.246.229:53       0.0.0.0:*                           106        15477      561/named
udp        0      0 127.0.0.1:53            0.0.0.0:*                           106        15475      561/named
udp6       0      0 :::9987                 :::*                                1001       26884      3225/./ts3server
udp6       0      0 :::53                   :::*                                106        15470      561/named
Mittlerweile sind es also einige Dienste mehr, wobei man vermutlich min 2 Ports eliminieren kann (die beiden Mailports ohne SSL) und nicht alle lauschen müssen, oder?

lsmod | grep conntrack

Code: Alles auswählen

keine Ausgabe
meine im Eingangspost erwähnte nftables Datei habe ich jetzt noch nicht eingebaut, ebensowenig wie die "nicht SSL" Ports für den Mailserver zu schliessen. Ansonsten wäre das so in etwas meine Ausgangslage gewesen für die ich eine "nftables" Datei geschustert hätte

EDIT: Nachtrag zu deinem in der Zwischenzeit eingegangenen Post
Das mit dem SSH PubKey habe ich gemacht (siehe Kommentar oben) und auch per Password einloggen funktioniert nun nicht mehr.

Nach der Eingabe der beiden Modprobe krieg ich nun das raus:
lsmod | grep conntrack

Code: Alles auswählen

nf_conntrack_ftp       20480  0
nf_conntrack          172032  1 nf_conntrack_ftp
nf_defrag_ipv6         20480  1 nf_conntrack
nf_defrag_ipv4         16384  1 nf_conntrack
libcrc32c              16384  1 nf_conntrack
um das auch beim Neustart wieder zu haben kann ich doch einfach folgendes machen

Code: Alles auswählen

nano /etc/modules
und dann die beiden Zeilen

Code: Alles auswählen

modprobe nf_conntrack
modprobe nf_conntrack_ftp
hinzufügen, oder? (oder kommt das modprobe weg?)

TomL

Re: nftables für Anfänger

Beitrag von TomL » 20.08.2020 15:33:31

Ok... ich bin dann mal raus. Ich hatte gedacht, Du würdest zuerst für eine zweifelsfreie Basic-Sicherheit des Servers ohne laufende Services sorgen. Neue Services werden dann installiert und sukzessive in die bestehende Sicherheit, die das zunächst mal verboten hätten, mit einer Testphase integriert. Für mich sieht es so nun aus, als hättest Du einen Fliegenköder auf freiem Feld platziert, der die Fliegen en masse anzieht... so der typische honeypot im Web. Dabei kann ich leider nicht helfen... da müssen dann Fachleute ran....sorry... :?

Du kannst Dir bei Interesse mein Setup für den Netfilter ansehen... vielleicht hilft es Dir ja mit Anregungen.

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 20.08.2020 15:42:20

Ähm ne, so war das nicht angedacht, sorry :? Kann den Server auf den SSH Punkt setzen, dann hätten wir wieder eine Basis auf der man aufbauen kann. Dachte du brauchst etwas mehr Angaben zum Vorhaben, eine Honeypot wollte ich nicht erstellen, my bad!

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 20.08.2020 16:09:25

Also, der Server ist wieder zurückgesetzt auf den folgenden Stand:

SSH
- Port geändert
- kein root Login mehr möglich
- neuen User erstellt mit PubKey Auth
- kein Passwortlogin mehr möglich

lsmod | grep conntrack

Code: Alles auswählen

nf_conntrack_ftp       20480  0
nf_conntrack          172032  1 nf_conntrack_ftp
nf_defrag_ipv6         20480  1 nf_conntrack
nf_defrag_ipv4         16384  1 nf_conntrack
libcrc32c              16384  1 nf_conntrack
ss -tulpen

Code: Alles auswählen

Netid       State        Recv-Q       Send-Q               Local Address:Port               Peer Address:Port
tcp         LISTEN       0            128                        0.0.0.0:721                     0.0.0.0:*           users:(("sshd",pid=549,fd=3)) ino:13963 sk:1 <->
tcp         LISTEN       0            128                           [::]:721                        [::]:*           users:(("sshd",pid=549,fd=4)) ino:13965 sk:2 v6only:1 <->
netstat -tulpen

Code: Alles auswählen

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 0.0.0.0:721             0.0.0.0:*               LISTEN      0          13963      549/sshd
tcp6       0      0 :::721                  :::*                    LISTEN      0          13965      549/sshd

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: nftables für Anfänger

Beitrag von wanne » 20.08.2020 17:14:56

So zuerst mal: Nein. Du schießt dir IPv6 nicht direkt kaputt. inet gilt für IPv4 und IPv6 gleichermaßen.
Allerdings nutzt IPv6 ICMPv6 Type 135 und 136 sind zum erkennen der MAC Adressen. Ohne wird da nicht viel Funktionieren. IPv4 nutzt dafür ARP. Das filterst du nicht. Die solltest du beiden typen auf jeden Fall durch lassen. Daneben willst du eventuell Autoconfiguration und DHCP erlauben. Falls du die IPs nicht statisch von Hand konfiguriert hast. Sonst sind dir nach dem nächsten Reboot die IPs weg ;-)
Und wenn mir schon bei ICMP sind du verschluckst alles außer Ping. Insbesondere Type 3 und 5 bzw. bei IPv6 Type 1-4 liefern dem Kernel wertvolle Informationen übers Netz. Insbesondere wie große Pakete er verwenden kann. Linux bekommt die Infos auch über timeouts. Performant sieht anders aus.
Kurz zusammengefasst ich würde hart den da empfehlen:

Code: Alles auswählen

ip protocol icmp accept
ip6 nexthdr icmpv6 accept
Eventuell davor (keine Autokonfiguration):

Code: Alles auswählen

icmpv6 type nd-router-advert drop
Die meisten ICMP Pakete schmeißt der Kernel eh weg. Für die, die es noch gibt, gibt es gute gründe. Wenn du das aus guten gründen anders machen willst kannst du das ja auch im Kernel einstellen, dass er die ignorieren soll.
Mindestens willst du aber das haben:

Code: Alles auswählen

icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert } accept
Die regel für IPv4 wäre:

Code: Alles auswählen

table arp filter {
        chain input {
                policy accept;
        }
}
Ist aber sowieso default.
Zuletzt noch eine Geschmackssache:
Ich ziehe reject drop for. Ob die Meldung nicht erreichbar direkt oder nach 3s kommt ist aus sicherheitstechnischer Sicht IMHO völlig wurst. Ein Angreifer wird tausende anfragen parallel stellen und muss nur ein mal warten. Dafür kann er gerne mal 3s warten Für interaktive Anwendungen ist es dagegen ein Segen, wenn man instantan zurück bekommt, dass man gerade den falschen Port erwischt hat. Kurz Angreifer arbeiten automatisiert und interessieren sich nicht für Echtzeitverhalten. Für echte Nutzer die versehentlich einen Fehler gemacht haben ist es dagegen nervig, dass die passende Fehlermeldung erst 3s später kommt.
rot: Moderator wanne spricht, default: User wanne spricht.

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 20.08.2020 19:01:56

Danke dir wanne,

werde das mal in aller Ruhe durchlesen und versuchen es in meiner conf Datei einzubauen. :THX:

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 21.08.2020 15:22:25

@wanne
Bin da nicht ganz durchgestiegen bei deinen Anmerkungen, insbesondere
Ich ziehe reject drop for
Also ist reject "sofort" und "drop" zeitverzögert?
Bezogen auf mein unteres Beispiel müsste ich also

Code: Alles auswählen

ct state invalid drop
in

Code: Alles auswählen

ct state invalid reject
ändern um eben dem User die Fehlermeldung sofort zu schicken?



Habe jetzt im Netz etwas gefunden und ein wenig umgebaut, meiner Meinung nach schon besser als der 1. Entwurf (vor Allem der "invalid packets" Kram):

Code: Alles auswählen

#!/usr/sbin/nft -f

# Start by flushing all the rules.
flush ruleset

# Define private IP for ssh access
define privateip = {1.1.1.1}

table inet filter {
    # TCP ports to allow. (Allowed services: HTTP, HTTPS)
    set tcp_accepted {
        type inet_service; flags interval;
        elements = {
        80,443
        }
    }
    # TCP port for SSH service.
    set ssh_accepted {
        type inet_service; flags interval;
        elements = {
        721
        }
    }
    # UDP ports to allow.
    set udp_accepted {
        type inet_service; flags interval;
        elements = {
        
        }
    }
    chain input {
        # This line set what traffic the chain will handle, the priority and default policy.
        # The priority comes in when you in another table have a chain set to "hook input" and want to specify in what order they should run.
        # Use a semicolon to separate multiple commands on one row.
        type filter hook input priority 0; policy drop;

        # Limit ping requests. (Limit rules need to be put before accepting "established" connections)
        ip protocol icmp icmp type echo-request limit rate over 1/second burst 5 packets drop
        ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 1/second burst 5 packets drop

        # Allow all incomming established and related traffic. Drop invalid traffic.
        ct state established,related accept
        ct state invalid drop

        # Allow loopback.
        iif lo accept

        # Drop all fragments.
        ip frag-off & 0x1fff != 0 counter drop

        # Force SYN checks.
        tcp flags & (fin|syn|rst|ack) != syn ct state new counter drop

        # Drop XMAS packets.
        tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg counter drop

        # Drop NULL packets.
        tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 counter drop

        # Allow certain inbound ICMP types (ping, traceroute).
        # Without the nd-* ones ipv6 will not work.
        ip protocol icmp icmp type { destination-unreachable, echo-reply, echo-request, source-quench, time-exceeded } accept      
        ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, echo-reply, echo-request, nd-neighbor-solicit,  nd-router-advert, nd-neighbor-advert, packet-too-big, parameter-problem, time-exceeded } accept

        # Allow SSH for specific IP only
        iifname $privateip tcp dport @ssh_accepted ct state new accept

        # Allow needed tcp and udp ports.
        tcp dport @tcp_accepted ct state new accept
        udp dport @udp_accepted ct state new accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;

        # Forward all established and related traffic. Drop invalid traffic.
        ct state established,related accept
        ct state invalid drop
    }
    chain output {
        type filter hook output priority 0; policy drop;

        # Allow all outgoing traffic. Drop invalid traffic.
        # ipv6 ICMP needs to be explicitly allowed here.
        ip6 nexthdr ipv6-icmp accept
        ct state new,established,related accept
        ct state invalid drop
    }
}

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: nftables für Anfänger

Beitrag von wanne » 21.08.2020 15:53:30

Code: Alles auswählen

ip protocol icmp icmp type { destination-unreachable, echo-reply, echo-request, source-quench, time-exceeded } accept
Das ist genau das default verhalten. Alle anderen verwirft der Kernel IMHO eh. Sprich äquivalent zu dem:

Code: Alles auswählen

ip protocol icmp accept
Sonst sieht das gut aus.
rot: Moderator wanne spricht, default: User wanne spricht.

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 21.08.2020 23:27:02

danke für die Erklärung!

kriege jetzt beim starten 2 Fehlermeldungen:

Code: Alles auswählen

        # Allow all incomming established and related traffic. Drop invalid traffic.
        ct state established,related accept
        ct state invalid drop

        # Allow loopback.
        iif lo accept
ct state invalid drop spuckt "Error: syntax error, unexpected state, expecting helper" und
iif lo accept spuckt "Error: syntax error, unexpected iif" aus

Warum ist der Syntax falsch? Schnall ich nicht :?

mat6937
Beiträge: 2927
Registriert: 09.12.2014 10:44:00

Re: nftables für Anfänger

Beitrag von mat6937 » 22.08.2020 11:27:51

MoritzJ hat geschrieben: ↑ zum Beitrag ↑
21.08.2020 23:27:02
kriege jetzt beim starten 2 Fehlermeldungen:

Code: Alles auswählen

        # Allow all incomming established and related traffic. Drop invalid traffic.
        ct state established,related accept
        ct state invalid drop

        # Allow loopback.
        iif lo accept
ct state invalid drop spuckt "Error: syntax error, unexpected state, expecting helper" und
iif lo accept spuckt "Error: syntax error, unexpected iif" aus

Warum ist der Syntax falsch? Schnall ich nicht :?
Evtl. ist ja auch nicht die Syntax, sondern der Zustand. Versuch mal mit geänderter Reihenfolge:

Code: Alles auswählen

iif lo accept
ct state invalid drop
ct state established,related accept

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 22.08.2020 12:50:07

Habs ausprobiert, aber die Fehlermeldungen bleiben:

Code: Alles auswählen

iif lo accept
ct state invalid drop
ct state established,related accept
ergibt 2 Fehlermeldungen
Error: syntax error, unexpected state, expecting helper
(2. Zeile)
Error: syntax error, unexpected state, expecting helper
(3. Zeile)

Könnte es sein, dass ich weitere Module für den Kernel brauche oder sowas in der Art?

Nachtrag
Wenn ich die drei Zeilen generell deaktiviere dann kriege ich n Syntax Fehler weiter unten bei den TCP Flags Zeilen :?

Nachtrag 2:
Fehler gefunden und behoben. Hatte durch ein Installationsscript oben eine Variable anstatt die IP drinnen, das hat alles durcheinander gebracht :facepalm:

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: nftables für Anfänger

Beitrag von wanne » 22.08.2020 13:39:18

ct state invalid drop spuckt "Error: syntax error, unexpected state, expecting helper" und
iif lo accept spuckt "Error: syntax error, unexpected iif" aus

Warum ist der Syntax falsch? Schnall ich nich
Gerade nochmal ausprobiert. Bei mir frisst er das problemlos.
rot: Moderator wanne spricht, default: User wanne spricht.

MoritzJ
Beiträge: 13
Registriert: 19.08.2020 20:17:07

Re: nftables für Anfänger

Beitrag von MoritzJ » 22.08.2020 13:44:45

wanne hat geschrieben: ↑ zum Beitrag ↑
22.08.2020 13:39:18
ct state invalid drop spuckt "Error: syntax error, unexpected state, expecting helper" und
iif lo accept spuckt "Error: syntax error, unexpected iif" aus

Warum ist der Syntax falsch? Schnall ich nich
Gerade nochmal ausprobiert. Bei mir frisst er das problemlos.
hatte meinen Beitrag editiert ... ich erstelle die conf Datei via Bash Script und hatte dort einen Syntaxfehler drinnen

anstatt

Code: Alles auswählen

define privateip = {1.1.1.1}
hatte ich

Code: Alles auswählen

define privateip = {$clientip}
in der finalen conf Datei, das hat bei mir zu Fehlern geführt. Danke für eure Hilfe!

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: nftables für Anfänger

Beitrag von wanne » 22.08.2020 13:46:55

Ansonsten mir hat die erste Variante eigentlich von der Idee her sehr gut gefallen. Du hast schlicht am input gefiltert. Jetzt merkst du dir die Verbindungen die du am input zugelassen hast damit du die Antworten am output auch wieder zulassen kannst. Es mag die üblichere Variante sein ich finde sie trotzdem nicht sinnvoller. Am Ende ist die Funktionalität sehr ähnlich und du hast doppelt so viele regeln die dem System doppelt so viel Arbeit machen.
Aber grundsätzlich ist das sinnvoll.
rot: Moderator wanne spricht, default: User wanne spricht.

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: nftables für Anfänger

Beitrag von wanne » 22.08.2020 13:49:14

Ah und nochmal was du hast dhcp gefiltert IPv6 autoconfiguration aber nicht. Hast du die IPv4 Adresse statisch konfiguriert aber die IPv6 nicht?
rot: Moderator wanne spricht, default: User wanne spricht.

Antworten