View previous topic :: View next topic |
Author |
Message |
schmidicom Veteran
Joined: 09 Mar 2006 Posts: 1970 Location: Schweiz
|
Posted: Sun Jan 16, 2022 11:53 am Post subject: Eigene Firewall mit GeoIP und Ratelimit |
|
|
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 |
|
|
mike155 Advocate
Joined: 17 Sep 2010 Posts: 4438 Location: Frankfurt, Germany
|
Posted: Sun Jan 16, 2022 5:07 pm Post subject: |
|
|
Vom Prinzip her sieht das sehr elegant aus. Danke fürs Posten!
- Eine solche Firewall man sollte noch mit Gut- und Schlechtfällen prüfen. Aber das wirst Du vermutlich sowieso machen?
- 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!
- Reicht fc00::/7 für den lokalen IPv6 Verkehr?
- 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.
- Ich würde auch den ausgehenden Verkehr filtern - um zu verhindern, dass Programme nach Hause telefonieren oder andere unliebsame Verbindungen aufbauen.
- 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 |
|
|
schmidicom Veteran
Joined: 09 Mar 2006 Posts: 1970 Location: Schweiz
|
Posted: Sun Jan 16, 2022 5:23 pm Post subject: |
|
|
@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 |
|
|
mike155 Advocate
Joined: 17 Sep 2010 Posts: 4438 Location: Frankfurt, Germany
|
Posted: Mon Jan 17, 2022 9:00 pm Post subject: |
|
|
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:
- Link Local Unicast Adressen aus dem Bereich: fe80::/10
- Global Unicast Adressen aus dem Bereich: 2000::/3. Alles innerhalb des vom Router zugewiesenen Präfix-Bereichs ist lokal, der Rest nicht-lokal
- 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 |
|
|
schmidicom Veteran
Joined: 09 Mar 2006 Posts: 1970 Location: Schweiz
|
Posted: Tue Jan 18, 2022 9:00 am Post subject: |
|
|
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 |
|
|
|
|
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
|
|