iptables NAT - bin ich zu doof? O.o

Thomas-H

New Member
Tach auch, :)

Ich hab ein Problem mit einer Regel von iptables. Ich hab mich schon einige Zeit mir Iptables beschäftigt, der Knoten ist aber noch nicht wirklich geplatzt.

Problemstellung:
Ein Desktop-PC, welcher als Router fungiert soll gegen einen anständigen Server ausgetauscht werden. Dieser hat unter anderem einen iRMC Web Server integriert, der über eine eigene interne IP-Adresse (192.168.0.250) erreichbar sein wird.
Ich möchte den iRMC aber auch vom Internet aus erreichen können, um Probleme mit dem Server, wenn sie denn auftreten (oder auftreten könnten) weitestgehend von aussen zu beheben.

Im aktuellen Router (interne Adresse 192.168.0.10) ist Squid installiert und iptables als Firewall aktiviert. Die Konfiguration folgt hier:

Code:
#!/bin/bash
# Install ipt_p2p to avoid P2P-Connections
insmod /home/wichtige_Software/ipp2p-0.8.2/ipt_ipp2p.ko
modprobe iptable_nat

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/tcp_ecn
echo "configuring transparent proxy $SQUIDSERVER..."
echo "Delete all tables and rules"
echo "echo iptables -F"
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain

echo "iptables -P FORWARD DROP"
iptables -P FORWARD DROP

# Ethernet-Interfaces
# EXT an eth1, interne Adresse 192.168.1.1 (DSL-Zugang)
EXT=dsl0
#
# intern   192.168.0.10
INT=eth1

# Definition des internen Netzes
INTERN=192.168.0.0/16

# Proxserver-Port
SQUIDSERVER=192.168.0.10:3128

# Ports
P_HIGH=1024:65535 #User-Ports

# Transparentes HTTP-Proxying einschalten
# SSH erlauben
echo "iptables -I INPUT -i $EXT -p tcp -m tcp --dport 22 --syn -j ACCEPT"
iptables -I INPUT -i $EXT -p tcp -m tcp --dport 22 --syn -j ACCEPT
iptables -I INPUT -i $EXT -p tcp --sport $P_HIGH --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -I OUTPUT -o $EXT -p tcp --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -I INPUT -i $EXT -p tcp -m tcp --dport 8080 --syn -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $EXT -d $INT --dport 8080 -j DNAT --to 192.168.1.250:8080


echo "iptables -A FORWARD -i $INT -o $EXT -j ACCEPT"
iptables -A FORWARD -i $INT -o $EXT -j ACCEPT
echo "iptables -A FORWARD -i $EXT -o $INT -m state --state ESTABLISHED,RELATED -j ACCEPT"
iptables -A FORWARD -i $EXT -o $INT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "iptables -t nat -A PREROUTING -i $INT -p tcp -s --sport $P_HIGH -d 80 -j DNAT --destination $SQUIDSERVER"
iptables -t nat -A PREROUTING -i $INT -p tcp --sport $P_HIGH --dport 80 -j DNAT --to-destination $SQUIDSERVER
echo "iptables -A PREROUTING -t mangle -p tcp -m ipp2p --edk --kazaa --gnu --bit --apple --dc --soul -j DROP"
iptables -A PREROUTING -t mangle -p tcp -m ipp2p --edk --kazaa --gnu --bit --apple --dc --soul -j DROP
echo "iptables -A FORWARD -m ipp2p --bit -j DROP"
iptables -A FORWARD -m ipp2p --bit -j DROP
#iptables -A FORWARD -m ipp2p --ipp2p -p tcp -j DROP
#

echo "iptables -t nat -A PREROUTING -i $INT -p tcp --dport 80 -j REDIRECT --to-port 3128"
iptables -t nat -A PREROUTING -i $INT -p tcp --source 80 -j REDIRECT --to-port 3128
echo "iptables -t nat -A POSTROUTING -o dsl0 -j MASQUERADE"
iptables -t nat -A POSTROUTING -o $EXT -j MASQUERADE

iptables -L gibt aus:

Code:
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http-alt flags:FIN,SYN,RST,ACK/SYN
ACCEPT     tcp  --  anywhere             anywhere            tcp spts:1024:65535 dpt:ssh state NEW,RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     0    --  anywhere             anywhere
ACCEPT     0    --  anywhere             anywhere            state RELATED,ESTABLISHED
DROP       0    --  anywhere             anywhere            ipp2p v0.8.2 --bit

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:ssh dpts:1024:65535 state RELATED,ESTABLISHED

...und natürlich erreiche ich auch den iRMC Web von aussen nicht.

Was mache ich bloss falsch? Was hab ich hier offensichtlich nicht verstanden?

:confused:

Dank an alle, die hilfreiche Tipps geben können.

Thomas
 
Hat keiner eine Idee?

...oder will mir keiner meine Dußlichkeit bescheinigen... :D

Ich hab inzwischen weitergegoogelt und -zig Seiten gelesen und diverses ausprobiert, komme aber immernoch nicht auf die gewünschte Lösung.

Wäre klasse, wenn irgendwer meinen Knoten im Hirn lösen könnte...

Dankööö

Thomas
 
Code:
iptables -I INPUT -i $EXT -p tcp -m tcp --dport 8080 --syn -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $EXT -d $INT --dport 8080 -j DNAT --to 192.168.1.250:8080

Ganz blöde Frage: Muss es beim NATting per iptables nicht
Code:
--to-destination ...
(statt wie bei Dir nur "--to") heißen?
Sagt jedenfalls die Manpage von iptables und etwas Ähnliches funktioniert bei mir unter Debian.

LG siradlib
 
Ganz blöde Frage: Muss es beim NATting per iptables nicht
Code:
--to-destination ...
(statt wie bei Dir nur "--to") heißen?
Sagt jedenfalls die Manpage von iptables und etwas Ähnliches funktioniert bei mir unter Debian.

Hmmm,... werd ich einfach mal ausprobieren. Vielleicht klappt's ja. Ich berichte dann

Gruß Thomas
 
Ganz blöde Frage: Muss es beim NATting per iptables nicht
Code:
--to-destination ...
(statt wie bei Dir nur "--to") heißen?
Sagt jedenfalls die Manpage von iptables und etwas Ähnliches funktioniert bei mir unter Debian.

Hab ich nun auch ausprobiert, erbrachte ebenfalls kein positives Ergebnis.
Ist denn die Öffnung des Ports von mir richtig deklariert worden?

Es handelt sich um eine Verbindung die von aussen kommt und nach innen initiiert wird. Die Antwort geht dann von innen nach aussen.

Folglich:
Erlaube Verbindungen auf Port 8080 von aussen nach innen
Erlaube Antworten auf Port 8080 von innen nach aussen
Leite Anfragen auf Port 8080 weiter nach IP 192.168.0.250:80

Vielleicht hab ich da irgendwas falsch gemacht... Ansonsten werde ich mal einen anderen Webserver aufsetzen der einfach nur eine Seite als Antwort aus dem internen Netz schickt. Vielleicht lässt das Remote Management des Servers mein Vorhaben garnicht zu...

Gruß

Thomas_H
 
Wenn ich das richtig sehe, akzeptierst Du die Verbindung auf Port 8080 und tütest die in's ACCEPT-Target. Punkt. Das Paket ist angenommen und akzeptiert. Die weiteren Regeln für den Port werden somit nicht mehr durchlaufen.
 
gelöst: Richtiges Forwarding zu DIESEM Problem...

Hallo Leute,

ich hatte es schon aufgegeben, dachte, meine gesamte Konfiguration ist falsch oder ich zu blöde (jemand sagte mir mal, dass man erst *dann* ein echter Linux-Guru werden kann, wenn man an sendmail und an iptables mehrfach verzweifelt ist... :) )

