Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Eigene Firewall mit GeoIP und Ratelimit
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
schmidicom
Veteran
Veteran


Joined: 09 Mar 2006
Posts: 1921
Location: Schweiz

PostPosted: Sun Jan 16, 2022 11:53 am    Post subject: Eigene Firewall mit GeoIP und Ratelimit Reply with quote

Ich betreue den einen oder anderen Server dessen Dienste aus dem Internet erreichbar sein müssen und wie es heutzutage halt so ist dauert es leider nicht lange bis so was unerwünschte Aufmerksamkeit generiert.
Bis jetzt habe ich immer versucht das mit ziemlich einfachen Firewall-Regeln (z.B. "Was nicht explizit verboten ist kommt durch") abzuwehren, nur reicht das halt bei weitem nicht mehr aus. Vor allem bei diesen ganzen Botnetzen ist man mit dieser Vorgehensweise einfach das Opfer schlecht hin. Um das in Zukunft etwas besser zu machen habe ich mich mal ran gesetzt und eine neue Firewall geschrieben (siehe unten), die aber noch nicht aktiv ist weil ich mir nicht sicher bin ob das was ich da gebaut habe auch wirklich was taugt.

Was haltet ihr so von meinem kleinen Entwurf?
Würdet ihr was anders machen, und wenn ja was?
Code:
#!/sbin/nft -f

# Alle alten Regeln löschen
flush ruleset

# GeoIP-Daten laden
include "/var/db/geoipsets/maxmind/nftset/ipv4/*.ipv4"
include "/var/db/geoipsets/maxmind/nftset/ipv6/*.ipv6"

# MY-Firewall einrichten
table inet mgdom {
   # Länderbasierte IPv4-Whitelist erstellen
   set country-ipv4-whitelist {
      type ipv4_addr
      flags interval
      elements = { $CH.ipv4, $DE.ipv4, $FR.ipv4, $AT.ipv4, $IT.ipv4 }
   }
   # Länderbasierte IPv6-Whitelist erstellen
   set country-ipv6-whitelist {
      type ipv6_addr
      flags interval
      elements = { $CH.ipv6, $DE.ipv6, $FR.ipv6, $AT.ipv6, $IT.ipv6 }
   }
   # Liste mit privaten IPv4-Adressen
   set private-ipv4 {
      type ipv4_addr
      flags interval
      elements = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }
   }
   # Liste mit privaten IPv6-Adressen
   set private-ipv6 {
      type ipv6_addr
      flags interval
      elements = { fc00::/7 }
   }
   
   # MY-Filterkette
   chain mgdom_filter {
      type filter hook input priority 0; policy drop;
      # Alles vom loopback-Device akzeptieren
      iifname lo accept
      # Alle Verbindungen aus dem lokalen LAN akzeptieren
      ip saddr @private-ipv4 accept
      ip6 saddr @private-ipv6 accept
      # Alle etablierten oder erwarteten Verbindungen akzeptieren
      ct state { established, related } accept
      # Alle Verbindungen von erlaubten öffentlichen IP-Adressen
      # die das Ratelimit nicht überschreiten akzeptieren
      ip saddr @country-ipv4-whitelist \
         ct state new \
         limit rate 3/minute \
         counter \
         accept
      ip6 saddr @country-ipv6-whitelist \
         ct state new \
         limit rate 3/minute \
         counter \
         accept
   }
}

- https://github.com/schmidicom/schmidicom-overlay/tree/master/dev-python/geoipsets
- https://github.com/chr0mag/geoipsets
Back to top
View user's profile Send private message
mike155
Advocate
Advocate


Joined: 17 Sep 2010
Posts: 4438
Location: Frankfurt, Germany

PostPosted: Sun Jan 16, 2022 5:07 pm    Post subject: Reply with quote

