PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Portknocking mit iptables



XET!C
17.05.2010, 13:58
Hi,

Meine iptables Regeln verhindert das Portknocking die Verbindung zulässt.

iptables skript


##########################
# #
# Variablen Definitionen #
# #
##########################

LOCKFILE="/var/lock/guefz-fw.pid"

IPTABLES="/sbin/iptables"
LOGGER="/usr/bin/logger"
MAIL="/usr/bin/mail"

MAIL_ADR="xetic"

ETH0_NET="192.168.0.0/24"
ETH0_ADR="194.168.46.128"
ETH0_BC="194.168.0.255"

LOG="--log-level warning --log-tcp-options --log-ip-options --log-prefix sv1"

#######################
# #
# Locking Mechanismus #
# #
#######################

test -e "$LOCKFILE" && {
$LOGGER -p kern.info -t guefz-fw "Es gibt mich schon mit PID `cat $LOCKFILE`, ich warte ..."
I=0
LOCK=1
while [ "$LOCK" = 1 ]; do
sleep 2
test -e "$LOCKFILE" || LOCK=0
I=`expr $I + 1`
test "$I" = 15 && LOCK=0
done
test -e "$LOCKFILE" && {
$LOGGER -p kern.info -t guefz-fw "Lockdatei ist zwar immer noch da, aber was solls ..."
kill -TERM `cat $LOCKFILE`
sleep 2
kill -KILL `cat $LOCKFILE`
rm -f "$LOCKFILE"
}
}
trap "rm -f $LOCKFILE" 0 1 2 3 13 15
set -o noclobber
echo "$$" > $LOCKFILE || exit 1
set +o noclobber

################################################## ########################
# #
# Funktionen, um die verschiedenen Varianten des Regelsatzes zu erzeugen #
# #
################################################## ########################

############################################
# #
# Packetfilterregeln loeschen, alles offen #
# #
############################################

function stop_rules() {
echo -n "FIREWALL: ALLES OFFEN ..."
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F
$IPTABLES -X
echo " done"
}

############################################
# #
# Packetfilterregeln loeschen, alles zu #
# #
############################################

function close_rules() {
echo -n "FIREWALL: ALLES ZU ..."
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -F
$IPTABLES -X
echo " done"
}

################################################## ###########
# #
# Packetfilterregeln fuer Normalbetrieb im Internet laden #
# #
################################################## ###########

function start_rules() {
echo -n "FIREWALL: REGELN werden aktiv ..."
#
# Defaulteinstellungen und evtl. vorhandene Regeln loeschen
#
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD 2> /dev/null
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP 2> /dev/null
$IPTABLES -F
$IPTABLES -X
# $IPTABLES -A INPUT -j DROP
#
# Kernel-Einstellungen
#
(
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 2> /dev/null # Ping an BC ignorieren
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 2> /dev/null # Ping komplett ignorieren
echo 1 > /proc/sys/net/ipv4/tcp_syncookies 2> /dev/null # SYN-Cookie Schutz
echo 1 > /proc/sys/net/ipv4/ip_always_defrag 2> /dev/null # XXX not there?
echo 0 > /proc/sys/net/ipv4/tcp_ecn 2> /dev/null
) > /dev/null 2>&1
#
# normalen Loopback-Verkehr zulassen
#
$IPTABLES -A INPUT -j ACCEPT -i lo
$IPTABLES -A OUTPUT -j ACCEPT -o lo
#
# Regeln gegen Adressfaelschungen aus dem Loopback-Bereich
#
$IPTABLES -A INPUT -j LOG ${LOG}-ANTI-SPOOFING -s 127.0.0.0/8
$IPTABLES -A INPUT -j LOG ${LOG}-ANTI-SPOOFING -d 127.0.0.0/8
$IPTABLES -A INPUT -j DROP -s 127.0.0.0/8
$IPTABLES -A INPUT -j DROP -d 127.0.0.0/8
#
# Eigene Broadcasts ohne Logging ignorieren
#
$IPTABLES -A INPUT -j DROP -s $ETH0_ADR -d $ETH0_BC
#
# Regeln gegen Packete mit den eigenen Adressen als Quelladresse
#
$IPTABLES -A INPUT -j LOG ${LOG}-ANTI-SPOOFING -s $ETH0_ADR
$IPTABLES -A INPUT -j DROP -s $ETH0_ADR
#
# Regeln fuer das Versenden eigener Packete
#
$IPTABLES -A OUTPUT -j LOG ${LOG}-TRACEROUTE-ATTEMPT -p icmp --icmp-type time-exceeded
#
# Regeln fuer die Annahme ankommender Packete
#
# Stateful: allgemein Antworten zulassen
$IPTABLES -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED

# ICMP
$IPTABLES -A INPUT -j ACCEPT -p icmp --icmp-type echo-request
for TYPE in echo-reply destination-unreachable time-exceeded parameter-problem timestamp-reply address-mask-reply; do
$IPTABLES -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED -p icmp --icmp-type $TYPE
done

# TCP

# normale zugelassene Verbindungen:
# $IPTABLES -A INPUT -j ACCEPT -p tcp --dport 22 #ssh
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 995 #pop3s
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 10000 #webmin
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 80 #http
# $IPTABLES -A INPUT -j ACCEPT -p tcp --dport 443
# $IPTABLES -A INPUT -j REJECT -p tcp --dport 113 --syn --reject-with tcp-reset 2> /dev/null


# LOG + DROP
# $IPTABLES -A INPUT -j REJECT -p tcp --dport 135 --reject-with tcp-reset
# $IPTABLES -A INPUT -j REJECT -p tcp --dport 445 --reject-with tcp-reset
# $IPTABLES -A INPUT -j LOG ${LOG}-DROP-TCP -p tcp --syn
# $IPTABLES -A INPUT -j REJECT -p tcp --syn --reject-with tcp-reset
# $IPTABLES -A INPUT -j LOG ${LOG}-DROP-ICMP -p icmp
# $IPTABLES -A INPUT -j DROP -p icmp
# $IPTABLES -A INPUT -j LOG ${LOG}-DROP-UDP -p udp
# $IPTABLES -A INPUT -j REJECT -p udp --reject-with icmp-port-unreachable
# $IPTABLES -A INPUT -j LOG ${LOG}-DROP-INVALID -m state --state INVALID
# $IPTABLES -A INPUT -j DROP -m state --state INVALID
#
# Verwerfen aller bisher nicht erfassten Packete
#
# $IPTABLES -A INPUT -j LOG ${LOG}-WEIRD
# $IPTABLES -A INPUT -j DROP
#
# Ende der Regeln
#
echo "... habe fertig"
}

