[Iptables] Zoveelste probleem met DNAT

Pagina: 1
Acties:

  • B2
  • Registratie: April 2000
  • Laatst online: 20-02 10:26

B2

wa' seggie?

Topicstarter
Ik heb een router annex webserver draaien op OpenNA Linux. Daarbij wordt gebruik gemaakt van Giptables. Dit is een soort script om je Iptables firewall makkelijker te configureren.
Bij Giptables kun je in een custom file je eigen iptables regels zetten. Ik wil op school bij mijn windows client kunnen via Remote Desktop, ik wil dus deze poort forwarden naar mn interne netwerk.

Nu heb ik natuurlijk al de tientallen topics gelezen hier op GoT, Google er op na geslagen en diverse regels geprobeerd maar het werkt nog niet.

Ik gebruik nu deze regels

code:
1
2
$IPTABLES -A FORWARD --in-interface eth0 --out-interface eth1 -p tcp -d 12.34.56.21 --destination-port 3389 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22:3389


eth0 is mn externe nic
eth1 intern
12.34.56.21 mn externe IP
192.168.0.22 het interne IP van de windows client.

Wat kan hier nog fout aan zijn?

  • smoking2000
  • Registratie: September 2001
  • Laatst online: 07:04

smoking2000

DPC-Crew

dpkg-reconfigure reality

Heb je je inkomende en uitgaande tcp packets al toegestaan ?
code:
1
2
3
4
5
6
7
8
9
10
11
# Accept incoming connection
$IPTABLES -A INPUT -i eth0 -p tcp -d 12.34.56.21 --dport 3389 -j ACCEPT

# Do DNAT on the PREROUTING chain of the nat table
$IPTABLES -A FORWARD -i eth0 -o eth1 -p tcp -d 12.34.56.21 --dport 3389 -j ACCEPT

# Allow the Forwarding of the DNAT'ted connection
$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22:3389

# Allow the Forwarded connection outwards
$IPTABLES -A OUTPUT -o eth1 -p tcp -d 192.168.0.2 --dport 3389 -j ACCEPT


Tevens zou je als extra test op de connecties de state module kunnen gebruiken om de staat van de connectie te checken, dus alleen nieuwe & bestaande connecties toestaan

[ Voor 16% gewijzigd door smoking2000 op 03-03-2004 10:02 ]

| [Folding@Home] Announce: Client monitor voor Linux (fci) | fci-1.8.4 | Fatal Error Group |


Verwijderd

supergrover schreef op 03 maart 2004 @ 09:22:
Ik gebruik nu deze regels

code:
1
2
$IPTABLES -A FORWARD --in-interface eth0 --out-interface eth1 -p tcp -d 12.34.56.21 --destination-port 3389 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22:3389


eth0 is mn externe nic
eth1 intern
12.34.56.21 mn externe IP
192.168.0.22 het interne IP van de windows client.

Wat kan hier nog fout aan zijn?
Die eerste regel heb je niet nodig.
de 2de regel moet zien:
code:
1
iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22:3389


-d moet je niet gebruiker, eventueel zou je -s kunnen gebruiken (zodat de port alleen maar geforward wordt, als die binnen komt via het jouw op gegeven ip:)
code:
1
iptables -t nat -A PREROUTING -s a.b.c.d -p tcp --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22:3389

a.b.c.d is bijvoorbeeld het ip(range) van je school.

Verder is die .22 host (of het hele subnet) natuurlijk door jouw gemasquerade ?
Ook ip_forward moet natuurlijk aan staan ;)

Suc6

Verwijderd

smoking2000 schreef op 03 maart 2004 @ 10:00:
Heb je je inkomende en uitgaande tcp packets al toegestaan ?
code:
1
2
# Accept incoming connection
$IPTABLES -A INPUT -i eth0 -p tcp -d 12.34.56.21 --dport 3389 -j ACCEPT
niet nodig, als je een iets forward in de PREROUTING, staat ie standaard op accept. PREROUTING komt voor de INPUT!!!


