• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Warum funktioniert mein Firewall-script nicht???

jk47

Newbie
:?: Ich weiß nicht mehr weiter, ich hab unzählige Firewallhowtos durch und mich daran orientiert, was mach ich falsch?

Ich hab mich diesmal in erster Linie nach http://www.teamunix.de/howto/iptableshowto.php gerichtet.

Jan

Code:
#! /bin/sh 

############-- INIT  --############### 
# flush 
echo "flushing tables" 
iptables -F 
iptables -F -t nat 

# policies 

echo "setup policies" 
iptables -P INPUT DROP 
iptables -P OUTPUT ACCEPT 
iptables -P FORWARD DROP 

echo "accepting ESTBLISHED, RELATED" 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 

#+++++++++++++++++++++++++   INPUT   ++++++++++++++++++++++++++++++ 

#DSL 
#iptables -A INPUT -i PPP0 -j ACCEPT 
iptables -A INPUT -i lo -s 127.0.0.1/255.0.0.0 -j ACCEPT 
iptables -A FORWARD -i lo -s 127.0.0.1/255.0.0.0 -j ACCEPT 

echo "input" 
#################################################################### 
iptables -A INPUT -s 10.238.0.28 -i eth0 -j ACCEPT   #MARC 
#################################################################### 
iptables -A INPUT -s 10.238.103.100 -i eth0 -j ACCEPT   #PUHA 
iptables -A INPUT -s 10.238.105.125 -i eth0 -j ACCEPT 
#################################################################### 
iptables -A INPUT -s 10.238.105.102 -i eth0 -j ACCEPT   #JK47 
#################################################################### 
iptables -A INPUT -s 10.238.184.105 -i eth0 -j ACCEPT   #PRYO 
iptables -A INPUT -s 10.238.106.31 -i eth0 -j ACCEPT 
#################################################################### 
iptables -A INPUT -s 10.238.111.31 -j ACCEPT      #rauder 
iptables -A INPUT -s 0/0 -i ppp0 -j ACCEPT 
#################################################################### 
#iptables -A INPUT -j DROP 
#++++++++++++++++++++++++++++ OUTPUT  ++++++++++++++++++++++++++ 
echo "output" 
#################################################################### 
iptables -A OUTPUT -d 10.238.0.28 -j ACCEPT      #MArc 
#################################################################### 
iptables -A OUTPUT -d 10.238.103.100 -j ACCEPT      #PUHA 
iptables -A OUTPUT -d 10.238.105.125 -j ACCEPT 
#################################################################### 
iptables -A OUTPUT -d 10.238.105.102 -j ACCEPT      #JK47 
#################################################################### 
iptables -A OUTPUT -d 10.238.184.105 -j ACCEPT      #PRYO 
iptables -A OUTPUT -d 10.238.106.31 -j ACCEPT 
#################################################################### 
iptables -A OUTPUT -s 10.238.111.31 -j ACCEPT      #rauder 
iptables -A OUTPUT -d 10.238.111.31 -j ACCEPT 
#################################################################### 
#iptables -A OUTPUT -j DROP 


#++++++++++++++++++++++++++++++++++ forward ++++++++++++++++++++++++++ 

echo "forward" 
iptables -A FORWARD -s 10.238.0.28 -i eth0 -j ACCEPT   #MARC 
iptables -A FORWARD -s 10.238.103.100 -i eth0 -j ACCEPT   #PUHA 
iptables -A FORWARD -s 10.238.105.125 -i eth0 -j ACCEPT   #PUHA 
iptables -A FORWARD -s 10.238.105.102 -i eth0 -j ACCEPT   #JK47 
iptables -A FORWARD -s 10.238.106.31 -i eth0 -j ACCEPT   #PRYO 
iptables -A FORWARD -s 10.238.184.105 -i eth0 -j ACCEPT   #PRYO 

