PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : debian als gateway



zejote
04.04.2008, 10:36
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:


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


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


# 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


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


#!/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


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


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

bitmuncher
04.04.2008, 12:26
Routing aktivieren:

Erstmal IP-Forwarding aktivieren:



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


Dann die FORWARD-Chain auf ACCEPT setzen:



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


Und Masquerading aktivieren:



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:



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

zejote
05.04.2008, 00:32
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!

JBR
05.04.2008, 11:56
Die sysctl Eintstellungen setzt man besser per /etc/sysctl.conf, folgender Eintrag in dieser Datei aktiviert das Forwarding:

net.ipv4.ip_forward=1

codc
05.04.2008, 15:51
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: c327de613b86a0a51937e3bfc9efa9a05f4dc3dd5e8a5b5f45 91b030d51ac2c2
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.

zejote
11.04.2008, 16:02
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?

bitmuncher
11.04.2008, 17:57
Wie sieht denn der Output von 'iptables -L' aus?

JBR
11.04.2008, 18:12
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

zejote
11.04.2008, 18:25
Wie erwähnt verlasse ich mich nun auf das "Hackerskript" zum setzten der iptables-Konfiguration.

Die Ausgabe ist folgende:

# 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

bitmuncher
12.04.2008, 14:15
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.

zejote
13.04.2008, 01:04
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...


#!/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

bitmuncher
13.04.2008, 16:12
Das REJECT muss vor die Zeile


$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



$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.

zejote
15.04.2008, 00:39
Habe den Reject so eingefügt wie vorgeschlagen, also

$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

bitmuncher
15.04.2008, 00:44
Hmm, da bin ich langsam auch ratlos. Evtl. einfach eine zweite Routing-Tabelle für eth2 nutzen. Sowas lässt sich mit iproute2 umsetzen.

zejote
16.04.2008, 00:11
Ich habe die Regeln nochmal erweitert, nun verwende ich

$IPTABLES -A FORWARD -i eth2 -m state --state ESTABLISHED,RELATED,NEW -j REJECT
vor der Zeile

$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

bitmuncher
16.04.2008, 02:21
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.

zejote
16.04.2008, 10:00
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