###########################
# #
# Kommandozeile auswerten #
# #
###########################

case "$1" in

# Packetfilterregeln loeschen, alles offen

stop|halt|down|shutdown)
$IPTABLES -L -nv | $MAIL -s FIREWALL_STATUS_OFFEN $MAIL_ADR
stop_rules
$LOGGER -p kern.info -t FIREWALL "Firewall offen"
exit 0
;;

# Packetfilterregeln loeschen, alles zu

close|zu)
$IPTABLES -L -nv | $MAIL -s FIREWALL_STAUTS_ZU $MAIL_ADR
close_rules
$LOGGER -p kern.info -t FIREWALL "Firewall zu"
exit 0
;;

# Statusanzeige

status)
$IPTABLES -L -Z -nv | $MAIL -s FIREWALL_STATUS $MAIL_ADR
# start_rules
# $IPTABLES -t nat -L -nv
# $IPTABLES -t mangle -L -nv
exit 0
;;

# Laden der Packetfilterregeln

start|up)
start_rules
$LOGGER -p kern.info -t firewall "Firewall geladen"
exit 0
;;

# Fehler bei unbekannter Option in der Kommandozeile

*)
echo "Usage: $0 {start|stop|close|status}"
exit 1
;;
esac

########
# #
# Ende #
# #
########


Wenn ich die Regeln ab LOG + DROP auskommentiere, funktioniert es einwandfrei. Aber so sind die Ports nicht gesperrt. Oder vertuh ich mich da???

Hier ein iptables -L nach dem knocking

Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
LOG all -- loopback/8 anywhere LOG level warning tcp-options ip-options prefix `sv1-ANTI-SPOOFING'
LOG all -- anywhere loopback/8 LOG level warning tcp-options ip-options prefix `sv1-ANTI-SPOOFING'
DROP all -- loopback/8 anywhere
DROP all -- anywhere loopback/8
DROP all -- 128-46-168-194.static.virginmedia.com 194.168.0.255
LOG all -- 128-46-168-194.static.virginmedia.com anywhere LOG level warning tcp-options ip-options prefix `sv1-ANTI-SPOOFING'
DROP all -- 128-46-168-194.static.virginmedia.com anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere state RELATED,ESTABLISHED icmp echo-reply
ACCEPT icmp -- anywhere anywhere state RELATED,ESTABLISHED icmp destination-unreachable
ACCEPT icmp -- anywhere anywhere state RELATED,ESTABLISHED icmp time-exceeded
ACCEPT icmp -- anywhere anywhere state RELATED,ESTABLISHED icmp parameter-problem
ACCEPT icmp -- anywhere anywhere state RELATED,ESTABLISHED icmp timestamp-reply
ACCEPT icmp -- anywhere anywhere state RELATED,ESTABLISHED icmp address-mask-reply
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3s
ACCEPT tcp -- anywhere anywhere tcp dpt:webmin
ACCEPT tcp -- anywhere anywhere tcp dpt:www
REJECT tcp -- anywhere anywhere tcp dpt:loc-srv reject-with tcp-reset
REJECT tcp -- anywhere anywhere tcp dpt:microsoft-ds reject-with tcp-reset
LOG tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN LOG level warning tcp-options ip-options prefix `sv1-DROP-TCP'
REJECT tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN reject-with tcp-reset
LOG icmp -- anywhere anywhere LOG level warning tcp-options ip-options prefix `sv1-DROP-ICMP'
DROP icmp -- anywhere anywhere
LOG udp -- anywhere anywhere LOG level warning tcp-options ip-options prefix `sv1-DROP-UDP'
REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable
LOG all -- anywhere anywhere state INVALID LOG level warning tcp-options ip-options prefix `sv1-DROP-INVALID'
DROP all -- anywhere anywhere state INVALID
LOG all -- anywhere anywhere LOG level warning tcp-options ip-options prefix `sv1-WEIRD'
DROP all -- anywhere anywhere
ACCEPT tcp -- 192.168.46.1 anywhere tcp dpt:22

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
LOG icmp -- anywhere anywhere icmp time-exceeded LOG level warning tcp-options ip-options prefix `sv1-TRACEROUTE-ATTEMPT'


Damit ist die Verbindung immer noch zu...

Hat jemand ne Ahnung welche Regel ich umschreiben muss oder weg lassen muss?