iptables Firewall-Script für Debian

Die Grundlagen einer Firewall mit netfilter und iptables wurden bereits in einem früheren Beitrag behandelt. Die darin gezeigte Methode nutzt das Tool iptables-restore um die Regeln an netfilter zu übertragen.

In der hier gezeigten Methode wird netfilter über das unten genannte Script vollständig zurückgesetzt und anschließend konfiguriert. Es ist damit etwas transparenter.

Hinweis:
Das Script konfiguriert netfilter so, dass standardmäßig alle Pakete verworfen werden. Demnach ist jeglicher Traffic der nicht explizit per Regel erlaubt wurde, verboten. Das Script gilt als Beispiel für die Einrichtung einer Firewall unter Linux (Debian u.a.) und hat keinen Anspruch auf Vollständigkeit. Je nach Konfiguration des Systems besteht die Möglichkeit sich mit diesem Script komplett auszusperren, insbesondere wenn man lediglich remote Zugriff besitzt. Es sollte demnach nur verwendet werden, wenn man eine Rückfallebene hat (z.B. direkten Zugriff, Snapshot etc.).

Schritt 1: Script erstellen

touch /etc/init.d/firewall && chmod 755 /etc/init.d/firewall && nano /etc/init.d/firewall

Der oben genannte Befehl erstellt die Datei für das Script, setzt die nötigen Reche und öffnet sie in nano. Hier fügt man die folgenden Zeilen ein.

#!/bin/sh

# Abort script when command exits with error
# set -e

# Print each command before it is executed (only for debugging)
# set -x

IPTABLES=$(which iptables)
MODPROBE=$(which modprobe)

########################################################################
# Initialize firewall
########################################################################

printf "Initializing firewall ...\n"

# Flush all chains
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F

# Delete all user defined chains
$IPTABLES -t filter -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
$IPTABLES -t raw -X

# Zero the packet and byte counters in all chains
$IPTABLES -t filter -Z
$IPTABLES -t nat -Z
$IPTABLES -t mangle -Z
$IPTABLES -t raw -Z

# Setup policies for filter table (drop everything by default)
$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P OUTPUT DROP
$IPTABLES -t filter -P FORWARD DROP

# Setup policies for nat table
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P INPUT ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT

# Setup policies for mangle table
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT

# Setup policies for raw table
$IPTABLES -t raw -P PREROUTING ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT

# Create user defined chains LOGACCEPT, LOGDROP and LOGREJECT
$IPTABLES -t filter -N LOGACCEPT
$IPTABLES -t filter -N LOGDROP
$IPTABLES -t filter -N LOGREJECT

# Setup LOGACCEPT chain
$IPTABLES -A LOGACCEPT -m limit --limit 10/minute -j LOG --log-prefix "FW-ACCEPT: "
$IPTABLES -A LOGACCEPT -j ACCEPT

# Setup LOGDROP chain
$IPTABLES -A LOGDROP -m limit --limit 10/minute -j LOG --log-prefix "FW-DROP: "
$IPTABLES -A LOGDROP -j DROP

# Setup LOGREJECT chain
$IPTABLES -A LOGREJECT -m limit --limit 10/minute -j LOG --log-prefix "FW-REJECT: "
$IPTABLES -A LOGREJECT -j REJECT

printf "Done initializing!\n"

########################################################################
# Setup firewall rules
########################################################################
# If you want packets logged use the target LOGDROP (-j LOGDROP)
# for logging and dropping the matching packet, LOGACCEPT (-j LOGACCEPT)
# for logging and accepting the matching packet, or LOGREJECT
# (-j LOGREJECT) for logging and rejecting the matching packet.
########################################################################

printf "Setting up firewall rules ...\n"

### Basic rules ###

# Accept all loopback traffic
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# Accept all established or related inbound connections
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Accept all established or related outbound connections
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

### Custom rules ###

# Accept all inbound and outbound ICMP packets (e.g. ping)
$IPTABLES -A INPUT -p icmp -j ACCEPT
$IPTABLES -A OUTPUT -p icmp -j ACCEPT

# Accept all inbound and outbound SSH connections
# Don't delete this unless you have local access to the machine
$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 22 -j ACCEPT

### PUT YOUR RULES HERE ###

printf "Firewall is now configured and active!\n"

########################################################################
# Display configuration (optional)
########################################################################

#printf "Displaying current firewall configuration ...\n"

#printf "\nContent of filter table:\n\n"
#$IPTABLES -nvL -t filter

#printf "\nContent of nat table:\n\n"
#$IPTABLES -nvL -t nat

#printf "\nContent of mangle table:\n\n"
#$IPTABLES -nvL -t mangle

#printf "\nContent of raw table:\n\n"
#$IPTABLES -nvL -t raw

#printf "\n"

exit 0

Schritt 2: Script testen

/etc/init.d/firewall

Schritt 2: Script bei Systemstart laden

Um die Regeln auch nach einem Neustart zu lagen, wird das Script über rc.local geladen.

nano /etc/rc.local

Hier fügt man Folgendes ein.

# Launch netfilter rules
if [ -e '/etc/init.d/firewall' ]
then
    /bin/sh '/etc/init.d/firewall'
fi

Damit wird das Script bei jedem Systemstart geladen.

Optionale Freigaben

Die folgenden Regeln (und andere) können bei Bedarf unter „Custom rules“ eingefügt werden.

DNS (Server & Client)

# Accept all inbound and outbound DNS connections
$IPTABLES -A INPUT -p tcp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -j ACCEPT

HTTP (Server & Client)

# Accept all inbound and outbound HTTP connections
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 -j ACCEPT

HTTPS (Server & Client)

# Accept all inbound and outbound HTTPS connections
$IPTABLES -A INPUT -p tcp --dport 443 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 -j ACCEPT

SMTP (Server & Client)

# Accept all inbound and outbound STMP connections
$IPTABLES -A INPUT -p tcp --dport 25 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 25 -j ACCEPT

POP3 (Server & Client)

# Accept all inbound and outbound POP3 connections
$IPTABLES -A INPUT -p tcp --dport 110 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 110 -j ACCEPT

IMAP (Server & Client)

# Accept all inbound and outbound IMAP connections
$IPTABLES -A INPUT -p tcp --dport 143 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 143 -j ACCEPT

FTP (Server & Client)

# Accept all inbound and outbound FTP connections
# and activate kernel module nf_conntrack_ftp
$MODPROBE nf_conntrack_ftp
$IPTABLES -A INPUT -p tcp --dport 21 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 21 -j ACCEPT

Dieser Beitrag wurde unter IT-Sicherheit abgelegt am von .

Über Markus Mansshardt

Markus Manßhardt befasst sich seit einigen Jahren im privaten und beruflichen Umfeld mit System- und Netzwerkadministration sowie den Themen Virtualisierung, Cloud und IT-Sicherheit. Sein Schwerpunkt liegt bei der Administration von Linux Systemen und deren Intergration in Mac und Windows Umgebungen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.