Vom Prinzip her sieht das sehr elegant aus. Danke fürs Posten!
  1. Eine solche Firewall man sollte noch mit Gut- und Schlechtfällen prüfen. Aber das wirst Du vermutlich sowieso machen?
  2. Die wesentlichen Elemente sind alle vorhanden: Loopback erlauben, lokalen Verkehr erlauben, established/related erlauben und dann Regeln für den WAN Verkehr. Sieht also gut aus!
  3. Reicht fc00::/7 für den lokalen IPv6 Verkehr?
  4. Ich persönlich würde vermutlich den ingress WAN Verkehr noch weiter bis auf Port-Ebene filtern. Aber das hängt natürlich davon ab, wie weit man es treiben will.
  5. Ich würde auch den ausgehenden Verkehr filtern - um zu verhindern, dass Programme nach Hause telefonieren oder andere unliebsame Verbindungen aufbauen.
  6. Außerhalb von der Firewall-Regeln schreibe ich meistens noch ein paar Werte in die /proc/sys-Dateien. Ich nehme an, dass Du das in einem eigenen Script machst?
Wirklich hübsch! Ich kann mir vorstellen, dass das funktioniert!
Back to top
View user's profile Send private message
schmidicom
Veteran
Veteran


Joined: 09 Mar 2006
Posts: 1921
Location: Schweiz

PostPosted: Sun Jan 16, 2022 5:23 pm    Post subject: Reply with quote

@mike155

zu:
1. Ich weiss jetzt nicht genau was du damit meinst.
2. Danke.
3. Ich habe auf Wikipedia nachgesehen was der private Bereich für IPv6 ist, das ist das Ergebnis. Demnach hoffe ich einfach das es passt.
4. Da der Server hinter einer NAT steht, die eh nur ausgewählte Ports durchlässt, habe ich die Ports bei den Regeln weggelassen.
5. Werde ich vielleicht auch irgendwann machen, aber fürs erste soll mal eingehend möglichst ordentlich gefiltert werden.
6. Welche Optionen genau meinst du?
Back to top
View user's profile Send private message
mike155
Advocate
Advocate


Joined: 17 Sep 2010
Posts: 4438
Location: Frankfurt, Germany

PostPosted: Mon Jan 17, 2022 9:00 pm    Post subject: Reply with quote

zu:
1) na ja, man schickt Pakete, die durchgehen sollen - und prüft, ob sie auch durchgehen. Und man schickt Pakete, die nicht durchgehen sollen und prüft, ob sie auch wirklich nicht durchgehen.

3) IPv6 Firewalls sind nicht ganz einfach. Eine richtig gute Anleitung habe ich noch nicht gefunden.

Jedenfalls scheint mir fc00::/7 deutlich gering zu sein. Ich verwende diesen Bereich gar nicht. Bei mir läuft der Verkehr über:
  1. Link Local Unicast Adressen aus dem Bereich: fe80::/10
  2. Global Unicast Adressen aus dem Bereich: 2000::/3. Alles innerhalb des vom Router zugewiesenen Präfix-Bereichs ist lokal, der Rest nicht-lokal
  3. Multicast Adressen aus dem Bereich: ff00::/8
6) Ich kopiere die Anweisungen aus meinen diversen Firewalls - ohne Anspruch auf Vollständigkeit. Manches ist vielleicht auch schon veraltet. Die Regeln sollten also keinesfalls so übernommen werden! Mit Google findet man aber recht schnell Anleitungen, in denen sie erklärt werden. Dann kann man entscheiden, was man braucht - und was nicht.

Personal Firewall ohne Routing:
Code:
echo '0' >/proc/sys/net/ipv4/conf/default/forwarding
echo '0' >/proc/sys/net/ipv4/ip_dynaddr
echo '1' >/proc/sys/net/ipv4/route/flush

echo '0' >/proc/sys/net/ipv6/conf/default/forwarding
echo '1' >/proc/sys/net/ipv6/route/flush

IPv4 Firewall/Router:
Code:
echo '0'           >/proc/sys/net/ipv4/ip_forward
echo '0'           >/proc/sys/net/ipv4/ip_dynaddr
echo '1'           >/proc/sys/net/ipv4/tcp_syncookies
echo '0'           >/proc/sys/net/ipv4/tcp_ecn
echo '1'           >/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo '0'           >/proc/sys/net/ipv4/icmp_echo_ignore_all
echo '1'           >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo '5'           >/proc/sys/net/ipv4/icmp_ratelimit
echo '30'          >/proc/sys/net/ipv4/ipfrag_time
echo '20000 59999' >/proc/sys/net/ipv4/ip_local_port_range

