debian als gateway

zejote

zejote

Grünschnabel
Hallo!

Ich versuche mein Linux zum Routen zu überreden, leider bislang erfolglos. Bislang läuft der dhcp-Server und der entsprechende Client "hermes" wird ordentlich konfiguriert. Von diesem kann ich das Gateway anpingen (ping 192.168.1.1), um die umgekehrte Richtung erhalte ich keine Rückmeldung (ping timeout).

In meiner routing.sh hatte ich auch den Tipp eines Kollegen berücksichtigt und den TTL-Wert für die Inetverbindung modifiziert. Leider war auch das nicht die Ursache für mein Problem. Ich kann einfach nicht die bestehende Verbindung weiterreichen.
Mittlerweile gehen mir die Ideen aus, wo ich die Ursache suchen soll. Vor allem der verweigerte Ping irritiert mich; die ssh-Verbindung läuft ohne Probleme. In der Routingtabelle sehe ich keine Auffälligkeiten.

Ich hoffe, dass einer von euch eine Idee hat und sich von den vielen Code-Schnipseln nicht abschrecken läßt!

Danke.
zejote




Die Netzwerkstruktur:
Code:
inet (ppp0)   <-->   eth0 [192.168.0.1] "pandora"
client [192.168.1.2] "hermes" <-->   eth1 [192.168.1.1] "pandora"

>cat /etc/dhcp3/dhcpd.conf
Code:
default-lease-time 86400;
max-lease-time 604800;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0
{
  host hermes
  {
    hardware ethernet 00:0e:a6:24:40:e0;
    fixed-address 192.168.1.2;
    option routers 192.168.1.1;

    option domain-name "my.olymp";
    option domain-name-servers 192.168.1.1;
    option broadcast-address 192.168.1.255;
  }}


>cat /etc/network/interfaces
Code:
# The loopback network interface
auto lo
iface lo inet loopback

auto dsl-provider
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth0 up # line maintained by pppoeconf
provider dsl-provider

auto eth1
allow-hotplug eth1
iface eth1 inet static
  address 192.168.1.1
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255


> route -n
Code:
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
62.214.64.210   0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0


> cat routing.sh
Code:
#!/bin/sh

IPT=/sbin/iptables

EXTIF=ppp0
INTIF=eth1

case "$1" in
start)
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo "1" > /proc/sys/net/ipv4/ip_forward
$IPT -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
$IPT -A FORWARD -j LOG
$IPT -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
;;
stop)
echo "0" > /proc/sys/net/ipv4/ip_forward
$IPT -t nat -F
;;
restart)
$0 stop
/usr/bin/sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac


> ifconfig
Code:
eth0      Link encap:Ethernet  Hardware Adresse 00:50:bf:d9:f4:0f  
          inet6-Adresse: fe80::250:bfff:fed9:f40f/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:317 errors:0 dropped:0 overruns:0 frame:0
          TX packets:559 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:30780 (30.0 KiB)  TX bytes:55043 (53.7 KiB)
          Interrupt:11 Basisadresse:0xe800 

eth1      Link encap:Ethernet  Hardware Adresse 00:50:bf:38:04:a6  
          inet Adresse:192.168.1.1  Bcast:192.168.1.255  Maske:255.255.255.0
          inet6-Adresse: fe80::250:bfff:fe38:4a6/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:5722 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3857 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:512609 (500.5 KiB)  TX bytes:551857 (538.9 KiB)
          Interrupt:12 Basisadresse:0xec00 

lo        Link encap:Lokale Schleife  
          inet Adresse:127.0.0.1  Maske:255.0.0.0
          inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine
          UP LOOPBACK RUNNING  MTU:16436  Metrik:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:0 
          RX bytes:560 (560.0 B)  TX bytes:560 (560.0 B)

ppp0      Link encap:Punkt-zu-Punkt-Verbindung  
          inet Adresse:89.246.181.68  P-z-P:62.214.64.210  Maske:255.255.255.255
          UP PUNKTZUPUNKT RUNNING NOARP MULTICAST  MTU:1492  Metrik:1
          RX packets:208 errors:0 dropped:0 overruns:0 frame:0
          TX packets:446 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:3 
          RX bytes:19568 (19.1 KiB)  TX bytes:38282 (37.3 KiB)