code:
1
2
# Do DNAT on the PREROUTING chain of the nat table
$IPTABLES -A FORWARD -i eth0 -o eth1 -p tcp -d 12.34.56.21 --dport 3389 -j ACCEPT
Alleen nodig als policy op FORWARD DROP is.

code:
1
2
# Allow the Forwarding of the DNAT'ted connection
$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22:3389
nu forward ie alleen als destination host 12.34.56.12 is!!!! werkt niet!

code:
1
2
# Allow the Forwarded connection outwards
$IPTABLES -A OUTPUT -o eth1 -p tcp -d 192.168.0.2 --dport 3389 -j ACCEPT
niet nodig
Misschien verstandig dat je je iptables manuals en howotos weer eens doorleest.

[ Voor 15% gewijzigd door Verwijderd op 03-03-2004 10:12 ]


  • B2
  • Registratie: April 2000
  • Laatst online: 20-02 10:26

B2

wa' seggie?

Topicstarter
Hmz, zowel de regels van Adminhenk als smoking2000 werken niet. Was eigenlijk zelf ook al zover gekomen via Google e.d.

Raar dat het niet werkt, want het moet zo wel werken, ook volgens de Iptables handleiding.

edit:

Heb even met Iptables -L gekeken welke regels er geladen zijn, maar de PREROUTING regel komt niet voor in de list. Hoort dat zo?
De eventuele Accept en Forward regels staan er wel in

[ Voor 33% gewijzigd door B2 op 03-03-2004 12:07 ]


  • smoking2000
  • Registratie: September 2001
  • Laatst online: 07:04

smoking2000

DPC-Crew

dpkg-reconfigure reality

Verwijderd schreef op 03 maart 2004 @ 10:06:
[...]


Misschien verstandig dat je je iptables manuals en howotos weer eens doorleest.
Been there, moet eerlijk toegeven dat ik 'm pas net uit heb, en mn iptables scripts zelf nog moet schrijven, maar zo werkt m'n port forwarding wel. Misschien niet zoals het hoort, maar werkt wel. Trial & error, n'est pas? :>

| [Folding@Home] Announce: Client monitor voor Linux (fci) | fci-1.8.4 | Fatal Error Group |


  • smoking2000
  • Registratie: September 2001
  • Laatst online: 07:04

smoking2000

DPC-Crew

dpkg-reconfigure reality

supergrover schreef op 03 maart 2004 @ 12:01:
Hmz, zowel de regels van Adminhenk als smoking2000 werken niet. Was eigenlijk zelf ook al zover gekomen via Google e.d.

Raar dat het niet werkt, want het moet zo wel werken, ook volgens de Iptables handleiding.

edit:

Heb even met Iptables -L gekeken welke regels er geladen zijn, maar de PREROUTING regel komt niet voor in de list. Hoort dat zo?
De eventuele Accept en Forward regels staan er wel in
iptables -t nat -L :)

iptables -L laat alleen de rules van de filter (default) table zien

| [Folding@Home] Announce: Client monitor voor Linux (fci) | fci-1.8.4 | Fatal Error Group |


  • B2
  • Registratie: April 2000
  • Laatst online: 20-02 10:26

B2

wa' seggie?

Topicstarter
Ah ok thx :)

Anyway de output daarvan is :

code:
1
2
3
4
5
6
7
8
9
10
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere            tcp dpt:3389 to:192.168.0.22:3389

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  192.168.0.0/24       anywhere            to:212.187.19.153

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Verwijderd

supergrover:

doe eens:

iptables-save
en paste de output.

wat zegt
cat /proc/sys/net/ipv4/ip_forward
?

Verwijderd

@TS
je masqueradet je interne netwerk niet:

code:
1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


