ubuntuusers.de

iptables Prerouting & Forwarding

Status: Gelöst | Ubuntu-Version: Server 18.04 (Bionic Beaver)
Antworten |

htt.tito

Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

Hallo! Wieder einmal ein iptables Problem.

Internet = ppp0

WLAN/LAN = br0 (eno1/wlp1s0)

Apache Webserver = 192.168.0.100:80 , 192.168.0.100:443

Mein Webserver ist via LTE USB Stick und wvdial über ppp0 mit dem Internet verbunden.

Mit meinem iptables Kenntnissen bin ich am Ende... ☹

- Ich kann entweder meine Clienten im LAN mit dem Internet verbinden

ODER

- Nur zu meinem Webserver verbinden

Je nach dem, welche Regeln ich setzte....aber ich will beides.....

Hier meine Regeln...

#!/bin/bash

IPT=/sbin/iptables
IPT6=/sbin/ip6tables
INET=ppp0
LOCAL=br0
LO=lo
LOCAL_NET="192.168.0.0/24"
VPN_NET="10.8.0.0/24"

#echo "Schalte Fail2ban aus"
#service fail2ban stop

echo "Schalte Router aus..."

echo 0 > /proc/sys/net/ipv4/ip_forward

echo "Loesche iptables"
$IPT -F
$IPT -X
$IPT -t nat -X
$IPT -t nat -F
$IPT -t mangle -X
$IPT -t mangle -F

echo "Loesche ip6tables"
$IPT6 -F
$IPT6 -X
$IPT6 -t nat -X
$IPT6 -t nat -F
$IPT6 -t mangle -X
$IPT6 -t mangle -F

echo "Default policy drop ip6tables"
$IPT6 -P INPUT DROP
$IPT6 -P OUTPUT DROP
$IPT6 -P FORWARD DROP

echo "Default policy drop"
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

echo "MEINE Chains"
$IPT -N MYDROP
$IPT -N MYACCEPT

echo "Logging..."
$IPT -A MYDROP -j LOG --log-prefix "FW-DROP: "
$IPT -A MYDROP -j DROP
$IPT -A MYACCEPT -j LOG --log-prefix "FW-ACCEPT: "
$IPT -A MYACCEPT -j ACCEPT

echo "Kamera Internet sperren..."
$IPT -I FORWARD -p tcp -s 192.168.0.15 ! -d 192.168.0.0/24 -j MYDROP

echo "Schalte connection tracking ein..."
$IPT -A FORWARD -m conntrack --ctstate=RELATED,ESTABLISHED -j ACCEPT
$IPT -A FORWARD -m conntrack --ctstate=INVALID -j MYDROP
$IPT -A INPUT -m conntrack --ctstate=RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -m conntrack --ctstate=INVALID -j MYDROP
$IPT -A OUTPUT -m conntrack --ctstate=RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -m conntrack --ctstate=INVALID -j MYDROP

echo "SSH erlauben..."
$IPT -A INPUT -p tcp --dport 30022 -m conntrack --ctstate=NEW -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p tcp --dport 30022 -j ACCEPT

echo "Schnittstelle maskieren..."
$IPT -t nat -A POSTROUTING -j MASQUERADE

echo "Loopback freischalten"
$IPT -A INPUT -i $LO -j ACCEPT
$IPT -A OUTPUT -o $LO -j ACCEPT

echo "DNS Anfragen..."
$IPT -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p udp --dport 53 -j ACCEPT

echo "ping..."
$IPT -A INPUT -p icmp -j MYACCEPT
$IPT -A OUTPUT -p icmp -j ACCEPT
$IPT -A FORWARD -p icmp -j ACCEPT