for i in /proc/sys/net/ipv4/conf/*
    do
        echo  '1' >$i/log_martians
        echo  '0' >$i/bootp_relay
        echo  '0' >$i/forwarding
        echo  '0' >$i/proxy_arp
        echo  '1' >$i/secure_redirects
        echo  '0' >$i/accept_redirects
        echo  '0' >$i/accept_source_route
        echo  '1' >$i/rp_filter
    done

# Firewall-Regeln setzen

echo '1' >/proc/sys/net/ipv4/ip_forward
echo '1' >/proc/sys/net/ipv4/ip_dynaddr


PS: falls jemand ein gutes und aktuelles Buch (oder eine gute Anleitung) zum Thema IPv6 Firewalls mit Netfilter kennt, wäre ich sehr daran interessiert. Ich habe schon mehrfach gesucht - aber noch nichts gefunden.
Back to top
View user's profile Send private message
schmidicom
Veteran
Veteran


Joined: 09 Mar 2006
Posts: 1921
Location: Schweiz

PostPosted: Tue Jan 18, 2022 9:00 am    Post subject: Reply with quote

Danke für die Rückmeldung, ich werde mir das dann bei Gelegenheit genauer ansehen.
Fürs erste poste ich jetzt hier aber mal die überarbeitete Version meiner Firewall. Sie ist nun spezifischer auf den einen Server angepasst wo sie zum Einsatz kommen soll, das Ratelimit-Teil ist etwas verbessert und die IPv6-Sachen sind auch angepasst.
Code:

#!/sbin/nft -f

# Alle alten Regeln löschen
flush ruleset

# GeoIP-Daten laden
include "/var/db/geoipsets/maxmind/nftset/ipv4/*.ipv4"
#include "/var/db/geoipsets/maxmind/nftset/ipv6/*.ipv6"

# MGDOM-Firewall einrichten
table inet mgdom {
   # Länderbasierte IPv4-Whitelist erstellen
   set country-ipv4-whitelist {
      type ipv4_addr
      flags interval
      elements = { $CH.ipv4, $DE.ipv4, $FR.ipv4, $AT.ipv4, $IT.ipv4 }
   }
   # Länderbasierte IPv6-Whitelist erstellen
   #set country-ipv6-whitelist {
      #type ipv6_addr
      #flags interval
      #elements = { $CH.ipv6, $DE.ipv6, $FR.ipv6, $AT.ipv6, $IT.ipv6 }
   #}
   # Liste mit lokalen IPv4-Adressen
   set local-ipv4 {
      type ipv4_addr
      flags interval
      elements = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }
   }
   # Liste mit lokalen IPv6-Adressen
   set local-ipv6 {
      type ipv6_addr
      flags interval
      elements = { fc00::/7, fe80::/10 }
   }

   # Liste von Clients die das Ratelimit überschreiten
   set ratelimit_exceededlist_ipv4 {
        type ipv4_addr
        flags dynamic, timeout
        timeout 15m
   }
   
   # MGDOM-Filterkette
   chain mgdom_filter {
      type filter hook input priority 0; policy drop;
      # Alles vom loopback-Device akzeptieren
      iifname lo accept
      
      # Alle Verbindungen aus dem lokalen LAN akzeptieren
      ip saddr @local-ipv4 accept
      ip6 saddr @local-ipv6 accept
      
      # Alle etablierten oder erwarteten Verbindungen akzeptieren
      ct state { established, related } accept

      # Bots die das OpenVPN-Ratelimit überschreiten
      # in das Set "ratelimit_exceededlist_ipv4" aufnehmen
      udp dport 1194 \
         ip saddr @country-ipv4-whitelist \
         ip saddr != @ratelimit_exceededlist_ipv4 \
         ct state new \
         limit rate over 3/minute \
         log prefix "Ratelimit Exceeded: " \
         add @ratelimit_exceededlist_ipv4 { ip saddr }
      
      # Alle OpenVPN-Verbindungen von erlaubten öffentlichen
      # IP-Adressen die das Ratelimit nicht überschreiten akzeptieren
      udp dport 1194 \
         ip saddr @country-ipv4-whitelist \
         ip saddr != @ratelimit_exceededlist_ipv4 \
         ct state new \
         accept
   }
}


- https://www.ripe.net/manage-ips-and-asns/ipv6/ipv6-address-types/ipv6addresstypes.pdf
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum