Linux.iptables

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen

iptables ist ein Paket-Gutachter der in den Kernel integriert ist. Es gibt viele Bildchen, die erklären wollen wie ein Paket durch den Kernel läuft. Ich habe aber bisher keines Verstanden und whrheitsgemäss die Wirklichkeit abgebildet haben. Ich stelle mir die Sache so vor:

  • Auf einem Laufband sieht der Kernel wie ALLE Pakete durch das System ziehen. Auf dem Adressaufkleber jedes Paketes sind diverse Eintragungen gemacht. iptables kann nun durch ein Regelwerk zu diversen Fälschungen an diesem Adressaufkleber gewzungen werden. iptables kann Pakete auch einfach vom Band kicken (DROP) oder dem versender mitteilen, dass die Annahme verweigert wurde (REJECT).
  • Einzelne Zeilen des Adressaufkleber sind:
# Inhaltsinfo
Typ      
Grösse
# Herkunft  
Quell-IP Quell-Port
Quell-Interface
# Ziel 
Ziel-IP Ziel-Port
Ziel-Interface


and-firewall

<code> #!/bin/bash # # # to-do # ===== # # 1) umstellen auf /etc/init.d/skeleton # 2) ev. keepcon ein interface ppp0,ippp0 übergeben lassen, wenn # der erste parameter leer ist # # IPTABLES=/usr/sbin/iptables DEV_LOC=eth0 DEV_EXT=$2 # DEV_EXT=dsl0 # Kernelmodule laden . /etc/rc.status rc_reset echo -n "Wolff firewall Rev. 1.000 device $2" rc_status -v echo "1" > /proc/sys/net/ipv4/conf/$DEV_LOC/rp_filter echo "0" > /proc/sys/net/ipv4/conf/$DEV_LOC/accept_redirects echo "0" > /proc/sys/net/ipv4/conf/$DEV_LOC/accept_source_route echo "0" > /proc/sys/net/ipv4/conf/$DEV_LOC/bootp_relay echo "1" > /proc/sys/net/ipv4/conf/$DEV_LOC/log_martians echo "1" > /proc/sys/net/ipv4/conf/$DEV_EXT/rp_filter echo "0" > /proc/sys/net/ipv4/conf/$DEV_EXT/accept_redirects echo "0" > /proc/sys/net/ipv4/conf/$DEV_EXT/accept_source_route echo "0" > /proc/sys/net/ipv4/conf/$DEV_EXT/bootp_relay echo "1" > /proc/sys/net/ipv4/conf/$DEV_EXT/log_martians # done echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses echo "1" > /proc/sys/net/ipv4/ip_dynaddr echo "1" > /proc/sys/net/ipv4/ip_forward # Zu Anfang alles verbieten (Default Policy) $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT # Alle Regelketten, die sich noch im Speicher befinden könnten, löschen $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -X # Kernelmodule masq und forwarding aktivieren (dyn. IP vom Provider) $IPTABLES -t nat -A POSTROUTING -o $DEV_EXT -j MASQUERADE $IPTABLES -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # XML RPC $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p tcp --dport 3049 -j DNAT --to 192.168.115.34:3048 # sewa3 $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p tcp --dport 8082 -j DNAT --to 192.168.115.34:5900 # sewa4 $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p tcp --dport 8083 -j DNAT --to 192.168.115.35:80 $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p tcp --dport 8084 -j DNAT --to 192.168.115.35:5900 /etc/tcshape /etc/mac-filter.sh rc_exit </code>

Diagnose, Techniken