echo "Samba LOKAL Freigabe..."
$IPT -A INPUT -p TCP -i $LOCAL -s $LOCAL_NET -d $LOCAL_NET --dport=139 -j ACCEPT
$IPT -A INPUT -p TCP -i $LOCAL -s $LOCAL_NET -d $LOCAL_NET --dport=445 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p TCP --dport 139 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p TCP --dport 445 -j ACCEPT
$IPT -A INPUT -p UDP -i $LOCAL -s $LOCAL_NET -d $LOCAL_NET --dport=137 -j ACCEPT
$IPT -A INPUT -p UDP -i $LOCAL -s $LOCAL_NET -d $LOCAL_NET --dport=138 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p UDP --dport 137 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p UDP --dport 138 -j ACCEPT

echo "Zoneminder..."
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p TCP --dport 8080 -j ACCEPT

echo "DHCP..."
$IPT -A INPUT -p UDP --dport 67 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p UDP --dport 67 -j ACCEPT

echo "http und https port Server..."
$IPT -A INPUT -p TCP --dport=80 -j ACCEPT
$IPT -A INPUT -p TCP --dport=443 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

echo "MIT DIESE ERREICHE ICH NUR DEN WEBSERVER - KEIN INTERNET AM CLIENTEN"
#$IPT -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
#$IPT -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to-destination 192.168.0.100

echo "MIT DIESE ERREICHE ICH DEN WEBSERVER VON AUSSEN - HABE INTERNET AM CLIENTEN"
$IPT -t nat -A PREROUTING -i $INET -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
$IPT -t nat -A PREROUTING -i $INET -p tcp --dport 443 -j DNAT --to-destination 192.168.0.100:443

echo "MIT DIESE ERREICHE ICH DAS INTERNET - ABER NICHT MEINEN WEBSERVER VOM CLIENTEN AUS"
$IPT -A FORWARD -p TCP -i $LOCAL -o $INET -s $LOCAL_NET --dport=80 -j ACCEPT
$IPT -A FORWARD -p TCP -i $LOCAL -o $INET -s $LOCAL_NET --dport=443 -j ACCEPT

echo "webmin port Server..."
$IPT -A INPUT -p TCP  -i $LOCAL -s $LOCAL_NET --dport=10000 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -m state --state NEW -p TCP --dport 10000 -j ACCEPT

echo "squid proxy port Server..."
$IPT -A INPUT -p TCP --dport=3128 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p TCP --dport 3128 -j ACCEPT

echo "smtp ports 25/TCP 465/SSL-TLS 587/STARTTLS Server..."
$IPT -A INPUT -p TCP --dport=587 -j ACCEPT
$IPT -A INPUT -p TCP --dport=25 -j ACCEPT
$IPT -A INPUT -p TCP --dport=465 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p TCP --dport 587 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p TCP --dport 25 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p TCP --dport 465 -j ACCEPT

echo "imap/143 imaps/993 port Server..."
$IPT -A INPUT -p TCP --dport=993 -j ACCEPT
$IPT -A INPUT -p TCP --dport=143 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p TCP --dport 993 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p TCP --dport 143 -j ACCEPT

echo "jellyfin port Server..."
$IPT -A INPUT -p TCP -i $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m multiport --dports=8096,8920 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p TCP --dport 8096 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p TCP --dport 8920 -j ACCEPT

echo "tvheadend port Server..."
$IPT -A INPUT -p TCP -i $LOCAL -s $LOCAL_NET -m multiport --dports=9981,9982 -j ACCEPT
$IPT -A INPUT -p UDP -i $LOCAL -s $LOCAL_NET -m multiport --dports=32787,65001 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -m state --state NEW -p TCP --dport 9981 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -m state --state NEW -p TCP --dport 9982 -j ACCEPT
$IPT -A OUTPUT -o $LO -s $LOCAL_NET -d $LOCAL_NET -m state --state NEW -p TCP --dport 9982 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -m state --state NEW -p UDP --dport 32787 -j ACCEPT
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -m state --state NEW -p UDP --dport 65001 -j ACCEPT

echo "MYSQL öffnen..."
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -m state --state NEW -p TCP --dport 3306 -j ACCEPT

echo "SMA Speedwire/SBFspot..."
$IPT -A OUTPUT -o $LOCAL -s $LOCAL_NET -m state --state NEW -p UDP --dport 9522 -j ACCEPT