Dit is trouwens mijn script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F INPUT
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -P INPUT DROP
#
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3389 -j DNAT --to-destination 10.10.10.2:3389
#
iptables -A INPUT -i eth0 -m state --state INVALID -j DROP
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 113 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
#

  • B2
  • Registratie: April 2000
  • Laatst online: 20-02 10:26

B2

wa' seggie?

Topicstarter
Verwijderd schreef op 03 maart 2004 @ 12:19:
@TS
je masqueradet je interne netwerk niet:

code:
1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


Dit is trouwens mijn script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F INPUT
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -P INPUT DROP
#
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3389 -j DNAT --to-destination 10.10.10.2:3389
#
iptables -A INPUT -i eth0 -m state --state INVALID -j DROP
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 113 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
#
Natuurlijk heb ik wel meer regels, maar die worden allemaal aangemaakt door Giptables. Ook ip_forward staat natuurlijk op 1.
Wil je echt dat die hele lijst post :)

Verwijderd

Nou jah, als het veel is laat maar zittten.

Mijn advies, gooi dat giptables weg.
Of neem er van over wat je handig lijkt, en bouw je eigen script.

Ik denk dat er hier al genoeg oplossingen aangedragen zijn.
Als je er nog steeds niet uitkomt, is het misschien handig om wat iptables tutorials door te lezen.

Succes.

Verwijderd

Kan je het volgende eens proberen in je script?

code:
1
2
3
4
5
6
7
8
9
10
$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22

$IPTABLES -N TS
$IPTABLES -A TS -m state --state NEW -i eth0 -o eth1 -j ACCEPT
$IPTABLES -A TS -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A TS -j LOG --log-prefix internetin --log-level 6
$IPTABLES -A TS -j DROP

$IPTABLES -A FORWARD --in-interface eth0 --out-interface eth1 -p tcp -d 12.34.56.21 --dport 3389 -j TS
$IPTABLES -A FORWARD --in-interface eth1 --out-interface eth0 -p tcp -s 12.34.56.21 --sport 3389 -j TS


# het script hier boven doet eigen niks anders dan:
# iets komt binnen op jou IP met dport 3389, jou firewall forward dit naar 192.168.0.22
# je creeërt een tabel
# je laat het verkeer dat binnen komt door die tabel heen lopen, inkomend op eth0 en uitgaand op eth1 = state NEW ... dus accept. (zie 2e regel in tabel)
# omdat het tcp/ip verkeer is moet je ook antwoorden. dus die 2e is het antwoord, je TS server antwoord altijd uit de poort waarbij de connectie is gemaakt, dus je weet zeker dat 3389 het antwoord stuurt.
# die laat je ook door de tabel gaan, en die neemt optie 3, (de connectie is namelijk al established geweest, en dit is het antwoord.. dus ACCEPT hij die ook.


Het is even een kleine ombouwing van me eigen script, wat ik hier zelf gebruik voor meerdere servers te benaderen van extern, daar ga ik vanuit dat alle IP poorten op een bepaalde IP Adres wordt geforward naar een machine en dan accept ik alleen de poorten die ik wil toestaan, de rest kan ik dan zelf makkelijker apart door een log gooien.

Succes iig.

[ Voor 2% gewijzigd door Verwijderd op 03-03-2004 15:11 . Reden: Fixxed typo ]


Verwijderd

Verwijderd schreef op 03 maart 2004 @ 12:50:
Kan je het volgende eens proberen in je script?

$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 -j DNAT --to-destination 192.168.0.22
Wat probeer je met die -d te bereiken dan ?

Verwijderd

Die "-d 12.34.56.21" is het ip adres waar het op binnen komt, stel nou dat je 4 externe IP adressen hebt, dan geef je nu aan dat op 1 van de 4 IP adressen het geldt, geef je geen "-d 12.34.56.21" op dan zal het op alle 4 adressen door gerouteerd worden.
Dan is alles wat binnen komt op eth0 met dport 3389 worden doorgesluist naar 192.168.0.22