iptables -t nat -L -v -n


     Alle Arbeitsplatz-Rechner sicher und einfach ins InterNet zu bringen
     ist hierbei vorrangiges Ziel.
   a) Skript "myfirewall.sh" (in der Anlage sicherlich aktueller als dieser Snapshot)
      nach /root kopieren.
   --- snip
       # !/bin/bash
       IPTABLES=/usr/sbin/iptables
       DEV_LOC=eth0
       DEV_EXT=ppp0
       DNS_EXT=194.25.2.129
       # for IF in $DEV_LOC $DEV_EXT do
       # Kernelmodule laden
       echo "1" > /proc/sys/net/ipv4/conf/eth0/rp_filter
       echo "0" > /proc/sys/net/ipv4/conf/eth0/accept_redirects
       echo "0" > /proc/sys/net/ipv4/conf/eth0/accept_source_route
       echo "0" > /proc/sys/net/ipv4/conf/eth0/bootp_relay
       echo "1" > /proc/sys/net/ipv4/conf/eth0/log_martians
       echo "1" > /proc/sys/net/ipv4/conf/$DEV_EXT/rp_filter
       echo "0" > /proc/sys/net/ipv4/conf/$DEV_EXT/accept_redirects
       echo "0" > /proc/sys/net/ipv4/conf/$DEV_EXT/accept_source_route
       echo "0" > /proc/sys/net/ipv4/conf/$DEV_EXT/bootp_relay
       echo "1" > /proc/sys/net/ipv4/conf/$DEV_EXT/log_martians


       # done
       echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
       echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
       echo "5" > /proc/sys/net/ipv4/icmp_destunreach_rate
       echo "5" > /proc/sys/net/ipv4/icmp_echoreply_rate
       echo "5" > /proc/sys/net/ipv4/icmp_paramprob_rate
       echo "10" > /proc/sys/net/ipv4/icmp_timeexceed_rate
       # Zu Anfang alles verbieten (Default Policy)
       $IPTABLES -P INPUT ACCEPT
       $IPTABLES -P OUTPUT ACCEPT
       $IPTABLES -P FORWARD ACCEPT
       # Alle Regelketten, die sich noch im Speicher befinden k"nnten, l"schen
       $IPTABLES -F
       $IPTABLES -t nat -F
       $IPTABLES -X
       # Verbindungen f?r Testzwecke am eigenen Rechner ?ber das Loopback. Einige
       # lokale Prozesse wie BIND verwenden das Loopback f?r die interne Kommunikation
       $IPTABLES -A OUTPUT -o lo -j ACCEPT
       $IPTABLES -A INPUT -i lo -j ACCEPT
       # Alle externen Verbindungsversuche und ander Merkw?rdigkeiten werden hier
       # aufgefangen, im SYSLOG vermerkt und dann unsch?dlich gemacht
       $IPTABLES -N nirwana
       # $IPTABLES -A nirwana -p TCP -j LOG --log-prefix "NIRWANA: TCP "
       # $IPTABLES -A nirwana -p UDP -j LOG --log-prefix "NIRWANA: UDP "
       # $IPTABLES -A nirwana -p ICMP -j LOG --log-prefix "NIRWANA: ICMP "
       # $IPTABLES -A nirwana -p TCP -j DROP
       # Kernelmodule masq und forwarding aktivieren (dyn. IP vom Provider)
       echo "1" > /proc/sys/net/ipv4/ip_dynaddr
       echo "1" > /proc/sys/net/ipv4/ip_forward
       $IPTABLES -t nat -A POSTROUTING -o $DEV_EXT -j MASQUERADE
       $IPTABLES -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
       # F?e bestehenden ein- und ausgehenden Verbindungen. Dritte Regel
       # verhindert alle Verbindungen die Au᥮ kommen
       $IPTABLES -A FORWARD -i $DEV_LOC -o $DEV_EXT -m state --state ESTABLISHED,RELATED -j ACCEPT
       $IPTABLES -A FORWARD -i $DEV_EXT -o $DEV_LOC -m state --state ESTABLISHED,RELATED -j ACCEPT
       # $IPTABLES -A FORWARD -i $DEV_EXT -o $DEV_LOC -m state --state NEW,INVALID -j nirwana
       # Zugriff auf internen WEB-Server
       # $IPTABLES -A PREROUTING -t nat -p tcp -i $DEV_EXT --dport 80 -j DNAT --to 192.168.115.8:80
       $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p tcp --dport 80 -j DNAT --to 192.168.115.8:80
       $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p tcp --dport 5900 -j DNAT --to 192.168.115.1:5900
       # WinMx auf fred!
       $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p tcp --dport 6699 -j DNAT --to 192.168.115.3:6699
       $IPTABLES -t nat -A PREROUTING -i $DEV_EXT -p udp --dport 6257 -j DNAT --to 192.168.115.3:6257
       # Ping ins Internet erlauben, eingehende werden von der NIRWANA-Rule abgefangen
       $IPTABLES -A FORWARD -o $DEV_EXT -p ICMP --icmp-type echo-request -j ACCEPT
       # DNS
       $IPTABLES -A FORWARD -o $DEV_EXT -p tcp --sport 1024:65535 --dport domain -d $DNS_EXT -m state --state NEW -j ACCEPT
       # HTTP
       $IPTABLES -A FORWARD -o $DEV_EXT -p tcp --sport 1024:65535 --dport http -m state --state NEW -j ACCEPT
       # $IPTABLES -A FORWARD -o $DEV_EXT -p tcp --sport 1024:65535 --dport https -m state --state NEW -j ACCEPT
       # FTP
       # $IPTABLES -A FORWARD -o $DEV_EXT -p tcp --sport 1024:65535 --dport ftp -m state --state NEW -j ACCEPT
       # $IPTABLES -A FORWARD -o $DEV_EXT -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state NEW -j ACCEPT
       # Alle Pakete, die bis hierher kommen nach nirwana
       $IPTABLES -A INPUT -j nirwana
       $IPTABLES -A OUTPUT -j nirwana
       $IPTABLES -A FORWARD -j nirwana
   --- snap


__zuk?s thema: lokales umlenken lokaler Port traffics. Z.b. aller verkehr aus dem Internet

   soll umgeleitet werden von "80" auf "8080".
       iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j REDIRECT \
       --to-ports 8080
       iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner \! --uid-owner 13 \
       -j REDIRECT --to-ports 8080
       Should work. I tested it on my own firewall, although I just tested it
       with netcat, not a real proxy.
       Locally generated packets don't go through the PREROUTING chain, so you
       have to manipulate them in OUTPUT, and you also have to differentiate
       them from the proxy's outgoing packets, hence the match against uid 13
       (proxy), taken from /etc/passwd.
       Unfortunately, you'll have to enable owner match support in your kernel
       for the second line to work, so you might have to recompile (it's one of
       the features labelled experimental).
         Jason

__zuk?s thema: Bandbreiten verteilung: siehe artikel in c't 01/03. Kommt aber

   sicher stablier ab "suse 8.2", das es kernel >2.4.19 erfordert.
   b) mit
      chmod 755 /root/myfirewall.sh
      macht man dieses Script ausf?. Nun starten ...
      /root/myfirewall.sh
   c) Automatischer Start der Firewall beim booten ...
      Als root einloggen und folgende Zeilen eingeben:
      ln -s /root/myfirewall.sh /etc/init.d/rc2.d/S30myfirewall <RETURN>
      ln -s /root/myfirewall.sh /etc/init.d/rc3.d/S30myfirewall <RETURN>
      ln -s /root/myfirewall.sh /etc/init.d/rc5.d/S30myfirewall <RETURN>
      fehlt noch: "K" links, myfirewall sollte echtes Script werden, das
                  "start" und "stop" auswerten kann.
   d) Eintrag in /etc/rc.config 䮤ern: IP_FORWARD="no" auf "yes"
      Eintrag wirksam machen mit SuSEconfig