PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : iptables portforwarding



Duffy1905
08.05.03, 10:17
Ist das richtig damit???

iptables -t nat -A PREROUTING -i eth1 -p protocol -d ip_address_of_eth1 --dport original_port_number -j DNAT --to destination_ip_address:destination_port_number

Weiterleitung der Pakete:
iptables -A FORWARD -i eth1 -o eth0 -p protocol -d destination_ip_address --dport destination_port_number -j ACCEPT


Blos was mach ich wenn ich mehrere Rechner hinter meiner Firewall habe?
Und alle nutzen zB den Port 80???

Wie kann ich dann das Portforwarding an mehrere Rechner machen?

Da.Bull
08.05.03, 10:50
Das ist nicht möglich !

Der Port 80 ist bei dir ja dazu da, dass jemand auf Port 80 auf deinem Router zugreifen kann. Wenn du nun aber Portforwarding für Port 80 aktivierst, ist es nur logisch, dass du nur einen anderen Rechner für den Port 80 nehmen kannst.

Du bekommst von deinem ISP ja ne externe IP zugewiesen. Auf dieser IP kann jeder Port maximal einmal vorhanden sein. Sonst ist ja die Eindeutigkeit der Zuweisung nicht mehr gegeben.

Willst du auf mehreren PCs hinter einem Router zwei www-Server anbieten, so musst du dir 2 IPs von deinem ISP zuweisen lassen (also 2mal anmelden, 2mal zahlen, etc).

Das gilt übrigens nicht nur für Port 80 !

Und nochwas: Du brauchst Port 80 ja nicht generell freigeben, wenn er von ausser nicht erreichbar sein soll (wenn du also keine eigene Homepage im Netz anbietest).

MfG Markus

Duffy1905
08.05.03, 10:58
Die Webserver haben alle eine feste IP die nach aussen sichtbar ist.
Sprich sie gehen mit dieser IP ins Internet und sind mit dieser IP auch erreichbar!
es muss doch möglich sein das die Firewall die Pakete filtert (zB nur TCP-Pakete die über den Port 80, 20 ... kommen, reinläßt) und dann einfach weiter durchläßt und die Pakete die IPs (Webserver) erreichen.

Da.Bull
08.05.03, 11:03
Klar geht das, solange die Datenpakete nur auf jeweils EINEN Rechner weitergeleitet werden !

MfG Markus

[WCM]Manx
08.05.03, 11:17
@Duffy1905

Du müsstest genauere Angaben machen, punkto Netzwerktopologie.
Hast Du z.B 8 IPs vom Provider mit einer Netmask 255.255.255.248, und alle Rechner stehen in einem Subnet => d.h die Firewall brauch nur routen

oder

Hast Du z.B meherer IPs die Webserver stehen aber in einem eigenen Subnet mit privaten IPs => dann brauchst Du SNAT/DNAT

@Da.Bull

Mit SNAT/DNAT kannst Du auch Pakete, die an einen Rechner gehen auf mehrere weiterleiten lassen, zumindest versteh ich das so (hab's noch nicht versucht):


## Zieladresse zu 5.6.7.8, 5.6.7.9 oder 5.6.7.10 aendern
# iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8-5.6.7.10

... loadbalancing ala round-robin für arme ;)

Grüße

Manx

Duffy1905
08.05.03, 11:19
ja klar sollen die Pakete immer nur auf einen Rechner.
Mal der mal der, wo halt grad das Paket hinsoll.

die pakete sollen durch die Firewall, werden dort eventuell gefiltert.
Die die durchkommen sehen ja dann anhand der IP an welchen Webserver sie sollen.

*ich komm mir grad sau dumm vor*

[WCM]Manx
08.05.03, 11:28
Hi!

Vielleicht hast Du ja mein obiges Posting übersehen (der F5-Effekt ;) ).
Hast Du jetzt einen Router UND eine Firewall, oder nur EINE Linuxbox als Router/Firewall/Gateway?

Grüße

Manx

Nuno
08.05.03, 11:50
also ... wenn du mehere ip's an deinem linux router hängen hast dann machst du eben 2 regeln ...

eine für destination ip 1 und eine für die zweite ... mit den entsprecheneden redirects ...

hast du ja auch selber geschrieben :


Die die durchkommen sehen ja dann anhand der IP an welchen Webserver sie sollen.

Natuerlich muss dazu am extern Interface der FW eine Subnetmask haengen welche auch dein subnet vertritt ...

Dies ist aber auch dann der Fall wenn deine FW hinter einem Router vom ISP steht ...

Klaro ? :D

[WCM]Manx
08.05.03, 12:14
Original geschrieben von Nuno
Dies ist aber auch dann der Fall wenn deine FW hinter einem Router vom ISP steht ...


Hi!

Wenn er einen Router und eine Firewall betreibt, kann sich die Sache u.U verkomplizieren.
z.B
Er bekommt vom Provider einen IP Range mit 8 IPs (Subnet 255.255.255.248) und den Router dazu (kommt häufig vor), der vom ISP verwaltet wird!
In diesem Fall kannst Du Dir direkten Zugriff mit Routing und offiziellen IPs auf die Webserver über eine Firewall aufzeichnen :D

Hat er den Router selber zu konfigurieren, wird's auch etwas komplizierter.
Da es sich um offizielle IPs handelt, und diese knapp sind, wird er einmal eine Point-to-Point Netzwerk zw. Router und FW einrichten (und am Router die korrekten Routen eintragen müssen).

Grüße

Manx

Duffy1905
08.05.03, 12:25
@[WCM]Manx

"Hast Du z.B 8 IPs vom Provider mit einer Netmask 255.255.255.248, und alle Rechner stehen in einem Subnet => d.h die Firewall brauch nur routen "

so sieht das ungefähr bei mir aus!
Und wie lass ich die Firewall nur routen???

hier vielleicht mal mein Script:

#!/bin/sh


### Alle vorhandenen Regelketten werden gelöscht
iptables -F
iptables -t nat -F
iptables -X


### Variablen für unsere Interfaces
DEV_EXT=eth0
DEV_LAN=eth1


### Alles was von Aussen kommt oder rausgeht wird verworfen
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP


### Loopback-Interface aktivieren
iptables -A OUTPUT -o lo -j ACCEPT
iptables A INPUT -i lo -j ACCEPT


### Aktivieren von Forwarding und Masquerading
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables –t nat –A Postrouting –o $DEV_EXT –j MASQUERADE


### Die benutzerdefinierten Chains werden angelegt
iptables -N MY_REJECT
iptables -N MY_DROP


### MY_REJECT füllen
iptables -A MY_REJECT -p tcp -m limit 7200/h -j LOG --log prefix "REJECT TCP"
iptables -A MY_REJECT -p tcp -j REJECT --reject-with tcp-reset
iptables -A MY_REJECT -p udp -m limit 7200/h - LOG --log prefix "REJECT UDP"
iptables -A MY_REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A MY_REJECT -p icmp -m limit 7200/h -j LOG --log prefix "DROP ICMP"
iptables -A MY_REJECT -p icmp -j ACCEPT
iptables -A MY_REJECT -m limit --limit 7200/h -j LOG --log-prefix "REJECT OTHER"
iptables -A MY_REJECT -j REJECT --reject-with icmp-port-unreachable



### MY_DROP-CHAIN
iptables -A MY_DROP -m limit --limit 7200/h -j LOG --log-prefix "PORTSCAN DROP"
iptables -A MY_DROP -j DROP


### Alle verworfenen Packete protokollieren
iptables -A INPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "INPUT INVALID"
iptables -A OUTPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "OUTPUT INVALID"


### Korrupte Pakete zurueckweisen
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP


### ausgehende Pakete bei bereits aufgebauter Verbindung erlauben
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


### HTTP:
iptables -A INPUT -i $DEV_EXT -o $DEV_LAN -m state --state NEW -p tcp --dport 80 -j ACCEPT

### HTTPS:
iptables -A INPUT -i $DEV_EXT -o $DEV_LAN -m state --state NEW -p tcp --dport 443 -j ACCEPT

### FTP:
iptables -A INPUT -i $DEV_EXT -o $DEV_LAN -m state --state NEW -p tcp --dport 21 -j ACCEPT

### SSH:
iptables -A INPUT -i $DEV_EXT -o $DEV_LAN -m state --state NEW -p tcp --dport 22 -j ACCEPT


### Rückkanal: eingehende Pakete zu einer bestehenden Verbindung
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW,INVALID -j MY_REJECT

[WCM]Manx
08.05.03, 12:40
Hi!

Du hast keine einzige FORWARD Regel, nur die Default Policy auf drop, da kann nix durch!
Außerdem fällt mir auf die Schnelle auf, dass INPUT Chain und -i UND -o NICHT zusammenpassen.
So in die Richtung solltest Du zum Ziel kommen:


iptables -A FORWARD -i $DEV_EXT -o $DEV_LAN -d $IP_des_WEBSERVER_1 -m state NEW -p TCP --dport 80 -j ACCEPT


Soll Deine Firewall unsichtbar sein, gibt's keine INPUT-Regeln die (von außen) Sachen erlauben.

Grüße

Manx

Da.Bull
08.05.03, 12:57
sry, bin davon ausgegangen, dass du nur EINE IP "richtung" Internet hast...

MfG Markus

Duffy1905
08.05.03, 13:10
ok also soll ich die Input chain komplett löschen???
Und für jeden Port den ich in meiner INPUT chain freigebe nur in der Forward Chain
freigeben (so wie du es angegeben hast)?

du hast geschrieben Webserver 1:

iptables -A FORWARD -i $DEV_EXT -o $DEV_LAN -d $141.52.X.Y1 -m state NEW -p TCP --dport 80 -j ACCEPT

für den Webserver 2:

