Sätt upp en brandvägg i Debian 9 med iptables

Introduktion

Att ha en fungerande brandvägg på servern är ett viktigt steg i säkerhetsarbetet. I den här guiden kommer vi att skapa en grundläggande brandvägg som du sedan kan bygga vidare på med egna regler. Guiden utgår från en nyinstallerad Cloud VPS med Debian 9. Om du vill sätta upp en brandvägg i Debian 11 har vi en guide för det här: Sätt upp en brandvägg i Debian 11 med nftables

I den här guiden visar vi dig hur du konfigurerar en brandvägg med iptables, som vanligtvis ingår som standard i äldre Debian-distributioner.

Installera brandväggstjänsten


För att komma igång behöver du installera paketen iptables-persistent och netfilter-persistent om du inte gjort det redan. Det gör det möjligt att spara våra regler och applicera dem automatiskt vid uppstart.

Börja med att uppdatera paketlistorna:

root@host:~#: apt update

Installera iptables och netfilter-persistent med följande kommando:

root@host:~#: apt install netfilter-persistent iptables-persistent

Under installationen kommer du att tillfrågas om du vill spara de genererade reglerna. Välj “yes” här. Vi kommer att redigera reglerna inom kort.

Skapa regler i brandväggen


För att komma igång så snabbt som möjligt kommer vi att kopiera och klistra in färdiga brandväggsregler. Senare i guiden visar vi dig hur du lägger till nya regler.

För att lägga till brandväggsreglerna kommer vi att redigera filerna /etc/iptables/rules.v4 och /etc/iptables/rules.v6 för IPv4 respektive IPv6.

Öppna filen rules.v4 i din texteditor (använd sudo-rättigheter om du inte är root)

root@host:~#: nano /etc/iptables/rules.v4

Filen som öppnas innehåller något liknande det här:

# Generated by iptables-save v1.6.0 on Fri Oct 26 12:20:01 2018
*raw
:PREROUTING ACCEPT [446:35987]
:OUTPUT ACCEPT [318:52605]
COMMIT
# Completed on Fri Oct 26 12:20:01 2018
...

Ersätt detta med följande konfiguration. Glöm inte att lägga till din servers IP-adress där det står <SERVERNS IPv4-ADRESS>:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#default
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -s <SERVERNS IPv4-ADRESS>/32 -j ACCEPT
-A OUTPUT -d <SERVERNS IPv4-ADRESS>/32 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
# TRACEROUTE
-A INPUT -p udp -m udp --dport 33434:33523 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 33434:33523 -j ACCEPT
#DNS OUT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
#NTP OUT (time sync)
-A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
# SSH IN
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# allow http(s) in
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# allow http()s out
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
COMMIT

Spara och stäng filen.

Starta om netfilter-persistent för att ladda in konfigurationen:

root@host:~#: systemctl restart netfilter-persistent

Kontrollera att iptables har läst in konfigurationen:

root@host:~# iptables -L

Du ska få ett resultat liknande det här:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  <SERVERNS IPv4-ADRESS>-static.glesys.net  anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpts:33434:33523
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             <SERVERNS IPv4-ADRESS>-static.glesys.net
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpts:33434:33523
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset

Vi har nu sparat reglerna i filen /etc/iptables/rules.v4 som låter iptables använda dem.

Med hjälp av reglerna ovan tillåter vi inkommande trafik för traceroute, ICMP (PING), SSH, HTTP och HTTPS samt utgående trafik för traceroute, HTTP och HTTPS.

Med hjälp av iptables-persistent och netfilter-persistent kommer inställningarna att laddas in varje gång du startar om servern.

Lägg till regler för IPv6


Har du även en IPv6 adress på din server så lägger du till regler på samma sätt som ovan fast i filen /etc/iptables/rules.v6. Glöm inte att ersätta <SERVERNS IPv6-ADRESS> med din egen IP-adress.

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#default
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -s <SERVERNS IPv6-ADRESS>/128 -j ACCEPT
-A OUTPUT -d <SERVERNS IPv6-ADRESS>/128 -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A OUTPUT -p ipv6-icmp -j ACCEPT
# TRACEROUTE
-A INPUT -p udp -m udp --dport 33434:33523 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 33434:33523 -j ACCEPT
#DNS OUT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
#NTP OUT (time sync)
-A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
# SSH IN
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# allow http(s) in
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# allow http()s out
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
COMMIT

Starta om netfilter-persistent för att ladda in konfigurationen:

root@host:~#: systemctl restart netfilter-persistent

Lägg till regler via kommandoraden


Du kan lägga till nya regler antingen genom att redigera /etc/iptables/rules.v4 eller lägga in regeln direkt via kommandoraden.

I detta exemplet lägger vi till en regel som tillåter utgående trafik på port 25 (SMTP) i kommandoraden.

Skriv följande:

root@host:~# iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT

Kontrollera att din regel har lagts till genom att skriva följande:

root@host:~# iptables -L

I svaret du får ser du att regeln har lagts till (se sista raden):

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  one.one.one.one      anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpts:33434:33523
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             one.one.one.one
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpts:33434:33523
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:smtp

Spara inställningarna för brandväggen genom att köra följande kommando:

root@host:~# iptables-save > /etc/iptables/rules.v4

Vid omstart av servern kommer inställningarna att laddas in från /etc/iptables/rules.v4.

Sammanfattning


Genom att följa den här guiden, antingen genom att klistra in dina brandväggsregler direkt i konfigurationsfilen eller manuellt genom kommandon, har du en bra grundläggande brandväggskonfiguration. Du kommer att behöva lägga till individuella regler för varje tjänst du vill ska ha åtkomst.

Observera: När du arbetar med brandväggar, var försiktig så du inte låser ute dig själv från din server genom att blockera SSH-trafik (port 22 som standard). Om du förlorar åtkomst genom inställningar i brandväggen kan du behöva koppla upp dig via konsolen för att ge dig själv tillgång igen. När du är uppkopplad via konsolen kan du ändra dina brandväggsregler att åter ge tillgång via SSH (eller tillåta all trafik). Om dina sparade brandväggsregler tillåter SSH-åtkomst är en annan metod att starta om servern. Se vår guide hur du kommer åt din server via konsolläget.

Hittar du inte det du söker?

Kontakta oss gärna för mer information. Vi hjälper dig att komma fram till den bästa lösningen för dina behov.

Skicka e-post Ring 0200-23 88 00