Elegantly
Registered User
Da ich einiges an Problemen hatte, ein vernünftiges iptables Firewall-Skript für meinen vSERVER (SuSE 9) zu schreiben - einige wichtige Module wie ip_conntrack können nicht verwendet werden -, poste ich hier mein rudimentäres Skript. Ja, eigentlich ist es nur ein Portfilter. Da hätte auch ipchains gereicht...
Das o.g. Skript erlaubt erkennt bei angegebenem Netzwerk-Interface die eigene IP automatisch, und erlaubt rudimentären Zugriff auf den eigenen Host (SSH, WWW, WWW mit SSL, SMTP, POP3, POP mit SSL, ICMP), und schränkt ausgehende Verbindungen ebenfalls auf die wichtigsten Dienste (SMTP, DNS, WWW, SSH, ICMP).
Wichtiger Hinweis: FTP funktioniert NICHT mit diesem Setup. Da wir keine Kernelmodule nachladen können, die Stateful Inspection etc. für FTP erlauben, ist es auf meinem Server komplett deaktiviert. Wer also z.B. mit wget ein RPM von einem FTP-Server laden will, muss anders vorgehen (z.B. einen HTTP-Mirror auswählen). NOTFALLS kann man auch die Firewall vorübergehend deaktivieren...
Hier noch ein Skript, um die Firewallfunktionalität zu deaktivieren (= ALLOW ALL). Da im o.g. Skript die Standard-Policies auf DROP gesetzt werden, reicht ein intuitivies Löschen aller definierten Regeln nämlich nicht aus.
Code:
#!/bin/bash
#
# File: /etc/init.d/firewall.sh
# Author: Elegantly
#
# Version: 1.0
# Description: Rudimentary version of a firewall for vSERVER.de;
# since we cannot load other iptables modules,
# we can only implement a simple packet filter
# functionality
#
#### INTERFACE CONFIGURATION
#
#
EXT_IF="venet0:0"
# required binaries
#
IPT=/usr/sbin/iptables
if [ ! -f $IPT -o ! -x $IPT ]; then
echo "Incorrect iptables binary location: $IPT"
exit 1
fi
IFCONFIG=/sbin/ifconfig
if [ ! -f $IFCONFIG -o ! -x $IFCONFIG ]; then
echo "Incorrect iptables binary location: $IFCONFIG"
exit 1
fi
GREP=/usr/bin/grep
if [ ! -f $GREP -o ! -x $GREP ]; then
echo "Incorrect iptables binary location: $GREP"
exit 1
fi
AWK=/usr/bin/awk
if [ ! -f $AWK -o ! -x $AWK ]; then
echo "Incorrect iptables binary location: $AWK"
exit 1
fi
SED=/usr/bin/sed
if [ ! -f $SED -o ! -x $SED ]; then
echo "Incorrect iptables binary location: $SED"
exit 1
fi
# automatically retrieve our IP address
#
EXT_IP="`$IFCONFIG $EXT_IF | $GREP 'inet addr' | $AWK '{print $2}' | $SED -e 's/.*://'`"
#################################################
# delete any existing custom chains
#
$IPT -X
# Initialize and drop anything per default (in/out)
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
$IPT -F
$IPT -X
# Allow communication on localhost (in/out)
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
#################################################
####
#### INCOMING RULES
####
#################################################
# SSH
$IPT -A INPUT -d $EXT_IP -p tcp --destination-port 22 -j ACCEPT
$IPT -A OUTPUT -s $EXT_IP -p tcp --source-port 22 -j ACCEPT
# WWW/HTTP
$IPT -A INPUT -d $EXT_IP -p tcp --destination-port 80 -j ACCEPT
$IPT -A OUTPUT -s $EXT_IP -p tcp --source-port 80 -j ACCEPT
# HTTPS
$IPT -A INPUT -d $EXT_IP -p tcp --destination-port 443 -j ACCEPT
$IPT -A OUTPUT -s $EXT_IP -p tcp --source-port 443 -j ACCEPT
# SMTP
$IPT -A INPUT -d $EXT_IP -p tcp --destination-port 25 -j ACCEPT
$IPT -A OUTPUT -s $EXT_IP -p tcp --source-port 25 -j ACCEPT
# POP3
$IPT -A INPUT -d $EXT_IP -p tcp --destination-port 110 -j ACCEPT
$IPT -A OUTPUT -s $EXT_IP -p tcp --source-port 110 -j ACCEPT
# POP3S
IPT -A INPUT -d $EXT_IP -p tcp --destination-port 995 -j ACCEPT
IPT -A OUTPUT -s $EXT_IP -p tcp --source-port 995 -j ACCEPT
# ICMP
$IPT -A OUTPUT -s $EXT_IP -p icmp --icmp-type echo-reply -j ACCEPT
$IPT -A INPUT -d $EXT_IP -p icmp --icmp-type echo-request -j ACCEPT
#################################################
####
#### OUTGOING RULES
####
#################################################
# SMTP
$IPT -A OUTPUT -s $EXT_IP -p tcp --destination-port 25 -j ACCEPT
$IPT -A INPUT -d $EXT_IP -p tcp --source-port 25 -j ACCEPT
# DNS
$IPT -A OUTPUT -s $EXT_IP -p udp --destination-port 53 -j ACCEPT
$IPT -A INPUT -d $EXT_IP -p udp --source-port 53 -j ACCEPT
# ICMP
$IPT -A OUTPUT -s $EXT_IP -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A INPUT -d $EXT_IP -p icmp --icmp-type echo-reply -j ACCEPT
# WWW
$IPT -A OUTPUT -s $EXT_IP -p tcp --destination-port 80 -j ACCEPT
$IPT -A INPUT -d $EXT_IP -p tcp --source-port 80 -j ACCEPT
# SSH
$IPT -A OUTPUT -s $EXT_IP -p tcp --destination-port 22 -j ACCEPT
$IPT -A INPUT -d $EXT_IP -p tcp --source-port 22 -j ACCEPT
Das o.g. Skript erlaubt erkennt bei angegebenem Netzwerk-Interface die eigene IP automatisch, und erlaubt rudimentären Zugriff auf den eigenen Host (SSH, WWW, WWW mit SSL, SMTP, POP3, POP mit SSL, ICMP), und schränkt ausgehende Verbindungen ebenfalls auf die wichtigsten Dienste (SMTP, DNS, WWW, SSH, ICMP).
Wichtiger Hinweis: FTP funktioniert NICHT mit diesem Setup. Da wir keine Kernelmodule nachladen können, die Stateful Inspection etc. für FTP erlauben, ist es auf meinem Server komplett deaktiviert. Wer also z.B. mit wget ein RPM von einem FTP-Server laden will, muss anders vorgehen (z.B. einen HTTP-Mirror auswählen). NOTFALLS kann man auch die Firewall vorübergehend deaktivieren...
Hier noch ein Skript, um die Firewallfunktionalität zu deaktivieren (= ALLOW ALL). Da im o.g. Skript die Standard-Policies auf DROP gesetzt werden, reicht ein intuitivies Löschen aller definierten Regeln nämlich nicht aus.
Code:
#!/bin/bash
#
# File: /root/firewall_disable.sh
# Author: Elegantly
#
# Version: 1.0
# Description: Make our firewall go into ALLOW ALL state;
#
################################################
# required binaries
#
IPT=/usr/sbin/iptables
if [ ! -f $IPT -o ! -x $IPT ]; then
echo "Incorrect iptables binary location: $IPT"
exit 1
fi
#################################################
$IPT -X
# Set default policies to allow all
#
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -F
$IPT -X
# Allow any communication
#
$IPT -A INPUT -j ACCEPT
$IPT -A OUTPUT -j ACCEPT