Wie bereits erwähnt läuft die dhcp-Konfiguration des angehängten PCs ohne Probleme; der ssh-Zugang zum Router steht.
hermes:> ifconfig
Code:
eth0      Link encap:Ethernet  Hardware Adresse 00:0e:a6:24:40:e0  
          inet Adresse:192.168.1.2  Bcast:192.168.1.255  Maske:255.255.255.0
          inet6-Adresse: fe80::20e:a6ff:fe24:40e0/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:106309 errors:0 dropped:0 overruns:0 frame:0
          TX packets:107978 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:21501789 (20.5 MiB)  TX bytes:13275999 (12.6 MiB)
          Interrupt:19 

lo        Link encap:Lokale Schleife  
          inet Adresse:127.0.0.1  Maske:255.0.0.0
          inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine
          UP LOOPBACK RUNNING  MTU:16436  Metrik:1
          RX packets:649526 errors:0 dropped:0 overruns:0 frame:0
          TX packets:649526 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:0 
          RX bytes:49460823 (47.1 MiB)  TX bytes:49460823 (47.1 Mi
 
Routing aktivieren:

Erstmal IP-Forwarding aktivieren:

Code:
echo 1 > /proc/sys/net/ipv4/ip_forward

Dann die FORWARD-Chain auf ACCEPT setzen:

Code:
iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

Und Masquerading aktivieren:

Code:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Ausserdem die OUTPUT-Chain auf ACCEPT setzen, damit Verbindungen nach aussen aufgebaut werden könnne. Die INPUT-Chain kommt auf DROP:

Code:
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP

Weitere Infos inkl. komplettem Skript findest du unter http://www.hackerwiki.org/index.php/Einrichtung_eines_Routers_mit_Linux
 
-gelöst-

Vielen Dank für die schnelle Hilfe. Bei meinen bisherigen Recherchen bin ich zwar auch schon auf dein "Hackerskript" gestoßen, allerdings vermutete ich den Fehler eher in der routing-Tabelle...
Nun, beim Vergleich fiel es auf: in der forward-Regel das new vergessen und der DNS-Server hatte nen Zahlendreher. Eine gemeine Kombination!
 
Die sysctl Eintstellungen setzt man besser per /etc/sysctl.conf, folgender Eintrag in dieser Datei aktiviert das Forwarding:
Code:
net.ipv4.ip_forward=1
 
Für Routing/Firewall empfehle ich ganz gerne:
~$ apt-cache show arno-iptables-firewall
Package: arno-iptables-firewall
Priority: optional
Section: net
Installed-Size: 488
Maintainer: Michael Hanke <michael.hanke@gmail.com>
Architecture: all
Version: 1.8.8.c-1
Depends: iptables (>= 1.2.11), gawk, debconf (>= 1.3.22) | cdebconf (>= 0.43), debconf (>= 0.5) | debconf-2.0
Filename: pool/main/a/arno-iptables-firewall/arno-iptables-firewall_1.8.8.c-1_all.deb
Size: 97728
MD5sum: 685f508e50a162320138c8699ad9facc
SHA1: 24028b37b47df4e006c876fd47aaa4c18e70d917
SHA256: c327de613b86a0a51937e3bfc9efa9a05f4dc3dd5e8a5b5f4591b030d51ac2c2
Description: Single- and multi-homed firewall script with DSL/ADSL support
Unlike other lean iptables frontends in Debian, arno-iptables-firewall
will setup and load a secure, restrictive firewall by just asking a few
question. This includes configuring internal networks for internet access
via NAT and potential network services (e.g. http or ssh).
.
However, it is in no way restricted to this simple setup. Some catch words
of additional features, that can be enabled in the well documented
configuration file are: DSL/ADSL, Port forwarding, DMZ's,
portscan detection, MAC address filtering.
.
Homepage: http://rocky.eld.leidenuniv.nl/
Tag: admin::monitoring, implemented-in::shell, network::firewall, security::firewall, use::filtering
Ich hatte das selber eine Weile im Einsatz - leicht zu konfigurieren und man braucht sich um IP-Tables nicht zu kümmern.
 
subnetz vom inet trennen

Dank euer Unterstützung funktioniert beim meinem Router nun fast alles wie es soll. Eine kleine Frage habe ich aber noch: Wie kann ich das "Forwarden" wieder abschalten :D Scherz bei Seite, mein Problem ist folgendes:

Um keinen zusätzlich Router zu verwenden habe ich ich nun mein "Gateway" mit insgesamt 4 NICs ausgestattet, eth0 geht - wie gehabt - ins Internet, ansonsten sind die 3 restlichen eth[X] ist das entsprechende Subnetz 192.168.[X].0/24 angebunden. Dazu habe ich das iptables start up script um den jeweiligen Eintrag $IPTABLES -A INPUT -i eth[X] -j ACCEPT erweitert.
So weit funktioniert alles wunderbar!

Nun möchte ich aber, dass der PC an eth2 (192.168.2.0/24) *keine* Verbindung zum Internet bekommt. Nach meinem Wissen hätte es doch ein entsprechender Eintrag a la IPTABLES -A FORWARD -i eth0 -o -eth2 -j REJECT bewerkstelligen sollen. $IPTABLES -A INPUT -i eth2 -j ACCEPT habe ich natürlich weggelassen. Trotzdem kann ich noch immer alle denkbaren websites anpingen.

Wer weiß Rat?
 
Wie sieht denn der Output von 'iptables -L' aus?
 
IPTABLES -A FORWARD -i eth0 -o -eth2 -j REJECT
dann ist die die letzte und wird auch zuletzt geparst => keine Wirkung
besser IPTABLES -I FORWARD -i eth0 -o -eth2 -j REJECT
 
iptables -l

Wie erwähnt verlasse ich mich nun auf das "Hackerskript" zum setzten der iptables-Konfiguration.

Die Ausgabe ist folgende:
Code:
# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request
LOGREJECT  tcp  --  anywhere             anywhere

Chain FORWARD (policy DROP)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere            state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
LOGREJECT  tcp  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain LOGREJECT (2 references)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere            limit: avg 20/min burst 5 LOG level notice tcp-options ip-options prefix `FIREWALL REJECT '
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
 
Zeigt mal bitte auch dein Skript (ist übrigens kein "Hackerskript", sondern ein ganz normales Shell-Skript). Ich vermute, dass die Reihenfolge der gesetzten Regeln nicht stimmt. Rejects müssen immer vor den Accepts stehen, damit sie greifen können.
 
firewall start up script

Hallo!

Wie, das ist kein Hackerskript??? Ich habe es doch von http://www.hackerwiki.org. Und ich hatte mich schon gewundert wieso die Polizei noch nicht vor meiner Tür stand! Und shell script? Na dann lösche ich das "#!/bin/hacker" aus der 1. Zeile wieder raus :D :D :D

Ich merke, ich sollte meine Ironie besser kennzeichnen. ;) Eigentlich wollte ich auf diese Art etwas Kommunikation einsparen, da ich derzeit noch keine großen Änderungen am Skript vorgenommen habe...

Code:
#!/bin/bash

LOGLIMIT=20
IPTABLES=/sbin/iptables

case "$1" in
start)
        echo "Starting firewall"

        # alle alten Regeln entfernen
        echo "Loesche alte Regeln"
        $IPTABLES -F
        $IPTABLES -X
        $IPTABLES -t nat -F

        # Routing
        echo 1 > /proc/sys/net/ipv4/ip_forward
        $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
        $IPTABLES -t nat -A POSTROUTING -o eth0 -j MASQUERADE

$IPTABLES -I FORWARD -i eth0 -o -eth2 -j REJECT

#       $IPTABLES -A FORWARD -i eth2 -o -eth0 -j REJECT
#       $IPTABLES -A FORWARD -i eth0 -o -eth2 -j REJECT

        ### ERSTELLE NEUE KETTEN ###
        # Chain to log and reject a port by ICMP port unreachable
        $IPTABLES -N LOGREJECT
        $IPTABLES -A LOGREJECT -m limit --limit $LOGLIMIT/minute -j LOG \
          --log-prefix "FIREWALL REJECT " --log-level notice --log-ip-options --log-tcp-options
        $IPTABLES -A LOGREJECT -j REJECT --reject-with icmp-port-unreachable

        ### PROC MANIPULATION ###
        # auf Broadcast-Pings nicht antworten
        echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

        # halt die Klappe bei komischen ICMP Nachrichten
        echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

        # Kicke den ganzen IP Spoofing Shit
        # (Source-Validierung anschalten)
        echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

        # Setze Default-TTL auf 61 (Default fuer Linux ist 64)
        echo 61 > /proc/sys/net/ipv4/ip_default_ttl

        # sende RST-Pakete wenn der Buffer voll ist
        echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow

        # warte max. 30 secs auf ein FIN/ACK
        echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

        # unterbreche Verbindungsaufbau nach 3 SYN-Paketen
        # Default ist 6
        echo 3 > /proc/sys/net/ipv4/tcp_syn_retries
        # unterbreche Verbindungsaufbau nach 3 SYN/ACK-Paketen
        # Default ist 6
        echo 3 > /proc/sys/net/ipv4/tcp_synack_retries

        ### MAIN PART ###
        $IPTABLES -P INPUT DROP
        $IPTABLES -P FORWARD DROP
        $IPTABLES -P OUTPUT ACCEPT
        $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

        # im Loopback koennen wir jedem trauen
        $IPTABLES -A INPUT -i lo -j ACCEPT
        # ebenso im LAN
        $IPTABLES -A INPUT -i eth1 -j ACCEPT
#       $IPTABLES -A INPUT -i eth2 -j ACCEPT
        $IPTABLES -A INPUT -i eth3 -j ACCEPT

        # erlaube Pings
        $IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

        # Alle TCP Packete, die bis hier hin kommen, werden
        # geloggt und rejected
        # Der Rest wird eh per Default Policy gedroppt...
        $IPTABLES -A INPUT -p tcp -j LOGREJECT
        $IPTABLES -A FORWARD -p tcp -j LOGREJECT
        ;;
stop)
        echo "Stopping firewall..."
        iptables -F INPUT
        iptables -P INPUT ACCEPT
        #turn off NAT/masquerading, if any
        iptables -t nat -F POSTROUTING
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

exit 0
 
Das REJECT muss vor die Zeile

Code:
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

iptables werden sequentiell abgearbeitet. Wenn also zuerst eine ACCEPT-Regel kommt, greift die REJECT-Regel nicht mehr, wenn diese erst dahinter steht. Und wieso benutzt du als Output-Interface eth2, wenn doch von dort die Forwarding-Anfragen eingehen? Damit ist es das doch das Input-Device und eth0, woran das Internet hängt, das Output-Device. Die Regel

Code:
$IPTABLES -A FORWARD -i eth0 -o -eth2 -j REJECT

besagt also: Eingehende Verbindungen auf eth0, die auf das Netzwerk an eth2 zugreifen wollen, werden nicht geforwardet. Das dürfte genau das umgekehrte von dem sein, was du erreichen willst.
 
reject ohne wirkung

Habe den Reject so eingefügt wie vorgeschlagen, also
Code:
$IPTABLES -A FORWARD -i eth2 -o -eth0 -j REJECT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

Leider geht der Rechner an eth2 noch immer munter ins Internet. Auch das Einfügen der reject Regel am Anfang mit "-I" zeigt nicht die gewünschte Wirkung.
Alle vorhandenen Einträge wurden ordentlich "geflushed", daran kann es nicht liegen. Es handelt sich auch wirklich um eth2, diese Fehlerquelle kann ebenfalls ausgeschlossen werden.

hilfe!
zejote
 
Hmm, da bin ich langsam auch ratlos. Evtl. einfach eine zweite Routing-Tabelle für eth2 nutzen. Sowas lässt sich mit iproute2 umsetzen.
 
Lösung?

Ich habe die Regeln nochmal erweitert, nun verwende ich
Code:
$IPTABLES -A FORWARD -i eth2 -m state --state ESTABLISHED,RELATED,NEW -j REJECT
vor der Zeile
Code:
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

So wie ich die iptables manpage verstehe sollte es auf diese Weise gehen. Symptomatisch ist auch alles OK, ich bekomme nach "draußen" keine Verbindung (kein ping, kein dns, etc).
Ist diese Regel sicher oder übersehe ich etwas?

nochmal vielen Dank für die freundliche Hilfe hier!
zejote
 
Die Regel sieht gut aus. Damit werden alle auf eth2 eingehenden Verbindungen, die neu, zugehörig oder bereits bestehend sind und somit alle Verbindungen. Allerdings wird der Router für das Netzwerk an eth2 somit auch das Routing im LAN nicht mehr übernehmen. Die Rechner im LAN müssen also in einem geswitchten Netzwerk oder direkt verbunden sein.
 
[gelöst] reicht so

Du meinst, dass ich mir damit gleichzeitig den Zugang zum LAN blockiere? Dessen bin ich mir bewusst; hauptsache, ich kann das Gateway erreichen und bin nach "draußen"unsichtbar.

Fantastisch, dann läuft jetzt (fast) alles so wie geplant!

nochmals herzlichen Dank an alle, insb. an Bitmuncher!
zejote
 

Ähnliche Themen

Problem bei der installation einer Sun Netzwerkkarte

Openvpn will nicht

Ethernet wird nicht erkannt

Debian 7.6 kein lokales Netz

Debian Routing Problem

Zurück
Oben