echo "minidlnad port Server..."
$IPT -A INPUT -p UDP -s $LOCAL_NET --dport=1900 -j ACCEPT

echo "Internet Clienten..."
$IPT -A FORWARD -p TCP -i $LOCAL -o $INET -s $LOCAL_NET --dport=993 -j ACCEPT
$IPT -A FORWARD -p TCP -i $LOCAL -o $INET -s $LOCAL_NET --dport=587 -j ACCEPT
$IPT -A FORWARD -p TCP -i $LOCAL -o $INET -s $LOCAL_NET --dport=25 -j ACCEPT
$IPT -A FORWARD -p TCP -i $LOCAL -o $INET -s $LOCAL_NET --dport=143 -j ACCEPT
$IPT -A FORWARD -p TCP -i $LOCAL -o $INET -s $LOCAL_NET --dport=465 -j ACCEPT

echo "OPENVPN Regeln..."
$IPT -A INPUT -i tun0 -s $VPN_NET -j ACCEPT
$IPT -A INPUT -p udp -m udp --dport 1194 -j ACCEPT
$IPT -A FORWARD -s $VPN_NET -j ACCEPT
$IPT -A FORWARD -p UDP --dport=1194 -j ACCEPT
$IPT -A INPUT -m state --state NEW -m udp -p udp --dport=1194 -j ACCEPT
$IPT -A OUTPUT -m state --state NEW -p UDP --dport 1194 -j ACCEPT
$IPT -A OUTPUT -o tun0 -s $VPN_NET -j ACCEPT

echo "Multicast..."
$IPT -A INPUT   -s 224.0.0.0/4 -j ACCEPT
$IPT -A FORWARD -s 224.0.0.0/4 -d 224.0.0.0/4 -j ACCEPT
$IPT -A OUTPUT  -d 224.0.0.0/4 -j ACCEPT

echo "Droplog..."
$IPT -A INPUT -j LOG --log-prefix "FW-LAST-IN-DROP: "
$IPT -A OUTPUT -j LOG --log-prefix "FW-LAST-OUT-DROP: "

#echo "Firewall OUTPUT darf ALLES..."
#$IPT -A OUTPUT -j ACCEPT

echo "Schalte Router ein"
echo 1 > /proc/sys/net/ipv4/ip_forward

#echo "Schalte Fail2ban ein"
#service fail2ban start

Moderiert von kB:

Aus dem Forum „Sicherheit“ in besser passendes Forum verschoben.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9627

Wohnort: Münster

Grundregel: Netfilter kann keine Verbindungsmöglichkeiten erschaffen. Es kann lediglich grundsätzlich mögliche Verbindungen verbieten.

Prüfe daher:

  1. Entferne alle Netfilter-Regeln. Zeige dann:

    sudo iptables-save 
  2. Zeige die eingericteten Routen:

    ip -4 route 
  3. Kannst Du in diesem Zustand

    • alles erreichen, was Du erreichen willst?

    • Ist alles, was erreichbar sein soll, auch erreichbar?

Erst wenn dieser Test uneingeschränkt positiv ausfällt, dann erst füge schrittweise Netfilter-Regeln hinzu, welche die Konnektivität einschränken.

htt.tito

(Themenstarter)
Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

OK, wenn ich das mache geht gar nichts mehr.... Kein Internet, Kein Webserver.....

Die Ausgabe von ip -4 route lautet:

default via 10.64.64.64 dev ppp0 
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1 
10.64.64.64 dev ppp0 proto kernel scope link src 178.112.187.58 
192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.100 

htt.tito

(Themenstarter)
Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

Und jetzt?

KANNST DU MIR HELFEN???

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9627

Wohnort: Münster

htt.tito schrieb:

[…] Die Ausgabe von ip -4 route lautet:

default via 10.64.64.64 dev ppp0 
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1 
10.64.64.64 dev ppp0 proto kernel scope link src 178.112.187.58 
192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.100 

