iptables redirect

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
BrianFFM
Beiträge: 222
Registriert: 21.04.2004 11:54:33
Wohnort: L.A. in Hessen

iptables redirect

Beitrag von BrianFFM » 03.03.2005 13:28:01

hallo alle,

ich ziehe einen Server um und möcht alle Anfragen die an port 80 und 443 an den alten server kommen mit iptables weiterleiten an den neuen .. darf mir aber keinen fehler erlauben :lol:

kann mir da mal ein iptable profi hilfe geben ??

Gruß, Brian
Debian GNU Linux testing
Toffifee Sattelite 5200/902

Hast du keine Probleme?
Dann kauf dir einen Computer !

.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 03.03.2005 15:00:58

BrianFFM hat geschrieben: .. darf mir aber keinen fehler erlauben :lol:

kann mir da mal ein iptable profi hilfe geben ??
iptable profi bin ich keiner (Ich verdiene mein Geld mit der SW-Entwicklung und kann mir daher Fehler erlauben :) )

Code: Alles auswählen

#!/bin/sh

function forwardport() {
  local LOCALIP=$1
  local LOCALPORT=$2
  local SERVERIP=$3
  local SERVERPORT=$4

  iptables -A PREROUTING -t nat -p tcp -d $LOCALIP --dport $LOCALPORT -j DNAT --to $SERVERIP:$SERVERPORT
  iptables -A POSTROUTING -t nat -p tcp -d $SERVERIP --dport $SERVERPORT -j SNAT --to $LOCALIP

  iptables -A FORWARD -p tcp -d $SERVERIP --dport $SERVERPORT  -j ACCEPT
  iptables -A FORWARD -p tcp -s $SERVERIP --sport $SERVERPORT  -j ACCEPT
}

LOCALIP=<local ip>
SERVERIP=<server ip>

forwardport $LOCALIP 80  $SERVERIP 80
forwardport $LOCALIP 443 $SERVERIP 443

iptables -L PREROUTING -t nat
iptables -L POSTROUTING -t nat
iptables -L FORWARD


BrianFFM
Beiträge: 222
Registriert: 21.04.2004 11:54:33
Wohnort: L.A. in Hessen

Beitrag von BrianFFM » 03.03.2005 15:29:50

danke für das Skript ..

ich dachte jedoch, daß NAT nur funktioniert, wenn eine extrene IP (zb 83.xx.xx.x) und eine Private 192.168.0.1 da ist-


hier sind es jedoch 2 offizielle IP's ..

geht das trotzdem ?

Gruß, Brian

habs versucht

./iptables-test
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere 192.168.0.251 tcp dpt:www to:192.168.0.250:80
DNAT tcp -- anywhere 192.168.0.251 tcp dpt:https to:192.168.0.250:443
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT tcp -- anywhere 192.168.0.250 tcp dpt:www to:192.168.0.251
SNAT tcp -- anywhere 192.168.0.250 tcp dpt:https to:192.168.0.251
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere 192.168.0.250 tcp dpt:www
ACCEPT tcp -- 192.168.0.250 anywhere tcp spt:www
ACCEPT tcp -- anywhere 192.168.0.250 tcp dpt:https
ACCEPT tcp -- 192.168.0.250 anywhere tcp spt:https