Ich fand die Lösung unterhttp://www.linuxwiki.de/PaketFilter/MasqueradeSshProxy die ich hier gleich noch anhängen werde, damit eben diese Lösung nicht verlorengeht (Regel: Wenn Du eine Datensicherung haben willst, spiegel Deine Daten ;) )

Es waren insgesamt nur sechs Zeilen, die im Zusammenhang die Lösung ergaben:
Code:
# Erstelle eine neue Regel namens no-conns-from-extif (die kann auch sonstwie heißen)
iptables -N no-conns-from-extif
# falls es no-conns-from-extif schonmal gab: leeren per flush
iptables -F no-conns-from-extif
# Füge eine Regel für einen erlaubten Zugriff von Internet auf das interne Netzwerk auf den Port 8080 hinzu:
iptables -A no-conns-from-extif -i $EXT -p -tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
iptables -A INPUT -j no-conns-from-extif
# Aktiviere das Forwarding
iptables -A FORWARD -j no-conns-from-extif
# Leite das eingegangene Paket an den Zielrechner im internen Netz weiter
iptables -t nat -A PREROUTING -i $EXT -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.5:8080

Für die Anfänger: $EXT wurde zuvor (siehe meine conf am Anfang des Threads) als

EXT = dsl0

deklariert.

Genau so funzt es. Nachdem ich das alles eingetickert und den Cronjob beauftragt hatte, nach 5 Minuten alles wieder auf die funktionierende Ausgangskonfiguration einzustellen (ich hatte es von Ferne konfiguriert) konnte ich meine Sicherungsleine schon nach dem ersten Versuch wieder entfernen :), weil alles funktionierte wie es sollte. Mich strahlte das iRMC an und fragte ich fröhlich nach Benutzername und Passwort.

So, und hier ist die (originale) Konfiguration aus der ich das genommen und für meine Zwecke modifiziert hab. Ich hoffe ich verstoße damit nun nicht gegen die Forenregeln.

Code:
# Einfache Paketfilter-Firewall für LANs
# optional: ssh-Fernwartungszugriff vom Internet aus
# optional: Support für transparenten Squid-HTTP-Proxy

# hier das externe Interface definieren
# Modem/DSL arbeitet mit ppp0, ppp1, ...
#  EXTIF=ppp+
# ISDN arbeitet mit ippp0, ippp1, ...
#  EXTIF=ippp+
EXTIF=ippp+

# meine eigene (interne) IP
# kann man mit ifconfig ermitteln, z.B. eth1 -> 10.10.10.1 oder eben 192.168.100.1
MYIP=192.168.100.1

#                          _____
#Incoming                 /     \         Outgoing
#       -->[Routing ]--->|FORWARD|------->
#          [Decision]     \_____/        ^
#               |                        |
#               v                       ____
#              ___                     /    \
#             /   \                   |OUTPUT|
#            |INPUT|                   \____/
#             \___/                      ^
#               |                        |
#                ----> Local Process ----

# "gefälschte" IP-Adressen verhindern:
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
  echo 1 > $f
done

# setzen der Policy der Standard-Regelketten
# von aussen nach innen wird eine "deny all, allow some"-Strategie verwendet
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# löschen aller bereits definierten Regeln (flush)
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT

# neue Regelkette "no-conns-from-extif" anlegen
iptables -N no-conns-from-extif
# falls es "no-conns-from-extif" schon gab: leeren per flush
iptables -F no-conns-from-extif


# icmp-Pakete (z.B. ping) generell zulassen (nur für nicht-DoS-gefährdete Anwendung)
iptables -A no-conns-from-extif -p icmp -j ACCEPT

# lo-Interface zulassen
iptables -A no-conns-from-extif -i lo -j ACCEPT


# Pakete, die zu bereits bestehenden Verbindungen gehören (oder damit zusammenhängen) erlauben
iptables -A no-conns-from-extif -m state --state ESTABLISHED,RELATED -j ACCEPT

# neue Verbindungen nur dann erlauben, wenn sie NICHT über das externe Interface  reinkommen
iptables -A no-conns-from-extif -m state --state NEW -i ! $EXTIF -j ACCEPT