Dieser Rechner ist also über eine PPP-Verbindung mit einer Gegenstelle verbunden. Seine lokale Adresse lautet 178.112.187.58, das ist eine öffentliche IP-Adresse und sollte (ist aber nicht) somit weltweit erreichbar sein. Die Adresse der Gegenstelle lautet 10.64.64.64, und die ist auch das Gateway zur Welt.

Außerdem gibt es noch weitere lokale Schnittstellen, wofür gebrauchst Du diese? Zeige bitte:

ip -br link ; ip -4 addr 

Teste erst einmal, ob Du von diesem Rechner nach draußen telefonieren kannst:

ping -c1 178.112.187.58
ping -c1 10.64.64.64
ping -c1 213.95.41.4
host ubuntuusers.de

htt.tito

(Themenstarter)
Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

Hallo noch mal ☺

  • tun0 ist für OpenVPN

  • br0 ist die LAN Schnittstelle.

  • ppp0 ist der LTE USB Stick

Ja, ich kann vom Server aus pingen ins Internet und alles, aber darum gehts doch gar nicht!

Ich brauche Hilfe bei den IPTABLES, denn da stimmt was nicht! IST GELB markiert!

OHNE IPTABLES wer sagt dem Kernel dass er ppp0 auf br0 weiterleiten soll?! Erklär das mal bitte.

Bearbeitet von kB:

Zur Verbesserung der Lesbarkeit die Aufzählung repariert.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9627

Wohnort: Münster

htt.tito schrieb:

[…]

  • br0 ist die LAN Schnittstelle.

br0 ist jedenfalls kein üblicher Name für eine LAN-Schnittstelle. Vermutlich hast Du da eine Netzwerkbrücke konfiguriert.

[…] OHNE IPTABLES wer sagt dem Kernel dass er ppp0 auf br0 weiterleiten soll

Für die Weiterleitung von IP-Paketen ist, wie schon erklärt, einzig das Routing-System des Kernels zuständig. Das hat mit Netfilter nichts zu tun. Die Routen hast Du aber – wie auch immer, Du schreibst dazu ja nichts – schon eingerichtet. Ein an br0 angeschlossener Rechner sollte die Gegenstelle Deines Providers unter deren Adresse 10.64.64.64 per ping erreichen können, ob die Gegenstelle auch antwortet, hat nur der Provider in der Hand.

Wenn ein an br0 angeschlossener Rechner allerdings das freie Internet erreichen können soll, dann muss man 10.64.64.64 über die Absenderadresse täuschen, indem Dein Server die Absender-Adressen aus dem Bereich 192.168.0/24 per NAT/PT umsetzt auf die öffentliche Adresse 178.112.187.58/32. Dazu und nur dazu benötigst Du Netfilter mit dem Target MASQUERADE von iptables:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 

Du musst natürlich sicherstellen:

  • IP-Forwarding ist grundsätzlich eingeschaltet.

  • Die FORWARD-Tabelle von Netfilter darf den Verkehr zwischen br0 und ppp0 nicht herausfiltern.

  • Die MASQUERADE-Regel steht an richtiger Stelle in der POSTROUTING-Tabelle.

htt.tito

(Themenstarter)
Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

Ja Danke!

- br0 ist eine Netzwerkbrücke (steht schon ganz am Anfang meiner Frage - und zwar von eno1 & wlp1s0)

Ja, da hast du vollkommen recht mit den Netfiltern....

Habe in meinen Regeln das "-o ppp0" in MASQUERADE vergessen ☹

Es funktioniert auch alles, nur

das Erreichen meiner Webseiten aus dem lokalen LAN funktioniert nicht...

Das ist die eigentliche Frage! Schau mal bitte auf die gelben Markierungen im File ganz oben....

Da ist irgendwas falsch, finde nur nicht heraus was....

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9627

Wohnort: Münster

Du musst den Webserver natürlich unter der Adresse 178.112.187.58 laufen lassen und ihn auch darüber ansprechen.