iptables -A FORWARD -d 10.238.0.28 -i eth0 -j ACCEPT   #MARC 
iptables -A FORWARD -d 10.238.103.100 -i eth0 -j ACCEPT   #PUHA 
iptables -A FORWARD -d 10.238.105.125 -i eth0 -j ACCEPT   #PUHA 
iptables -A FORWARD -d 10.238.105.102 -i eth0 -j ACCEPT   #JK47 
iptables -A FORWARD -d 10.238.106.31 -i eth0 -j ACCEPT   #PRYO 
iptables -A FORWARD -d 10.238.184.105 -i eth0 -j ACCEPT   #PRYO 

iptables -A FORWARD -s 10.238.111.31 -j ACCEPT 
iptables -A FORWARD -d 10.238.111.31 -j ACCEPT 
iptables -A FORWARD -s 10.238.111.31 -j ACCEPT 
iptables -A FORWARD -d 10.238.111.31 -j ACCEPT 

iptables -A FORWARD -s 0/0 -i ppp0 -j ACCEPT      # dat indernet 
#iptables -A FORWARD -j DROP 



########################################################### 
iptables -L -n 
#iptables -L OUTPUT 
#iptables -L FORWARD 
echo "firewall up..." 
#eof
 
OP
J

jk47

Newbie
Naja, das versuch ich ja seit Tagen zu verdeutlichen:

10.238.0.28
10.238.103.100
10.238.105.125
10.238.105.102
10.238.106.31
10.238.184.105

Diese IPs dürfen ins Internet und auf den Router (10.238.111.31) zugreifen, alle anderen nicht. Ich dachte das obige script bewerkstelligt das, tut es aber nicht, es geht gar nichts, weder internet vom Router noch von einem host.

Kuckst du hier:
vgl: http://www.linux-club.de/viewtopic.php?t=23619
vgl: http://www.linux-club.de/viewtopic.php?t=23392

Danke für Deine Hilfe soweit

Jan
 

Martin Breidenbach

Ultimate Guru
Ach darauf bezieht sich das.

Ich seh da überhaupt keine Regeln für NAT bzw Masquerading.

Da IP-Adressen im Bereich 10.0.0.0 im Internet nicht geroutet werden kann das nicht funktionieren.
 
OP
J

jk47

Newbie
Ok, hier die überarbeitete Version...
Was ist jetzt falsch?

Code:
#! /bin/sh

echo "1" > /proc/sys/net/ipv4/ip_forward

############-- INIT  --###############
# flush
echo "flushing tables"
iptables -F
iptables -F -t nat

# policies

echo "setup policies"
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

echo "accepting ESTBLISHED, RELATED"
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

my_lan_hosts 	= "10.238.0.28 10.238.103.100 10.238.105.125 10.238.105.102 10.238.184.105 10.238.106.31 10.238.111.31"
my_rauder	= "10.238.111.31"


#+++++++++++++++++++++++++   INPUT   ++++++++++++++++++++++++++++++

#DSL
iptables -A INPUT -i PPP0 -j ACCEPT
iptables -A INPUT -i lo -s 127.0.0.1/255.0.0.0 -j ACCEPT 
iptables -A FORWARD -i lo -s 127.0.0.1/255.0.0.0 -j ACCEPT 

echo "input"

for hosts in $my_lan_hosts
do
     /usr/sbin/iptables -A INPUT -s $hosts -i eth0 -j ACCEPT
done

iptables -A INPUT -i eth0 -j DROP



#++++++++++++++++++++++++++++ OUTPUT  ++++++++++++++++++++++++++
echo "output"

for hosts in $my_lan_hosts
do
     /usr/sbin/iptables -A OUTPUT -d $hosts -o eth0 -j ACCEPT
     /usr/sbin/iptables -A OUTPUT -d $hosts -o eth0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
done
/usr/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
/usr/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 3/3 -j ACCEPT
/usr/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 3/4 -j ACCEPT
/usr/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 3/9 -j ACCEPT
/usr/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 3/10 -j ACCEPT
/usr/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 3/13 -j ACCEPT
/usr/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 3 -j DROP