Die "-d 12.34.56.21" is dus geen must, maar in sommige gevallen altijd handig te vermelden. Zelf maak ik van het IP adres altijd een variable die ik aanspreek ingeval van wijziging van IP adres

dus iets van
homeIP="12.34.56.21"

"-d ${homeIP}"

Verwijderd

Verwijderd schreef op 03 maart 2004 @ 13:23:
Die "-d 12.34.56.21" is het ip adres waar het op binnen komt, stel nou dat je 4 externe IP adressen hebt, dan geef je nu aan dat op 1 van de 4 IP adressen het geldt, geef je geen "-d 12.34.56.21" op dan zal het op alle 4 adressen door gerouteerd worden.
maar je gebruikt al -i eth0 dus -d heeft geen zin.

Verwijderd

Verwijderd schreef op 03 maart 2004 @ 13:25:
[...]

maar je gebruikt al -i eth0 dus -d heeft geen zin.
Je kan toch 4 externe IP Adressen op 1 nic interface hebben. Die komen allemaal binnen op eth0 ... en niet alle IP adressen die je binnen krijgt op eth0 wil je doorrouten naar 192.168.0.22

Ik ben met je eens, dat in geval van 1 IP adres het niet nodig is, maar ik weet niet hoe het in zijn geval is. Misschien heeft hij wel een volledige C-klasse beschikbaar. (doubt it for thuis gebruik (las even terug))


Maar die -d heeft dus wel degelijk zin in sommige gevallen.

Verwijderd

Verwijderd schreef op 03 maart 2004 @ 13:31:
[...]
Je kan toch 4 externe IP Adressen op 1 nic interface hebben. Die komen allemaal binnen op eth0 ... en niet alle IP adressen die je binnen krijgt op eth0 wil je doorrouten naar 192.168.0.22
Dat klopt, maar dan is je interface eth0:0 eth0:1 ect ;)

Verwijderd

Je weet zeker dat je school uitgaand verkeer op poort 3389 wel toestaat? Anders kan je thuis heel lang bezig blijven.

Verwijderd

Ik heb het nog nooit zo getest.

Net even getest, en ik krijg de volgende foutmelding, en volgens mij mag je dus geen alias-en gebruiken van je NIC interface in iptables

"Warning: weird character in interface `eth0:9' (No aliases, :, ! or *)."

Zoals ik het zie, gaat het als volgt:

De netwerkkaart = eth0
een alias eth0:1 = eth0 (het is niks anders dan een alias, maar blijft uiteindelijk dezelfde netwerkkaart)

Dus als verkeer binnen komt, komt het binnen op eth0 en niet op eth0:1

Hierdoor is de "-d" optie dus wel logisch om daar te gebruiken.

Maar goed, het maakt opzich toch niet veel uit, of hij hem nu wel of niet gebruikt in beide gevallen zou het moeten werken, dus zullen we het dan maar ontopic houden :)

  • Gondor
  • Registratie: September 2003
  • Laatst online: 21-02 13:04
Ehm, die "-d" staat voor "destination ip" dus waar het heen gaat en dat heeft niks te maken met van welk interface het binnen komt.

Als je dus die -d weg laat wordt alles wat via eth0 binnen voor poort 3389 komt geDNAT en dat wil je niet.

Volgens mij moet deze het doen:
code:
1
2
3
4
$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 \
-j DNAT --to-destination 192.168.0.22:3389
$IPTABLES -A FORWARD --in-interface eth0 --out-interface eth1 -p tcp \
-d 192.168.0.22 --destination-port 3389 -j ACCEPT
Met regel 1, forward je de pakketen voor poort 3389 naar 192.168.0.22:3389.
Met regel 2 laat je die pakketen door naar je interne netwerk.

Nu moet je ook regels hebben om de antwoorden vanuit je netwerk toe te laten naar buiten. Dit is dan afhankelijk van de " Remote Desktop" protocol als die er is.

