/ Markus Amersdorfer:home / university / about:me /
\ Say NO to Software-Patents! \


/ comp / ipchains / how to use it... / ...with debian woody /

being one of the (more or less) lucky ones who got there hands on aon-complete (which is one of the provider's flat-rate offers), i'm actually always online, from the minute i turn on my machine to when it is shut down.
i got this working by creating the script /etc/init.d/max and setting the corresponding symlink.
/etc/ppp/ip-down.d/ holds scripts which are called when the connection is torn down. wanting to be always online, i start the connection again from /etc/ppp/ip-down.d/99-max_always-online.

in order not to be "easy prey", i set up my firewall as soon as the connection is established by having the following executed in /etc/ppp/ip-up.d/00-ipppd which calls inet_chains from a few lines later to set up the ipchains.
/etc/ppp/ip-down.d/99-ipppd deletes the ipchains again after the isdn-connection has terminated.

expressing my paranoia, i always write commands with their absolute path, although they might be found in $PATH too.

/etc/ppp/inet_chains is a script i basically got from a linux-user cd. i adapted it to my needs... anyway, a great thanks to LinuxNewMedia!

/ comp / ipchains / inet_chains /

#!/bin/bash
#
##############################################################################
#
# Richtet eine Firewall für den Heimgebrauch ein
#
##############################################################################
#
# Sollte zum Start in der Datei /etc/ppp/ip-up eingetragen werden als:
#   inet_chains up $@
# und zum Beenden in der Datei /etc/ppp/ip-down als:
#   inet_chains down $@
#
##############################################################################
#
# Parameter   Beispiel-Werte        Beschreibung
#   $1          up, down              Auf- oder Abbau der Firewall
#   $2          ippp0, ppp0           Verwendetes Interface
#  [$3]         /dev/ippp0            Geräte-Name des Interface
#  [$4]         33600, 28800          Geschwindigkeit
#   $5          193.195.38.5          Unsere vom Provider vorgebene IP
#  [$6]         195.203.177.3         IP-Adresse des Provider-Rechners
#
# Es können weitere, benutzerdefinierte Parameter übergeben werden,
# die ignoriert werden. Parameter-Angaben in Klammern werden von diesem
# Script nicht ausgewertet, nur $1, $2 und $5 sind relevant.
#
##############################################################################

##############################################################################
# Funktion "SetzeRegeln"
#   Hier werden alle Regeln eingetragen, die aktiviert oder deaktiviert
#   werden sollen. Unsere IP steht in "$Adresse", der Name des Interface
#   in "$Interface"
#
#   Um eine einzelne Regel zu Aktivieren, muß nur die Raute (#) am Anfang
#   der Zeile entfernt werden, zum Deaktivieren fügen Sie eine Raute ein.
SetzeRegeln ()
{

#max: ... Das hat Linux-User leider vergessen:
/sbin/ipchains $1 input -i lo -j ACCEPT
/sbin/ipchains $1 input -p icmp -j ACCEPT
#max: ... für eine eventuell vorhandene lokale netzwerkkarte
#/sbin/ipchains $1 input -i eth0 -j ACCEPT

# Nameserver:
#   Wird eigentlich immer gebraucht. Sorgt dafür, daß zu einem Hostnamen
#   wie z.B. "www.linux-user.de" die zugehörige IP-Adresse, hier
#   192.143.20.36, gefunden wird.
for ns in `NameserverListe`; do
  /sbin/ipchains $1 input -s $ns 53 -d $Adresse 1024: -i $Interface -p udp -j ACCEPT
  /sbin/ipchains $1 input -s $ns 53 -d $Adresse 1024: -i $Interface -p tcp -j ACCEPT
done

# SSH-Zugang:
# /sbin/ipchains $1 input -d $Adresse 22 -p tcp -i $Interface -j ACCEPT
#max:
/sbin/ipchains $1 input -d $Adresse 22 -p tcp -j ACCEPT

# Sendmail-Zugang:
#   Wird nur gebraucht, wenn Server aus dem Internet ihre Mails auf Ihrem
#   Rechner abliefern sollen. Sendmail ist ein potentielles Angriffsziel
#   und sollte nur in Ausnahmefällen freigegeben werden.
# /sbin/ipchains $1 input -d $Adresse 25 -p tcp -i $Interface -j ACCEPT

# Apache-Webserver:
# /sbin/ipchains $1 input -d $Adresse 80 -p tcp -i $Interface -j ACCEPT

# FTP-Zugang:
#   Wesentlich sicherer statt FTP wäre "SCP" (ist bei SSH dabei).
# /sbin/ipchains $1 input -d $Adresse 21 -p tcp -i $Interface -j ACCEPT
#max.: Source-Port 20 aufmachen, um FTP-client für ACTIVE-FTP sein zu können.
#max.: Ist der Port nicht offen, funktioniert nur PASSIVE-FTP.
# /sbin/ipchains $1 input -s 0/0 20 -d $Adresse 1024: -p tcp -i $Interface -j ACCEPT

# Telnet-Zugang:
# /sbin/ipchains $1 input -d $Adresse 23 -p tcp -i $Interface -j ACCEPT

# ICQ:
#   Freigabe des beliebten ICQ-Clients. Sollten Sie nur tun, wenn Sie ICQ
#   wirklich einsetzen.
# /sbin/ipchains $1 input -d $Adresse 4000 -p tcp -i $Interface -j ACCEPT

#max. ICQ ... In Anlehnung an Alexander Griesser's MFS:
#    =====
# The portrange for direct connections
confdirectportrange="40000:40020"
icqservers="205.188.153.97 205.188.153.98 205.188.153.99 205.188.153.100 205.188.153.101
205.188.153.102 205.1
88.153.103 205.188.153.104 205.188.153.105 205.188.153.106 205.188.153.107 205.188.153.108
205.188.153.109 205
.188.153.110 205.188.153.111 205.188.153.112 205.188.153.113 205.188.153.114 205.188.153.115
205.188.153.116"
for icqserver in $icqservers; do
        /sbin/ipchains $1 input -s $icqserver 4000 -d $Adresse 1024: -p udp -i $Interface -j ACCEPT
done
/sbin/ipchains $1 input -d $Adresse $confdirectportrange -p tcp -i $Interface -j ACCEPT
/sbin/ipchains $1 input -d $Adresse $confdirectportrange -p udp -i $Interface -j ACCEPT
                  

# IRC mit DCC:
#   Diese Regel ist mit Vorsicht zu verwenden, sie erlaubt den
#   Verbindungsaufbau von außen auf nicht-privilegierten Ports.
#   Darf nicht zusammen mit der Regel "Normalen Surf-Betrieb erlauben"
#   verwendet werden.
#   Sie wird nur benötigt, wenn Sie mittels "DCC" im IRC Daten übertragen
#   wollen, der normale Chat-Betrieb ist auch ohne möglich.
# /sbin/ipchains $1 input -d $Adresse 1024: -p tcp -i $Interface -j ACCEPT
#
#max.
# in order to be able to log into an irc-server which does an inetd-lookup without a long delay, REJECT it's request
/sbin/ipchains $1 input -d $Adresse 113 -p tcp -i ippp0 -j REJECT -l

#
# Hier können Sie noch eigene Firewall-Regeln unterbringen. Die Form:
#   /sbin/ipchains $1 [Sektion] ....
# "$1" steht für "-A" beim Auf- und "-D" beim Abbau.
#

#max...

# RealAudio:
/sbin/ipchains $1 input -i $Interface -p tcp    --dport 554                     -j ACCEPT
/sbin/ipchains $1 input -i $Interface -p tcp    --dport 7070            -j ACCEPT
/sbin/ipchains $1 input -i $Interface -p udp    --dport 6970:7170       -j ACCEPT

# GNUTELLA -- Limewire:
# /sbin/ipchains $1 input -i $Interface -p tcp    --dport 6346            -j ACCEPT

# Nichtprivilegierte blockierte Ports:
#  1433       (Microsoft SQL Server)
#  2049       (NFS)
#  5999-6003  (X-Displays)
#  7100       (X-Font-Server)
# 31337       (Back Orifice)
/sbin/ipchains $1 input -i $Interface -p tcp    --dport 1433      -j DENY
/sbin/ipchains $1 input -i $Interface -p tcp    --dport 2049      -j DENY
/sbin/ipchains $1 input -i $Interface -p tcp    --dport 5999:6003 -j DENY
/sbin/ipchains $1 input -i $Interface -p tcp    --dport 7100      -j DENY
/sbin/ipchains $1 input -i $Interface -p tcp    --dport 31337     -j DENY

# MASQUERADING:
# (Damit könnte also ein lokales Netzwerk (10.0.0.0/255.0.0.0) über ippp0 ins Internet.)
# (Achtung: dies ist bei vielen Providern nur bedingt erlaubt!)
#echo 1 > /proc/sys/net/ipv4/ip_forward
#/sbin/ipchains -P forward DENY
#/sbin/ipchains $1 forward -s 10.0.0.0/8 -i ippp0 -j MASQ


# NTP:
ipchains $1 input -s ntp.via.ecp.fr 123 -d $Adresse -i $Interface -p udp -j ACCEPT
ipchains $1 input -s hmljhp.rzs-hm.si 123 -d $Adresse -i $Interface -p udp -j ACCEPT
ipchains $1 input -s time.ijs.si 123 -d $Adresse -i $Interface -p udp -j ACCEPT

#...max


# Normalen Surf-Betrieb erlauben:
#   Wird eigentlich immer benötigt. Erlaubt Benutzern des eigenen
#   Rechners, Daten aus dem Internet abzufragen. Ein Verbindungsaufbau
#   zu unserem Rechner wird jedoch verboten (mit "! -y" am Ende der Zeile).
#   Darf nicht zusammen mit der Freigabe von "IRC mit DCC" verwendet
#   werden.
/sbin/ipchains $1 input -d $Adresse 1024: -i $Interface -p tcp -j ACCEPT ! -y
#max.: um FTP-Server für PASSIVE-FTP connections von außen sein zu können,
#max.: müssen wir natürlich auch SYN-packets auf Ports > 1023 erlauben:
#/sbin/ipchains $1 input -d $Adresse 1024: -i $Interface -p tcp -j ACCEPT 

}

##############################################################################


##############################################################################
############                                                  ################
############  Ab hier braucht nichts mehr verändert zu werden ################
############                                                  ################
##############################################################################


##############################################################################
# Funktion "NameserverListe"
#   Liefert eine Liste aller eingetragenen Nameserver
#

NameserverListe ()
{
  if [ -r /etc/resolv.conf ]; then
    set -- `grep -i nameserver /etc/resolv.conf`
  fi

  while [ $# -ge 2 ]; do
    echo $2
    shift 2
  done
}

#
##############################################################################

#
# Zunächst brauchen wir genug Parameter, mindestens 6. Sonst müssen wir gleich
# wieder aufhören.
#

if [ $# -ge 6 ]; then
  # Zur besseren Lesbarkeit speichern wir die Variablen unter
  # anderem Namen
  Aktion=$1
  Interface=$2
  Adresse=$5
else
  # Nicht genug Parameter, wir müssen aufhören.
  echo "Zu wenige Parameter."
  echo "  $0 [up/down] [interface] [device] [speed] [localip] [remoteip]"
  exit
fi


#
# Anhand der Aktion wird entschieden, was wir tun
#
if [ $Aktion = "up" ]; then
  # Unsere Firewall soll eingerichtet werden
  #
  # Es könnte bereits eine Firewall aktiv sein, die unsere Arbeit
  # behindert. Also zunächst die relevanten Firewall-Regeln deaktivieren
  # und die Policy für "input" und "output" korrekt setzen. "forward" und
  # benutzerdefinierte Sektionen werden nicht verändert.
  /sbin/ipchains -P input DENY         # Policy für "input" setzen
  /sbin/ipchains -F input              # Alle Regeln aus "input" löschen
  /sbin/ipchains -P output ACCEPT      # Policy für "output" setzen
  /sbin/ipchains -F output             # Alle Regeln aus "output" löschen

  SetzeRegeln "-A"

elif [ $Aktion = "down" ]; then
  # Unsere Firewall soll deaktiviert werden
  #
  # Deshalb löschen wir alle unsere Regeln und setzen die Policy für
  # "input" und "output" auf ACCEPT
  /sbin/ipchains -P input ACCEPT       # Policy für "input" setzen
  /sbin/ipchains -P output ACCEPT      # Policy für "output" setzen

  SetzeRegeln "-D"

else
  echo "Falscher Aufruf."
  echo "  $0 [up/down] [interface] [device] [speed] [localip] [remoteip]"
  exit
fi

/ comp / ipchains / result /

the result will be ipchains which match to your current ip-address.
e.g.:

 ACCEPT  udp  ------  205.188.153.100   123.123.123.123    4000 -> 1024:65535

with this rule, you'll accept udp-packets from 205.188.153.100 (which is one of the icq-servers) port 4000 destined to your machine (with the current ip 123.123.123.123 you got from your isp) ports 1024 through 65535.

but remember: no firewall (actually this mechanism just described is correctly called "packet filtering") can guarantee perfect security. always keep as many ports closed as possible, just open those you really have services for and just use services you really need!
nearly any programme can be a security-leak...


Valid HTML 4.01! Valid CSS! Created with Vim [Blue Ribbon Campaign icon]
© Markus Amersdorfer
last modified: Tuesday, 23-Feb-2010 15:42:08 UTC