iptables -A OUTPUT -i eth0 -j DROP


#++++++++++++++++++++++++++++++++++ forward ++++++++++++++++++++++++++

echo "forward"


for hosts in $my_lan_hosts
do
     /usr/sbin/iptables -A FORWARD -s $hosts -i eth0 -j ACCEPT
     /usr/sbin/iptables -A FORWARD -d $hosts -i eth0 -j ACCEPT
     ## forward_int
     /usr/sbin/iptables -A FORWARD -i eth0 -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 0 -j ACCEPT
     /usr/sbin/iptables -A FORWARD -i eth0 -s $hosts -i eth0 -o ppp0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
     /usr/sbin/iptables -A FORWARD -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT
     /usr/sbin/iptables -A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
     ## forward_ext
     /usr/sbin/iptables -A FORWARD -i ppp0 -p icmp -m state --state RELATED -m icmp --icmp-type 3 -j ACCEPT
     /usr/sbin/iptables -A FOWRARD -i ppp0 -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 0 -j ACCEPT
     /usr/sbin/iptables -A FOWRARD -i ppp0 -o ppp0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
     /usr/sbin/iptables -A FOWRARD -i ppp0 -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT
done
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#iptables -A FORWARD -s 10.238.111.31 -i eth0 -j ACCEPT
#iptables -A FORWARD -d 10.238.111.31 -i eth0 -j ACCEPT
#iptables -A FORWARD -s 10.238.111.31 -i ppp0 -j ACCEPT
#iptables -A FORWARD -d 10.238.111.31 -i ppp0 -j ACCEPT

iptables -A FORWARD -s 0/0 -i ppp0 -j ACCEPT		# dat indernet

iptables -A FORWARD -j DROP




# NAT #
#######
iptables -A PREROUTING -t nat -j ACCEPT
iptables -A POSTROUTING -t nat -j ACCEPT
iptables -A OUTPUT -t nat -j ACCEPT
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE # was rausgeht wird maskiert

###########################################################
iptables -L -n
#iptables -L OUTPUT
#iptables -L FORWARD
echo "firewall up..."
#eof

Vielen Dank für Hilfe

Jan
 

gaw

Hacker
Das wichtigste ist, es fehlen die Regeln für das dynamische Routing daher kann das Masquerading nicht funktionieren. Schau dir mal das Skript etwas tiefer auf der Seite an, daran kannst du dich orientieren:
http://www.linux-club.de/viewtopic.php?t=21303

Hier der passende Ausschnitt:
Code:
$IPTABLES -t nat -A POSTROUTING -o $INTERFACE_EXT -j MASQUERADE

########### IP-Forwarding und DNAT einschalten
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

echo "Masquerading eingeschaltet"

wobei $IPTABLES /usr/sbin/iptables enthält. Alle beiden Parameter müssen eingeschaltet sein. In meinem Skript ist das Loggen eingeschaltet. Mit "tail -f /var/log/messages" kannst du während die Firewall läuft beobachten welche Pakete abgelehnt werden. Das ist sehr hilfreich um Fehler zu finden.

Mein Skript arbeitet nach einer anderen Strategie, es lässt sich bis auf das Einschalten bestimmter Laufzeitparameter und dem Masquerading nicht unbedingt mit deinem mischen. Im Gegensatz zu deinem Aufbau erlaube ich nicht grundsätzlichen allen Paketen die zu erlaubten oder related Verbindungen gehören den Transfer sondern nur für dezidierte.
Das ist sicherer.

Wenn du dich entscheidest mit meinem Skript zu arbeiten kann ich dir bei Erweiterungen helfen. Dein Skript ist mir etwas zu konfus und es arbeitet nach einer anderen Strategie.

Du kannst es natürlich auch so machen, allerdings solltest du noch mindestens ein paar weitere Laufzeitparameter einschalten, die Broadcaststürme, IP-Spoofing etc. verhindern, wie gesagt schau dir einfach das Skript an.

mfG
gaw
 