funzt nicht .. :-(
Zuletzt geändert von BrianFFM am 03.03.2005 15:45:04, insgesamt 1-mal geändert.
Debian GNU Linux testing
Toffifee Sattelite 5200/902

Hast du keine Probleme?
Dann kauf dir einen Computer !

.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 03.03.2005 15:33:16

ob das Script funktioniert, kann ich nicht sagen, aber wie kommst du darauf das es relevant ist ob es eine private oder öffentliche IP ist?
Das sind doch nur definitionen welche IPs öffentlich sind und welche nicht.. wenn du ein locales LAN ohne internetanbindung hast, dann kannst du alle möglichen IPs aus dem öffentlichen und dem privaten nehmen... (kannst du auch wenn du am Inet dran bist, aber da kann das dann zu lustigen problemen führen)
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

BrianFFM
Beiträge: 222
Registriert: 21.04.2004 11:54:33
Wohnort: L.A. in Hessen

Beitrag von BrianFFM » 03.03.2005 18:02:59

bei NAT wird von einer IP auf eine andere übersetzt. ich möchte ja nicht übersetzen sondern weiterleiten. Eine übersetzung ist meines wissens nur nötig, wenn zwichen source und destination keine verbindung besteht oder bestehen kann.

kann mich natürlich teuschen .. so fit bin ich nicht damit .. deswegen lasse ich mich gerne eines besseren beleehren.

Gruß, Brian
Debian GNU Linux testing
Toffifee Sattelite 5200/902

Hast du keine Probleme?
Dann kauf dir einen Computer !

.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 03.03.2005 18:12:29

das POSTROUTING SNAT ist optional, aber ist bei dir forwarding überhaupt eingeschaltet ?

Code: Alles auswählen

cat /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward
[edit]
Anmerkung:
POSTROUTING SNAT wird nur benötigt, wenn der client mit dem server nicht direkt Verbindung aufnehmen kann
[/edit]

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 04.03.2005 08:58:45

hmm.. hab ich das jetzt falsch verstanden?

ich dachte, du hättest einen Server umgezogen (aber nicht die IP oder den DNS Namen) und wolltest jetzt alle Anfragen an die alte IP / DNS Namen automatisch an die neue IP / DNS Namen weiterleiten?

Dann musst du das per NAT machen... oder wie stellst du dir das vo?
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

BrianFFM
Beiträge: 222
Registriert: 21.04.2004 11:54:33
Wohnort: L.A. in Hessen

Beitrag von BrianFFM » 05.03.2005 21:00:19

GMS ist auf dem richtigen Weg ... einen Server umziehen meine ich die Services von Server "A" mit der IP a.a.a.a. auf Server B mit der IP b.b.b.b ..

Der umzug steht an .. noch nicht vollzogen .. aber ich bin auf dem richtigen Weg .. Dank euerer Hilfe ..

Schreibe was dazu wenns wirklich funzt ,,


Gruß, Brian
Debian GNU Linux testing
Toffifee Sattelite 5200/902

Hast du keine Probleme?
Dann kauf dir einen Computer !

.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 05.03.2005 21:27:56

beim script von gms ersetz die Zeile

Code: Alles auswählen

iptables -A PREROUTING -t nat -p tcp -d $LOCALIP --dport $LOCALPORT -j DNAT --to $SERVERIP:$SERVERPORT
einmal durch

Code: Alles auswählen

iptables -t nat -A PREROUTING -p tcp -d $LOCALIP --dport $LOCALPORT -j DNAT --to-destination $SERVERIP:$SERVERPORT
bei der SNAT Zeile nach selben Schema ändern versuchen ...
e.g. so

Code: Alles auswählen

iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \
--to-source $LAN_IP


und noch was - nur zur Vorsicht - wenn eine Zeile in dem Script über zwei Zeilen geht dann das Zeilenende der ersten mit \ abschließen - nach so Zeug sucht man oft gar nicht weil es so "einfach" ist ...

gehts so?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 05.03.2005 22:44:57

bezüglich "--to" und "--to-source/--to-destination":

Schaut man in die offizielle iptables Dokumentation (file:///usr/share/doc/iptables/html/NAT-HOWTO-6.html), so steht dort:
file:///usr/share/doc/iptables/html/NAT-HOWTO-6.html hat geschrieben: Source NAT is specified using `-j SNAT', and the `--to-source' option specifies an IP address, a range of IP addresses, and an optional port or range of ports (for UDP and TCP protocols only).

Destination NAT is specified using `-j DNAT', and the `--to-destination' option specifies an IP address, a range of IP addresses, and an optional port or range of ports (for UDP and TCP protocols only).
Die zugehörigen Beispiele verwenden allerdings alle die Kurzform:
file:///usr/share/doc/iptables/html/NAT-HOWTO-6.html hat geschrieben: ## Change destination addresses to 5.6.7.8
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8
## Change source addresses to 1.2.3.4.
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
Die Kurzform hat bei mir immer funktioniert, die andere habe ich nie ausprobiert.

Ich habe natürlich nichts gegen die Änderungsvorschläge von "meandtheshell", sondern wollte nur klarstellen, daß sich daraus "eigentlich" keine Änderungen ergeben dürften.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 05.03.2005 23:26:34

@ gms
grüss dich - ja ist so - ich habe immer die lange Variante verwendet ... mir gefällt es besser - vielleicht übersichtlicher - gehen tut beides so wie es aussieht

wo ich mir nicht sicher bin - geht das die chain vor der table anzugeben?
ich habe es noch nie versucht ... vielleicht gehts ja ?
rein intuitiv würde ich sagen - zuerst die table und dann die chain (so gehts sicher) ... aber ich kann mich irren :wink:

Ergänzung:
ok scheint doch zulässig zu sein chain vor der table
siehe letzte zeile
http://www.netfilter.org/documentation/ ... WTO-4.html

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 06.03.2005 00:14:24

Ich habe mich einfach an diese Reihenfolge gewöhnt.
Die chain muß bei fast allen iptables Statements angegeben werden, die table nicht. Daher habe ich durch diese Reihenfolge alle chain-Namen direkt untereinander.
Weiters verwende ich sprechende Namen für die chains und kann daher von der chain auch auf die table schließen.

Benutzeravatar
DynaBlaster
Beiträge: 958
Registriert: 25.03.2004 18:18:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DF0://dynablaster.adf

Beitrag von DynaBlaster » 06.03.2005 09:51:29

bei NAT wird von einer IP auf eine andere übersetzt. ich möchte ja nicht übersetzen sondern weiterleiten. Eine übersetzung ist meines wissens nur nötig, wenn zwichen source und destination keine verbindung besteht oder bestehen kann.
Zurück zum Thema. Aber genau das wolltest du doch. Wenn Client C bei deinem Server A den Dienst www (Port 80) nutzen will, muss auch Server A antworten. Wenn aber Server B den Dienst bereitstellt, dann musst du die Pakete zwangsläufig "natten". Für Client C sieht es in dem Fall so aus, als ob Server A antwortet, auch wenn es "eigentlich B ist.
Wenn du die Weiterleitung transparent haben willst, also Client C mitbekommen soll, daß nicht Server A, sondern Server B den Dienst www bereitsstellt, geht das imho nicht mit iptables. Du wirst wohl auf dem Webserver auf Server A so etwas wie ein Redirect konfigurieren müssen, die dem Browser auf Client C mitteilt, daß die angeforderten Webseiten nicht mehr auf Server A, sondern auf Server B liegen.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 06.03.2005 13:50:13

DynaBlaster hat geschrieben: Wenn du die Weiterleitung transparent haben willst, also Client C mitbekommen soll, daß nicht Server A, sondern Server B den Dienst www bereitsstellt, geht das imho nicht mit iptables.
genau das gegenteil davon ist transparenz - und ja natürlich geht das mit iptables (=NAT)

generally - transparency in computer science and related topics
http://en.wikipedia.org/wiki/Transparen ... mputing%29
DynaBlaster hat geschrieben: Du wirst wohl auf dem Webserver auf Server A so etwas wie ein Redirect konfigurieren müssen, die dem Browser auf Client C mitteilt, daß die angeforderten Webseiten nicht mehr auf Server A, sondern auf Server B liegen.
mit sowas wie redirect meinst du auf einem DNS Server die IP Adresse relativ zum Domainnamen zu ändern oder was?

wenn BrianFFM den Sever in der selben Domaine umzieht - im LAN zuhause oder so - und zwischen Inet. und Lan einen Router hat auf dem er NAT macht ist das was gms vorgeschlagen hat absolut gut so - wenn er den Server von einer Domain in die nächste umzieht dann muss er auch noch auf einem DNS Server was ändern - was genau er macht hat er ja nicht gesagt ...

lg aus wien :wink:

Benutzeravatar
DynaBlaster
Beiträge: 958
Registriert: 25.03.2004 18:18:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DF0://dynablaster.adf

Beitrag von DynaBlaster » 06.03.2005 17:34:07

meandtheshell hat geschrieben: genau das gegenteil davon ist transparenz - und ja natürlich geht das mit iptables (=NAT)

generally - transparency in computer science and related topics
http://en.wikipedia.org/wiki/Transparen ... mputing%29
Hm, wieder was dazu gelernt. Aber zu meiner Verteidigung sei angemerkt: ich bin Politikstudent - und da ist Transparenz etwas anderes :) - Ausserdem wusstest du was gemeint war
meandtheshell hat geschrieben: mit sowas wie redirect meinst du auf einem DNS Server die IP Adresse relativ zum Domainnamen zu ändern oder was?


Genau - so wie ich BrianFFM's Posting verstanden habe, hat er jetzt einen 2. Rechner mit einer öffentlichen IP-Adresse - beide sind demnach über ihre öffentliche IP vom Internet heraus erreichbar. Allerdings ist die IP des ersten Rechners im DNS als Domain xyz eingetragen. Der Webserver soll aber anscheinend auf dem (neuen?) 2. Rechner laufen. Deshalb sollen die entsprechenden Ports ja von Rechner 1 auf Rechner 2 geforwardet werden.
Was ich eigentlich zu sagen versuchte, war, daß er den Webserver auf Server 1 dazu bringen kann, alle Anfragen auf eine andere Domain umzuleiten. Diese Domain ist bei meinem Szenario selbstverständlich der IP-Adresse des zweiten Rechners zugeordnet.

Ich hoffe, das ist jetzt irgendwie klarer geworden.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 06.03.2005 18:07:02

Genau - so wie ich BrianFFM's Posting verstanden habe, hat er jetzt einen 2. Rechner mit einer öffentlichen IP-Adresse
vielleicht - hat er nicht exakt gesagt - was verstehtst du unter öffentlicher IP adresse? - IP adresse ist IP adresse - unter IPv4 gibt es ein paar adressen die für bestimmte Zwecke gedacht sind
  • IP Adresse 127.0.0.0 Netmask 255.0.0.0 für Pakete die den Rechner nicht verlassen
  • die folgenden werden nicht geroutet - deshalb verw. man sie meist privat
  • 10.0.0.0 bis 10.255.255.255
  • 172.16.0.0 bis 172.31.255.255
  • 192.168.0.0 bis 192.168.255.255
beide sind demnach über ihre öffentliche IP vom Internet heraus erreichbar. Allerdings ist die IP des ersten Rechners im DNS als Domain xyz eingetragen. Der Webserver soll aber anscheinend auf dem (neuen?) 2. Rechner laufen. Deshalb sollen die entsprechenden Ports ja von Rechner 1 auf Rechner 2 geforwardet werden.
Tipp: mache dir nocheinmal den Unterschied zwischen port forwarding und NAT klar - das ist NICHT äquivalent - wenn du von forwarding sprichst dann kling das eher danach als das jem. ein port von einer firewall zu einem dahinter liegenden rechner forwarden möchte - das hat er sicher nicht vor - egal ob er einen DNS Eintrag auf einem DNS Server ändert oder was mit NAT macht - (gut vielleicht wenn er dann den server schon umgezogen hat; aber momentan geht es hier nicht darum)
Was ich eigentlich zu sagen versuchte, war, daß er den Webserver auf Server 1 dazu bringen kann, alle Anfragen auf eine andere Domain umzuleiten.
8O - ein webserver macht das nicht - er möchte den Webserver umziehen und dann die Anfragen an die "neue" IP des Servers umleiten auch wenn im destination field des IP packet headers noch die IP des alten Servers drinnen steht (=alte IP adresse unter der der Server vorm Umzug zu erreichen war)
Diese Domain ist bei meinem Szenario selbstverständlich der IP-Adresse des zweiten Rechners zugeordnet.
eine IP Adresse ist einer Domain zugeordnet - Mengenlehre
Ich hoffe, das ist jetzt irgendwie klarer geworden.
:wink:

Antworten