PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Port Forwarding mit IPTables



MatthiasS
30.05.12, 12:57
Hallo zusammen,

ich habe folgendes Problem:
Auf unserem alten Gateway konnte man den internen Webserver z.B. auf Port 8080 von außen über Port 20200 erreichen.
Internet <-> Name.dyndns.org:20200 <-> Port Forwarding <-> 192.168.0.23:8080

Das ganze wurde mit rinted realisiert und klappte bis dato ganz gut.

Der neue Server läuft auch als Gateway, aber mit Iptables.
Internet <-> ppp0 <-> IPTables Firewall und Routing <-> eth1 <-> internes Netz 192.168.0.0/24

Wenn ich rinetd wieder in Betrieb nehme, tut sich nichts, da Iptables den Zugriff verhindert. All meine Versuche das Port Forwarding mit Iptables zu machen, sind bisher fehlgeschlagen.

Hat jemand ne Idee, wie ich das realisieren kann?

Habe folgendes zusätzlich zum unten angegebenen Skript versucht:

/sbin/iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport <QUELLPORT> -j DNAT --to 192.168.202.23:<ZIELPORT>
/sbin/iptables -A FORWARD -p tcp -i ppp0 -d 192.168.202.23 --dport <ZIELPORT> -j ACCEPT




#!/bin/bash

echo "Starting firewall"

LOGLIMIT=20
IPTABLES=/sbin/iptables
LAN_IFACE="eth1"
INET_IFACE="ppp0"

case "$1" in
start)
# 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 $INET_IFACE -j MASQUERADE
### 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
# 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 ###
# SSH auf den Server erlauben
$IPTABLES -A INPUT -m state --state NEW -p tcp --dport 2121 -j ACCEPT
# OpenVPN durchlassen / erlauben
$IPTABLES -A INPUT -m state --state NEW -p udp --dport 15555 -j ACCEPT
$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 $LAN_IFACE -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
;;

*)
echo "Usage: `basename $0` {start}" >&2
exit 64
;;
esac

exit 0


Hoffentlich hat hier jemand ne Idee dazu.
Das Skript wurde übrigens von hier (http://www.hackerwiki.org/index.php/Einrichtung_eines_Routers_mit_Linux) entnommen.

Gruß
Matthias

muell200
30.05.12, 13:13
/sbin/iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport <QUELLPORT> -j DNAT --to 192.168.202.23:<ZIELPORT>
/sbin/iptables -A FORWARD -p tcp -i ppp0 -d 192.168.202.23 --dport <ZIELPORT> -j ACCEPT


forward eingeschaltet?
was sagt:

cat /proc/sys/net/ipv4/ip_forward

MatthiasS
30.05.12, 15:45
was sagt:

cat /proc/sys/net/ipv4/ip_forward
1

Ist eingeschaltet.

Gruß
Matthias

mkahle
02.06.12, 09:35
Du darfst die zwei extra Regeln



/sbin/iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport <QUELLPORT> -j DNAT --to 192.168.202.23:<ZIELPORT>
/sbin/iptables -A FORWARD -p tcp -i ppp0 -d 192.168.202.23 --dport <ZIELPORT> -j ACCEPT


nicht nach dem Skript ausführen, sondern mußt den Code innerhalb, vor der Zeile



$IPTABLES -A FORWARD -p tcp -j LOGREJECT


ausgeführt haben. Zumindest die zweite der beiden Zeilen ... die NAT-Regel kannst Du auch an anderer Stelle einfügen.

Die Zeile

$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
ist übrigens doppelt in Deinem Skript.

L00NIX
03.06.12, 08:37
Die Zeile

$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
ist übrigens doppelt in Deinem Skript.

Ist sie nicht, bei der zweiten fehlt das "NEW".

Allerdings ist die zitierte Regel sehr offen und erlaubt generell alles zu routen. Keine gute Sache im Sinne der Sicherheit. Da kannst du die Policy für FORWARD gleich auf ACCEPT lassen.

Gruß
L00NIX

MatthiasS
03.06.12, 23:41
Hi folks,

vielen Dank für Eure Beiträge!
Der Fehler lag leider ganz wo anders :/
Das Gateway hat die Pakete zum Zielrechner+Zielport weitergeleitet
und der Zielrechner hat auch geantwortet.
Leider ist die Antwort nie zu meinem Gateway vorgedrungen, da der Zielrechner einen falschen(alten) Gateway Eintrag hatte.
Auf dem Zielrechner lief das dann nach dem Motto: Quellpaket kommt nicht aus dem internen Netz - kein Routingeintrag fürs Quellnetz -> default Route wird benutzt -> Standard Gateway -> Nirvana.

Die vollständige und richtige Lösung trage ich morgen nach.

Gruß
Matthias

mkahle
04.06.12, 12:27
Ups. Habe das NEW übersehen. Der Einwand mit dem offenen Scheunentor ist selbstverständlich korrekt ...

L00NIX
04.06.12, 18:24
Ups. Habe das NEW übersehen. Der Einwand mit dem offenen Scheunentor ist selbstverständlich korrekt ...

Ganz so schlimm ist es nicht... wenn Masquerading aktiviert ist, kommen alle Rechner von Innen ins Internet.

Wenn kein DNAT aktiv ist, dann erreicht man aus dem Internet nichts im internen Netz.

Alles halb so wild...
L00NIX

MatthiasS
05.06.12, 13:43
Danke für eure Hinweise.

Hier noch die aktuelle Lösung:


$IPTABLES -t nat -A PREROUTING --dst $EXTERNAL_IP -p tcp --dport 20200 -j DNAT --to-destination 192.168.0.23:8080
$IPTABLES -t nat -A POSTROUTING --dst 192.168.0.23 -p tcp --dport 8080 -j SNAT --to-source $EXTERNAL_IP
$IPTABLES -t nat -A OUTPUT --dst $EXTERNAL_IP -p tcp --dport 20200 -j DNAT --to-destination 192.168.0.23:8080


Etwas unschön ist allerdings, dass sich wegen der 24Stunden-Zwangstrennung
$EXTERNAL_IP mit ändern müsste, was jedoch nicht passiert, da die Regeln statisch sind.
D.h. ich muss das Firewallskript periodisch (oder besser noch bei IP-Änderung) erneut ausführen.

Edit: Wird jetzt via crontab alle 15min ausgeführt.
Achtung Stolperfalle... cron nutzt als Standard Shell /bin/sh und hat einen eingeschränkten $PATH.
Pfade in Skripten also auf jeden Fall fest eintragen, z.B. /sbin/iptables

Hoeze
27.09.13, 20:18
Hi,
tut mir leid, wenn ich so nen alten Thread wieder ausgrabe, aber ich hab dasselbe Problem:
Ich bekomme einfach keine Portweiterleitung hin.
Könntet ihr mir sagen, welche Regeln ich dazu genau benötige?