B.1 Firewall und Proxy-Server (iptables / privoxy)
Die meisten nutzen eine Firewall "nur" um sich vor "Außen" zu schützen. Dies ist in jedem Fall sinnvoll und meistens auch notwendig. Ja, die heutigen (privaten) DSL-Router haben auch eine FW integriert, die meist standardmäßig bereits aktiviert ist. Dies merkt man schnell daran, wenn man sich das Log der eigenen FW ansieht und keinen einzigen DROP über Tage hinweg sieht, obwohl wir alle wissen wieviele Portscans dauernd laufen. Nur - ich traue keiner TeleKom-Huawei-Schüssel. Außerdem ist die Konfiguration für den Schutz vor dem bösen Internet noch der einfachste Part, selbst wenn man ein, zwei Ports für einen Server freischalten muss.
Die wenigsten nutzen die FW aber um sich vor dem Feind von "Innen" zu schützen - Programme die "nach Hause telefonieren" wollen. Ich werde in diesem Post für beides die nötigen Konfigurations-Schritte präsentieren. Ich fange aber mit dem Proxy-Server an. Warum ? Weil die FW danach so konfiguriert wird, dass nur der Proxy auswärtige Web-Seiten besuchen darf. Sprich, jedes Programm, das über Port 80 oder 443 versucht direkt ins Internet zu gehen, wird abgewiesen (und protokolliert). Der Proxy selbst protokolliert ebenfalls alle von ihm besuchten Seiten. Es gibt verschiedene Proxy-Server; ich nutze seit Jahren den "Privoxy" - weil er einfach ist und nur das macht was ich will: Mich ein wenig vor schlimmen Webseiten beschützen. Wenn Du einen anderen Proxy (wie z.B. den squid) haben willst, nimm diesen. Aber ohne einen Proxy macht das ganze Filtern von ausgehenden Traffic gar keinen Sinn, weil ja ein "böses" Programm dann jederzeit über Port 443 raus kann und Du dieses nicht bemerken wirst. Ohne Proxy schützt Dich Deine FW nur vor Traffic aus dem Internet.
I. Privoxy installieren und konfigurieren
Siehe auch: https://wiki.gentoo.org/wiki/Privoxy
Code: Select all
# emerge -pvD privoxy
# rc-update add privoxy default
# nano -w /etc/env.d/99myproxy
=>
export http_proxy="http://127.0.0.1:8118"
export https_proxy="http://127.0.0.1:8118"
<=
# env-update
# less /etc/passwd
-> notice privoxy UID for laterCode: Select all
################
#
# Cautious settings -- safe for all sites, but offer little privacy protection
#
{ \
+change-x-forwarded-for{block} \
[...]
+set-image-blocker{blank} \
}
standard.Cautious
################
#
# Medium settings -- safe for most sites, with reasonable protection/damage tradeoff
#
{ \
+change-x-forwarded-for{block} \
[...]
+set-image-blocker{blank} \
}
standard.Medium
################
#
# Advanced settings -- reasonable privacy protection but
[...]Danach solltest / kannst Du das Logging noch aktivieren, welches standardmäßig auch komplett ausgeschaltet ist - und zwar in der /etc/privoxy/config. Das ist so einfach und selbsterklärend, da spare ich mir (unnötige) Erklärungen (in 4 Zeilen den # entfernen).
Fertig. Privoxy kann mit "/etc/init.d/privoxy start" sofort gestartet werden.
II. Iptables installieren und konfigurieren
Dies ist ein "klein" wenig aufwendiger. Zuerst solltest Du im Kernel ALLE FW-Module als <M>odul konfiguriert (und natürlich auch compiliert) haben. Gemeinerweise, kommt man erst an alle, wenn folgender Punkt gesetzt ist:
Code: Select all
Networking support > Networking options > Network packet filtering framework (Netfilter)
[*] Advanced netfilter configurationCode: Select all
Networking support > Networking options > Network packet filtering framework (Netfilter) > Core Netfilter Configuration
[M] "owner" match support
[M] "state" match supportCode: Select all
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) --->
[*] Advanced netfilter configuration
Core Netfilter Configuration --->
IP: Netfilter Configuration --->Leider wollen wir schon auch nach draußen telefonieren. Das müssen wir alles einzeln erlauben. Aber keine Panik, so viel ist das auch nicht, da das meiste über unseren Privoxy läuft. Was brauchen wir sonst noch ? DNS, E-Mail, evtl SSH.
Noch ein Wort zum Thema "Skript welches die FW-Regeln aktiviert". Einige verteufeln dieses Vorgehen, da es (unter gewissen Umständen) absolut unsicher sein soll. Ja, aber nicht in diesem - einfachen - Fall, den ich nutze. Wenn zuerst alles gesperrt wird und danach, nach und nach einiges freigeschaltet wird, ist ein Abbruch eines Skripts (wegen z.B. Tippfehler oder fehlendem Kernel-Modul) deswegen unkritisch, weil dann halt nichts mehr freigeschaltet wird. Wenn es am Anfang in der Variablen-Definition abbricht, ändert sich die bisherige FW-Konfiguration überhaupt nicht. Außerdem überprüfen wir natürlich sofort mit "iptables -L -v -n" ob unsere Konfiguration auch vollständig übernommen wurde (die gleiche Überprüng machst Du auch nach jeder Änderung im Skript). Ansonsten ist für das Laden der FW-Konfig beim Systemstart der /etc/init.d/iptables zuständig (dieser sichert selbst die FW-Konfig beim Shutdown). Das bedeutet, das Skript muß nur einmal ausgeführt werden für die initiale Konfiguration, oder halt dann wieder, wenn Du Regeln änderst, ergänzt oder löscht.
So, jetzt gehts aber los. Zuerst wie immer ein Link:
https://wiki.gentoo.org/wiki/Iptables
Code: Select all
# emerge -pvD iptables
- gather some information for needed services; e.g. ping your E-Mail-Provider
- search for your used DNS-Server in ->
# less /etc/resolv.conf
- search for your used NTP-Server in ->
# less /etc/conv.d/ntp-client
- ping all of them to get their IP-adress
# cd /etc/MY
# nano -w fwrules-big.sh
! copy/paste from below and edit some variables
! if your are unsure comment out some lines with #
- save and exit
# chmod 0700 fwrules-hal.sh
# ./fwrules-hal.sh
- check if there where an error, then check your new konfig with ->
# iptables -L -v -n
- dont wait until the next shutdown and save the config right now, with:
# /etc/init.d/iptables save
# rc-update add iptables default
OPT:
# rc-update add sshd default
# lsmod
-> write down the used modules (you already know this from A.2)https://de.wikipedia.org/wiki/Stateful_ ... Inspection
Wenn Du schnell mal wissen willst, welcher Dienst auf einem bestimmten Port läuft, kannst Du Dir entweder die /etc/services ansehen, oder umfassender:
https://de.wikipedia.org/wiki/Liste_der ... rten_Ports
Diesen Pocket Guide empfehle ich zusätzlich:
https://linuxbg.eu/books/Linux Iptables Pocket Reference.pdf
oder dies hier:
https://lewestech.com/mirrors/www.iptab ... tents.html
Code: Select all
#!/bin/sh
set -eu
#
# 2017.02.10: Initial FireWall-Sript for: big
# 2017.02.15: allow out server wesnoth game
# 2022.01.01: Allow IRC to Libera
#
### Defines ###
# define general logging
logit="-j LOG --log-prefix"
# define privoxy uid from /etc/passwd
privoxy_uid="--uid-owner 104"
# change this NUMBER 104 TO YOUR UID
# define addresses and ports
ip_gw="192.168.2.1" # My DSL-Router
ip_dns1="a.b.c.d" # free dns-server1: xxxxxx
ip_dns2="a.b.c.d" # free dns-server2: xxxxxx
ip_ntp="192.53.103.108" # time-server: ptbtime1.ptb.de
ip_hal="192.168.2.3" # local Notebook hal
ip_guest="192.168.2.101" # if Notebook boots with dhcp
# ip_dnssec1="185.95.218.42" # free dns-server: Digitale Gesellschaft (CH)
# ip_dnssec2="185.95.218.43" # free dns-server: Digitale Gesellschaft (CH)
### Basic Settings ###
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### Firewall In ###
# accept some ICMP (or comment out if not desired)
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
# accept SSH IN from notebook hal without logging
iptables -A INPUT -s ${ip_hal} -p tcp --dport 22 -j ACCEPT
# accept and log SSH IN from guest
iptables -A INPUT -s ${ip_guest} -p tcp --dport 22 ${logit} "!!! ACCEPT IN SSH GUEST "
iptables -A INPUT -s ${ip_guest} -p tcp --dport 22 -j ACCEPT
# drop some stuff (if you have WINDOWS in your network) without logging
#iptables -A INPUT -p udp --dport 137 -j DROP # netbios-ns
#iptables -A INPUT -p udp --dport 138 -j DROP # netbios-dgm
#iptables -A INPUT -p udp --dport 67 -j DROP
#iptables -A INPUT -p udp --dport 68 -j DROP
iptables -A INPUT -p 2 -j DROP # stuff from router
# drop some stuff from dnssec-servers without logging
# This was needed with old version of unbound.
# With version 1.15 there are no more dead packets to drop
# and you dont need these drops.
#iptables -A INPUT -s ${ip_dnssec1} -j DROP
#iptables -A INPUT -s ${ip_dnssec2} -j DROP
# drop some bad sites without logging
#iptables -A INPUT -s a.b.c.d -j DROP
#iptables -A INPUT -s a.b.c.d -j DROP
# log all other
iptables -A INPUT ${logit} "!!! DROP "
# we dont need an extra DROP, because the standard action for INPUT is DROP (see above: "iptables -P INPUT DROP")
### Firewall Out ###
# accept all https / http (maybe we need sometimes http-alt) from privoxy
iptables -A OUTPUT -p tcp --dport 443 -m owner ${privoxy_uid} -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m owner ${privoxy_uid} -j ACCEPT
#iptables -A OUTPUT -p tcp --dport 8080 -m owner ${privoxy_uid} -j ACCEPT
#iptables -A OUTPUT -p tcp --dport 8085 -m owner ${privoxy_uid} -j ACCEPT
# accept dns
iptables -A OUTPUT -d ${ip_dns1} -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -d ${ip_dns1} -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -d ${ip_dns2} -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -d ${ip_dns2} -p tcp --dport 53 -j ACCEPT
# accept dnssec
#iptables -A OUTPUT -d ${ip_dnssec1} -p tcp --dport 853 -j ACCEPT
#iptables -A OUTPUT -d ${ip_dnssec2} -p tcp --dport 853 -j ACCEPT
# Here you have to edit something
# accept mail
#iptables -A OUTPUT -d a.b.c.d -p tcp --dport 995 -j ACCEPT # pop3s XXXXXXX
#iptables -A OUTPUT -d a.b.c.d -p tcp --dport 587 -j ACCEPT # smtp XXXXXXXX
#iptables -A OUTPUT -d a.b.c.d -p tcp --dport 465 -j ACCEPT # ssmtp XXXXXXXXX
# accept ntp to time-server
iptables -A OUTPUT -d ${ip_ntp} -p udp --dport 123 -j ACCEPT
###
### INSERT HERE from post nr. 6 if you want accept IRC to libera
###
# accept IRC to XXXXXXX
#iptables -A OUTPUT -d a.b.c.d -p tcp --dport 6697 -j ACCEPT
# accept server wesnoth
iptables -A OUTPUT -d 95.217.86.148 -j ACCEPT
# accept and log pings
iptables -A OUTPUT -p icmp --icmp-type 8/0 ${logit} "!!! ACCEPT OUT PING "
iptables -A OUTPUT -p icmp --icmp-type 8/0 -j ACCEPT
# accept and log ssh only to my stations in my local network
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 22 ${logit} "!!! ACCEPT OUT SSH "
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 22 -j ACCEPT
# accept and log hkp (pgp-key-server)
iptables -A OUTPUT -p tcp --dport 11371 ${logit} "!!! ACCEPT OUT HKP "
iptables -A OUTPUT -p tcp --dport 11371 -j ACCEPT
# accept and log traceroute
iptables -A OUTPUT -p udp --dport 33434:33524 ${logit} "!!! ACCEPT OUT TRCR "
iptables -A OUTPUT -p udp --dport 33434:33524 -j ACCEPT
# accept and log rsync (should be portage from gentoo only)
iptables -A OUTPUT -p tcp --dport 873 ${logit} "!!! ACCEPT OUT RSYNC "
iptables -A OUTPUT -p tcp --dport 873 -j ACCEPT
# accept and log whois
iptables -A OUTPUT -p tcp --dport 43 ${logit} "!!! ACCEPT OUT WHOIS "
iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT
###################################################
# for testing only !!!
# accept and log all https
#iptables -A OUTPUT -p tcp --dport 443 ${logit} "!!! ACCEPT OUT ALL HTTPS "
#iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
# for testing only !!!
# accept and log all http
#iptables -A OUTPUT -p tcp --dport 80 ${logit} "!!! ACCEPT OUT ALL HTTP "
#iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
# for testing only !!!
# accept and log all (dont use !!!)
#iptables -A OUTPUT ${logit} "!!! ACCEPT OUT ALL "
#iptables -A OUTPUT -j ACCEPT
###################################################
# Reject some stuff without logging
#iptables -A OUTPUT -d a.b.c.d -j REJECT
#iptables -A OUTPUT -d a.b.c.d -j REJECT
# reject and log all other
iptables -A OUTPUT ${logit} "!!! REJECT "
iptables -A OUTPUT -j REJECTMit "iptables -Z" kannst Du die Zähler der Pakete auf Null zurücksetzen und dann mit "iptables -L -v -n" wieder nachschauen welche Zähler von welchen Regeln wieder hochgehen.
Zu guter letzt, solltest Du Deinem Lieblings-Browser auch noch vom neuen Proxy erzählen. Mein "Falkon" hat das sogar automatisch gemerkt und ich musste ihm gar nichts mehr mitteilen. Falls Du "wget" nutzt, könnte es auch da notwendig sein, den Proxy zu konfigurieren (der heutige wget liest die Umgebungsvariablen aus und übernimmt dann selbst die Proxy-Einstellungen). Aber keine Sorge, ab jetzt siehst Du sofort, wenn jemand raus will ... aber nicht kann ...
Have Fun.
Edit 2021-10-08: Ich wurde gefragt warum ich das "alte" iptables anstatt dem "modernen" nftables verwende. Dies hat drei Gründe:
1. Wer iptables nicht versteht, wird nftables erst recht nicht verstehen. Wenn Du iptables verstanden hast, ist die Umstellung auf nftables lediglich eine geänderte Syntax und Du lachst über die einfache Umstellung (gut, es gibt noch ein paar Unterschiede: Es gibt keine vorkonfigurierten tables wie INPUT, OUTPUT oder FORWARD und Du musst alles in einer Tabellen-Definition unterbringen und kannst nicht mehr zuerst das Loopback freischalten um dann später die jeweilgen Regeln für z.B. Input getrennt definieren. Die Prinzipien sind jedoch identisch.)
2. Da ich nur IPv4 verwende habe ich keine Notwendigkeit zusätzlich zu iptables noch ip6tables verwenden zu müssen. Wer beide Protokolle als Dual-Stack verwendet, der sollte wirklich gleich zu nftables greifen, da hier alles "unter einem Dach" konfiguriert werden kann (und muss).
3. Der Hauptgrund ist aber die Stabilität und wie ausgereift die beiden jeweils sind. Aktuell wurde nftables jetzt erst am 27.08.2021 auf die Version 1.0 gehoben. Außerdem beobachte ich die Kernel-Entwicklung und die Anzahl der Patches zu beiden ... Was Du vielleicht nicht weisst, nftables nutzt im Kernel eine eigene virtuelle Maschine ... die mir auch lange Zeit sehr suspekt war. Vielleicht interessiert Dich dieser Artikel der über einiges aufklärt:
https://lwn.net/Articles/867185/
Edit 2022-04-07: 4. Soeben wurden wieder zwei Sicherheitslücken in nftables entdeckt: https://lwn.net/ml/oss-security/1b17676 ... gmail.com/
Edit 2024-05-31: 5. Warum mit alte und ausgereifte Software lieber ist, als neue ... ja es ist nf_tables: https://www.heise.de/news/Linux-Luecke- ... 42699.html
Ja, ich weiß dass nftables die Zukunft ist und ich werde deshalb sicherlich auch mal einen Artikel dazu schreiben. Im Moment sehe ich aber noch nicht den Bedarf. Falls Du mit nftables spielen willst, gebe ich Dir vorab schon mal diese Links:
https://wiki.nftables.org/wiki-nftables ... o_nftables
https://wiki.nftables.org/wiki-nftables ... /Main_Page
Falls Du auch IPv6 nutzen solltest, ist dieser Link hilfreich:
https://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch18s05.html
.