iptables -A FORWARD -i $DEV_EXT -o $DEV_LAN -d $141.52.X.Y2 -m state NEW -p TCP --dport 80 -j ACCEPT

kann ich das den so machen?

Nuno
08.05.03, 13:20
Wenn du mehrere IP's hast hast du im Normalfall auch eine Standleitung mit Router ...
Wir haben Router welche wir selber verwalten koennen und welche die der ISP verwaltet.

Aber immer wird dein Subnet welches du bezogen hast durchgeroutet. Paketfilterung auf den Kundenroutern machen die ISP's sehr sehr selten.
Und der Router dient meist nur als Gateway fuer die FW ...

Duffy1905
08.05.03, 13:25
das is so: ich arbeite in nem Forschungszentrum.
Das heißt ca 3500 Mitarbeiter. Wir haben eine
Hauptabteilung für Informations und kommunikationstechnik.
Die kümmern sich um den großen Router und um die Zentrale Firewall.
Meine Firewall ist aber nur für mein Institut!!!

[WCM]Manx
08.05.03, 18:53
Hi!

Am besten ausprobieren und die Logs überwachen.
Denn da fehlt dann immer was, aber Du siehst das dann ja im Logfile, was verworfen wird.
Am besten am Schluss vorest eine Regel, die alles logt, bevor gedropt wird.

Fehlen tut zum Beispiel DNS erlauben (für die Firewall selber und die Clients dahinter) usw.

Grüße

Manx

PS: Du kannst ja an vorhandenen Scipts lernen und versuchen zu verstehen.

harry's Server hat einen Web-Generator
auf www.linuxguruz.org => iptables findest Du eine Menge Scripts
Mir gefällt das Script der Sentry-firewall ganz gut:
http://www.sentry.net/~obsid/IPTables/rc.scripts.dir/current/rc.firewall.iptables.dual

Duffy1905
09.05.03, 13:13
So hab mir eins gebastelt, und ich glaube ich habs endlich ein bißchen kapiert.

#!/bin/sh

################################################## ################## Erstellt von: Sascha Rech
# Datum: April 2003
################################################## #################

#Alle vorhandenen Regelketten werden gelöscht
iptables -F
iptables -t nat -F
iptables -X


INET=eth0
LAN=eth1

tcp_port=“21 22 80 443“
udp_port=“53“


#Laden der Iptables Module
/sbin/depmod -a
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_MASQUERADE

#IP-Forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward

####################################
#Alles erst mal verwerfen
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#Loopback
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT



iptables –N lokal_chain
iptables –N LAN_IN
iptables –N INET_IN
iptables –N LAN_OUT
iptables –N INET_OUT

####################################
# INPUT-CHAIN

iptables –A INPUT –i $LAN –j LAN_IN
iptables –A INPUT –i $INET –j INET_IN





####################################
# FORWARD-CHAIN

#HTTP
iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 80 -d 141.52.X.98 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 80 -d 141.52.X.99 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 80 -d 141.52.X.100 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 80 -d 141.52.X.101 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#HTTPS
iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 443 -d 141.52.X.98 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 443 -d 141.52.X.99 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 443 -d 141.52.X.100 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 443 -d 141.52.X.101 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#FTP
iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 21 -d 141.52.X.98 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 21 -d 141.52.X.99 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 21 -d 141.52.X.100 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 21 -d 141.52.X.101 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#SSH
iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 22 -d 141.52.X.98 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 22 -d 141.52.X.99 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 22 -d 141.52.X.100 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i $INET -o $LAN -p tcp --dport 22 -d 141.52.X.101 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT



####################################
#OUTPUT-CHAIN

iptables -A OUTPUT -o $LAN -j LAN_OUT
iptables -A OUTPUT -o $INET -j INET_OUT


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

####################################
# LAN_IN
iptables -I LAN_IN -i $LAN -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A LAN_IN -i $LAN -j ACCEPT

# LAN_OUT
iptables -I LAN_OUT -o $LAN -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A LAN_OUT -o $LAN -j ACCEPT


####################################
# INET_IN
iptables –A INET_IN –i $INET –p tcp --dport $tcp_port –j ACCEPT

iptables –A INET_IN –i $INET –p icmp –s 0/0 --icmp-type 8 –j ACCEPT
iptables –A INET_IN –i $INET –p icmp –s 0/0 --icmp-type 11 –j ACCEPT


####################################
# INET_OUT
iptables –A INET_OUT –o $INET –p tcp --dport $tcp_port –j ACCEPT
iptables –A INET_OUT –o $INET –p udp --dport $udp_port –j ACCEPT
iptaböes –A INET_OUT –o $INET –j ACCEPT

####################################
# LOGS
$iptables -A INPUT -j LOG --log-prefix FIRE_ -m limit --limit 2 --limit-burst 4
$iptables -A FORWARD -j LOG --log-prefix FIRE_ -m limit --limit 2 --limit-burst 4
$iptables -A OUTPUT -j LOG --log-prefix FIRE_ -m limit --limit 2 --limit-burst 4