OP
J

jk47

Newbie
Danke GAW, es hat funktioniert, ich habe dein Skript benutzt.

Aber warum dauert es soooo lange, bis z.B. ebay.de geladen ist?

hier die veränderte Version deines Skripts:
Code:
#!/bin/bash
############  Firewallskript für einen Linux Router
# copyright (c) gaw
# Autor: gaw
# Oktober 2004

#############  Firewallskript für einen Linux Router

############# Initialisierung der Variablen

############# Interfaces
INTERFACE_EXT="ppp0"
INTERFACE_INT="eth0"
INTERFACES="$INTERFACE_EXT $INTERFACE_INT"
WEB_SERVER_IP="192.168.1.200"
WEBMIN_PORT="10000"
ROUTER_IP="10.238.111.31"
WEB_SERVER_IP="10.238.111.31"
LOCAL_NET_IP="10.238.0.0/16"
LOCAL_NET=$LOCAL_NET_IP
MY_LOCAL="10.238.0.28 10.238.103.100 10.238.105.125 10.238.105.102 10.238.184.105 10.238.106.31 10.238.111.31"
HTTP_PORT="80"
PORTS_HIGH="1024:65535"
IPTABLES="iptables"



############# Grundkonfiguration 

# Vorläufiges Ausschalten des IP Forwarding. IP Forwarding 
echo "0" > /proc/sys/net/ipv4/ip_forward 

############# TCP-Syncookies, Abwehrmaßnahme gegen das SYN Flooding. 
echo "1" > /proc/sys/net/ipv4/tcp_syncookies 

############# Ignorieren von Echoauforderungen von icmp 
############# Abwehrmaßnahme gegen Broadcast-Stürme 
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 

############# Das Loggen ungültiger ICMP-Pakete wird ausgeschaltet, 
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 

############# Schleife für alle Schnittstellen in $INTERFACES 
for if in $INTERFACES; 
do

        ##### IP-Spoof Protection 
        echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter 

        ##### Keine Redirections 
        echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects 

        ##### Kein Source-Routing 
        echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route 

        ##### Kein Bootstrap Protokoll 
        echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay 

        ##### Ungültige IP-Pakete werden geloggt. 
        echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians 
done 
echo "Dynamische Kernelparameter gesetzt" 

############# Alle Pakete der Grundeinstellung werden verworfen

$IPTABLES -P INPUT DROP 
$IPTABLES -P FORWARD DROP 
$IPTABLES -P OUTPUT DROP 



############# 
############# Alle eventuell noch vorhandenen Regeln werden gelöscht 
############# 


############# Lösche alle Regeln aus der Filter Tabelle 
$IPTABLES -F 

############# Lösche aller Regeln aus der NAT Tabelle 
$IPTABLES -t nat -F 

############# Lösche alle selbstdefinierte Regeln 
$IPTABLES -X

echo "Alles verboten und alle Regeln gelöscht" 

############# 
############# Selbstdefinierte Regelkette zum Loggen 

$IPTABLES -N TRASH 

# Pakete die nicht geloggt werden sollen 

$IPTABLES -A TRASH -p UDP --dport 123 -j DROP 
# IPP-Anfragen zur Druckereinstellungen müssen nicht geloggt werden
$IPTABLES -A TRASH -p UDP -s $ROUTER_IP --dport 631 -j DROP 
$IPTABLES -A TRASH -p TCP --dport 445 -j DROP 
$IPTABLES -A TRASH -p TCP --dport 135 -j DROP 

# Pakete die geloggt werden sollen 
$IPTABLES -A TRASH -p ICMP -j LOG --log-prefix "Abgelehnte-ICMP-Pakete " 
$IPTABLES -A TRASH -p UDP  -j LOG --log-prefix "Abgelehnte-UDP-Pakete  " 
$IPTABLES -A TRASH -p TCP  -j LOG --log-prefix "Abgelehnte-TCP-Pakete  " 
$IPTABLES -A TRASH -j DROP 