#optional: ssh-Port nach außen aufmachen für Fernwartung vom Internet aus
#iptables -A no-conns-from-extif -m state --state NEW -i $EXTIF -p tcp --dport 22 -j ACCEPT

#optional: Port 80 nach außen aufmachen für Webserver
#iptables -A no-conns-from-extif -m state --state NEW -i $EXTIF -p tcp --dport 80 -j ACCEPT


#optional: VNC für mehrere Rechner im LAN
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5800 -j ACCEPT
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5900 -j ACCEPT 
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5801 -j ACCEPT
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT 
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5802 -j ACCEPT
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5902 -j ACCEPT 
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5803 -j ACCEPT
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5903 -j ACCEPT 

#optional: PC-Anywhere ab >= 9.0
#iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5631 -j ACCEPT
#iptables -A no-conns-from-extif -i $EXTIF -p udp -m udp --dport 5632 -j ACCEPT

# unerwünschte Pakete in's Log schreiben (max. aber 1 Eintrag pro Sekunde, um DoS zu verhindern)
iptables -A no-conns-from-extif -i $EXTIF -m limit --limit 1/sec -j LOG --log-prefix "Bad packet from $EXTIF :"
iptables -A no-conns-from-extif -i ! $EXTIF -m limit --limit 1/sec -j LOG --log-prefix "Bad packet not from $EXTIF :"

# ... und verwerfen (würde auch ohne Regel durch Policy passieren).
iptables -A no-conns-from-extif -j DROP

# PaketFilter-Regelkette für hereinkommende und durchlaufende Pakete  anspringen.
iptables -A INPUT -j no-conns-from-extif
iptables -A FORWARD -j no-conns-from-extif

#           _____                                     _____
#          /     \                                   /     \
#        PREROUTING -->[Routing ]----------------->POSTROUTING----->
#          \D-NAT/     [Decision]                    \S-NAT/
#                          |                            ^
#                          |                            |  
#                          |                            |
#                          |                            |
#                          |                            |
#                          |                            |
#                          |                            |
#                          --------> Local Process ------

# Modul für NAT laden
modprobe iptable_nat

# Masquerading (spezielle Form von SNAT) aktivieren
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

#optional: VNC-Zugriff auf internen PC
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5800 -j DNAT --to-destination 192.168.100.2:5800
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5900 -j DNAT --to-destination 192.168.100.2:5900
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5801 -j DNAT --to-destination 192.168.100.14:5800
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5901 -j DNAT --to-destination 192.168.100.14:5900
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5802 -j DNAT --to-destination 192.168.100.15:5800
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5902 -j DNAT --to-destination 192.168.100.15:5900
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5803 -j DNAT --to-destination 192.168.100.16:5800
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5903 -j DNAT --to-destination 192.168.100.16:5900

#optional: PC-Anywhere-Zugriff (ab PCA >=9) auf internen PC
#iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport  5631 -j DNAT --to-destination 192.168.100.2:5631
#iptables -t nat -A PREROUTING -i $EXTIF -p udp -m udp --dport  5632 -j DNAT --to-destination 192.168.100.2:5632

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

# optional:
# sende hereinkommende Port-80 Web-Zugriffe auf unseren (transparenten) Squid Proxy
# iptables -t nat -A PREROUTING -p tcp -d ! $MYIP --dport 80 -j REDIRECT --to-port 3128
# bitte beachten: Squid muss entsprechend konfiguriert werden, damit er weiss,
# dass er ein transparenter Proxy ist!
# squid.conf (für Squid v2.3):
#     http_port 3128
#     httpd_accel_host virtual
#     httpd_accel_port 80
#     httpd_accel_with_proxy  on
#     httpd_accel_uses_host_header on
#
# Squid v2.4 benötigt zusätzlich diese Zeile:
#     httpd_accel_single_host off
Quelle: http://www.linuxwiki.de/PaketFilter/MasqueradeSshProxy

Mit Dank an alle, die versuchten zu helfen.

Gruß

Thomas_H
 
Back
Top