htt.tito

(Themenstarter)
Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

Ok, nur wie Ich habe eine Wechsel IP ?!

Ich erkläre das noch mal ganz einfach:

- Wenn ich vor meinem PC sitze und www.meinedomain.xy eintippe, komme ich nicht auf meine Webseiten...

- Wenn ich auf einem PC irgendwo auf der Welt sitze und das selbe mache, komme ich auf meine Webseiten...

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

htt.tito schrieb:

- Wenn ich vor meinem PC sitze und www.meinedomain.xy eintippe, komme ich nicht auf meine Webseiten...

Das liegt daran, dass dein Router (oder gleichwertig) kein NAT-Loopback (... auch bekannt als Hairpinning oder als NAT-Reflection) machen kann.

Konfiguriere auf deinem PC die lokale Namensauflösung so, dass nur dort "www.meinedomain.xy" auf die lokale IP-Adresse des Servers aufgelöst wird (d. h. als workaround).

htt.tito

(Themenstarter)
Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

#lubux

Hallo!

Warum erreiche ich meinem Webserver mit der Regel:

echo "MIT DIESE ERREICHE ICH NUR DEN WEBSERVER - KEIN INTERNET AM CLIENTEN"
#$IPT -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
#$IPT -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to-destination 192.168.0.100

???

Da werden dann alle Verbindungen von br0 von port 80/443 auf 192.168.0.100 umgeleitet...

deshalb habe ich dann kein Internet am Clienten....

Lässt sich das nicht irgendwie umformulieren??

NAT-Loopback = Bahnhof ???!!!

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

htt.tito schrieb:

Warum erreiche ich meinem Webserver mit der Regel:

echo "MIT DIESE ERREICHE ICH NUR DEN WEBSERVER - KEIN INTERNET AM CLIENTEN"
#$IPT -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
#$IPT -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to-destination 192.168.0.100

Da werden dann alle Verbindungen von br0 von port 80/443 auf 192.168.0.100 umgeleitet...

Na weil diese iptables-Regeln für alle Ziel-IP-Adressen (destination-IP-address) gültig sind.

htt.tito schrieb:

deshalb habe ich dann kein Internet am Clienten....

Internet solltest Du schon haben, nur die TCP-Port 80 und 443 kannst Du nicht im Internet erreichen. Teste mal:

nc -zv 1.1.1.1 53
ping -c 3 1.1.1.1

auf deinem Client.

htt.tito schrieb:

Lässt sich das nicht irgendwie umformulieren??

Ohne feste/statische externe IPv4-Adresse für deinen Server, geht das nicht.

htt.tito schrieb:

NAT-Loopback = Bahnhof ???!!!

BTW: Im Internet findet man viel Info zu "NAT-Loopback/Hairpinning/NAT-Reflecion".

htt.tito

(Themenstarter)
Avatar von htt.tito

Anmeldungsdatum:
7. Dezember 2014

Beiträge: 87

Ja stimmt, falsche Formulierung...komme eben nur nicht auf port 80/443.

Ich hab was gelesen, wo man seine externe IP über einen cronejob auslesen kann und dann in ip tables einträgt...

Wäre das eine Möglichkeit?

Wie würde dann die iptables lauten?

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

htt.tito schrieb:

Ich hab was gelesen, wo man seine externe IP über einen cronejob auslesen kann und dann in ip tables einträgt...

Wäre das eine Möglichkeit?

Wie würde dann die iptables lauten?

Funktioniert z. Zt. (d. h. nach dem Du die nicht brauchbaren iptables-Regeln gelöscht hast) z. B. folgende iptables-Regel auf deinem Client:

sudo iptables -t nat -I OUTPUT 1 -o <output-Interface> -p tcp -m multiport --dports 80,443 -d <externe-IPv4-Adresse-server> -j DNAT --to-destination 192.168.0.100

(output-Interface und externe-IPv4-Adresse-server anpassen und ohne spitze Klammern)?

Antworten |