echo "Loggin eingeschaltet" 


############ Bis hier ist alles verboten. Nun werden bestimmte 
############ Pakete wieder akzeptiert 
############ 

################### Lokale Prozesse auf dem Rechner akzeptieren ################ 

$IPTABLES -A OUTPUT -o lo -j ACCEPT 
$IPTABLES -A INPUT  -i lo -j ACCEPT 

echo "Lokale Prozesse erlaubt" 
############# SSH Verbindungen vom internen Netz erlauben 

$IPTABLES -A INPUT -i $INTERFACE_INT -s $LOCAL_NET -d $ROUTER_IP -p TCP --sport $PORTS_HIGH --dport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERFACE_INT -s $ROUTER_IP -d $LOCAL_NET -p TCP --dport $PORTS_HIGH --sport ssh -m state --state ESTABLISHED,RELATED -j ACCEPT

echo "ssh vom LAN auf den Router erlaubt" 

############# Webmin Verbindungen vom internen Netz erlauben 

$IPTABLES -A INPUT -i $INTERFACE_INT -s $LOCAL_NET -d $ROUTER_IP -p TCP --sport $PORTS_HIGH --dport $WEBMIN_PORT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERFACE_INT -s $ROUTER_IP -d $LOCAL_NET -p TCP --dport $PORTS_HIGH --sport $WEBMIN_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT 

echo "Webmin vom LAN auf den Router erlaubt" 


######################### Masquarading einschalten ############################# 


$IPTABLES -t nat -A POSTROUTING -o $INTERFACE_EXT -j MASQUERADE 

##################### IP-Forwarding und DNAT einschalten ###################### 

echo "1" > /proc/sys/net/ipv4/ip_forward 
echo "1" > /proc/sys/net/ipv4/ip_dynaddr 

echo "Masquerading eingeschaltet"

############# Verbindungen aller Art erlauben

for hosts in $MY_LOCAL
do
	$IPTABLES -A FORWARD -i $INTERFACE_INT -s $hosts -o $INTERFACE_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
	$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state --state ESTABLISHED,RELATED -j ACCEPT
done

echo "Alles eingeschaltet"

############# Bestimmte ICMP Anfragen werden gestattet.

#
# Vom Netz ins Internet zur Diagnose nützlich
# $IPTABLES -A FORWARD -p ICMP --icmp-type
# echo-request -j ACCEPT
# $IPTABLES -A FORWARD -p ICMP --icmp-type
# echo-reply -j ACCEPT

# ROUTER_IP
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-request -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-reply -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP --icmp-type redirect -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type echo-reply -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type redirect -j ACCEPT
echo "ICMP Anfragen des Firewallrouters werden gestattet"


############# Rest wird gesperrt und geloggt
$IPTABLES -A INPUT   -j TRASH
$IPTABLES -A FORWARD -j TRASH
$IPTABLES -A OUTPUT  -j TRASH
echo "Firewall eingeschaltet"
 

gaw

Hacker
Ich weiß nicht warum es solange dauert bis dein Rechner ebay findet, das hat mit der Firewall nichts zu tun sondern mit der Namensauflösung. Je nachdem ob ein eigener DNS-Server auf der Firewall oder ob die Nameserver des Provider genutzt werden ist der UDP-Port 53 für den ausgehenden Verkehr oder für das Forwarding zu öffnen. Bei dir sind die Tore allerdings weit offen.

Ich verstehe nicht ganz, wozu du eine Firewall benötigst wenn du alle Dienste freigibst....

Code:
############# Verbindungen aller Art erlauben

for hosts in $MY_LOCAL
do
   $IPTABLES -A FORWARD -i $INTERFACE_INT -s $hosts -o $INTERFACE_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
   $IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state --state ESTABLISHED,RELATED -j ACCEPT
done


Damit kann jeder Trojaner und jede Spyware hinter der Firewall von sich aus ungehindert Zugriff erlangen.


mfG
gaw
 
Oben