Als alles alleen via poort 3389 gebeurd kan je het met deze regel oplossen:
code:
1
2
$IPTABLES -A FORWARD --in-interface eth1 --out-interface eth0 -p tcp\
--source-port 3389 -j ACCEPT


En natuurlijk moet je ook SNAT hebben bij POSTROUTING.

"Peace cannot be kept by force. It can only be achieved by understanding"-Albert Einstein-


Verwijderd

smoking2000 schreef op 03 maart 2004 @ 12:08:
[...]


Been there, moet eerlijk toegeven dat ik 'm pas net uit heb, en mn iptables scripts zelf nog moet schrijven, maar zo werkt m'n port forwarding wel. Misschien niet zoals het hoort, maar werkt wel. Trial & error, n'est pas? :>
Mwah toch zou ik je ook aanraden om die manuals nog eens door te nemen.

Wat doen IN-/OUTPUT regels in hemelsnaam in een config waarbij het verkeer de NAT machine moet passeren :?
Waar is de return forward regel :?

Trial & Error bij een firewall lijkt me nou niet echt de beste aanpak :o

  • B2
  • Registratie: April 2000
  • Laatst online: 20-02 10:26

B2

wa' seggie?

Topicstarter
Gondor schreef op 03 maart 2004 @ 14:03:
Ehm, die "-d" staat voor "destination ip" dus waar het heen gaat en dat heeft niks te maken met van welk interface het binnen komt.

Als je dus die -d weg laat wordt alles wat via eth0 binnen voor poort 3389 komt geDNAT en dat wil je niet.

Volgens mij moet deze het doen:
code:
1
2
3
4
$IPTABLES -t nat -A PREROUTING -p tcp -d 12.34.56.21 --dport 3389 -i eth0 \
-j DNAT --to-destination 192.168.0.22:3389
$IPTABLES -A FORWARD --in-interface eth0 --out-interface eth1 -p tcp \
-d 192.168.0.22 --destination-port 3389 -j ACCEPT
Met regel 1, forward je de pakketen voor poort 3389 naar 192.168.0.22:3389.
Met regel 2 laat je die pakketen door naar je interne netwerk.

Nu moet je ook regels hebben om de antwoorden vanuit je netwerk toe te laten naar buiten. Dit is dan afhankelijk van de " Remote Desktop" protocol als die er is.

Als alles alleen via poort 3389 gebeurd kan je het met deze regel oplossen:
code:
1
2
$IPTABLES -A FORWARD --in-interface eth1 --out-interface eth0 -p tcp\
--source-port 3389 -j ACCEPT


En natuurlijk moet je ook SNAT hebben bij POSTROUTING.
Thx man het werkt!

  • smoking2000
  • Registratie: September 2001
  • Laatst online: 07:04

smoking2000

DPC-Crew

dpkg-reconfigure reality

Verwijderd schreef op 03 maart 2004 @ 14:16:
[...]
Mwah toch zou ik je ook aanraden om die manuals nog eens door te nemen.
Met boek op schoot script bouwen :)
Wat doen IN-/OUTPUT regels in hemelsnaam in een config waarbij het verkeer de NAT machine moet passeren :?
Logische redenatie, wat erdoor moet, moet er eerst in, en uiteindelijk uit. Helaas bleek deze redenatie niet van toepassing. *mental note: minder snel blaten, eerst facts checken*
Waar is de return forward regel :?
Vergeten te copy-pasten uit script :z *another mental note ;) *
Trial & Error bij een firewall lijkt me nou niet echt de beste aanpak :o
Heel erg true... Gelukkig heb ik een voorgekouwde versie draaien waar ik nog een zelfgeschreven voor moet bouwen

* smoking2000 realiseerd zich dat dit topic hem meer ge[holpen|leerd] heeft dan ik de TS

| [Folding@Home] Announce: Client monitor voor Linux (fci) | fci-1.8.4 | Fatal Error Group |

Pagina: 1