[gelöst] iptables - forwarding nur lokale Schnittstellen

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

[gelöst] iptables - forwarding nur lokale Schnittstellen

Beitrag von frankw » 26.02.2019 08:10:38

Hallo,

ich habe aktuell folgende Regel:

Code: Alles auswählen

${ipt} -t nat -A PREROUTING ! -i ${if_ext} -m addrtype --dst-type LOCAL -p tcp --dport 80 -j DNAT --to-destination ${LXC_WEB_IP}:80
dies leitet sämtliche Anfragen auf die Hostadresse port 80 auf einen LXC-Container weiter. dies soll aber nicht für alle interfaces passieren...deswegen "! -i ${if_ext}", da der Webserver nicht vom Internet erreichbar sein soll (funktioniert auch). nun würde ich gerne mehr Schnittstellen ausschließen...

eine weitere solche Zeile macht keinen Sinn, da dann wieder alles offen ist

kann ich da mehrere Schnittstellen ausschließen und wie?

Gruß Frank
Zuletzt geändert von frankw am 03.03.2019 12:22:25, insgesamt 1-mal geändert.

eggy
Beiträge: 1855
Registriert: 10.05.2008 11:23:50

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von eggy » 26.02.2019 10:32:26

Warum machst Du das nicht einfach andersrum? Die Regel nur für die Interfaces angeben, auf denen sie gültig sein soll. Und sollten die Interfaces nen gemeinsames Namensprefix haben, gehts mit + auch mit einer Regel.
[!] -i, --in-interface name
Name of an interface via which a packet was received (only for packets entering the INPUT, FORWARD and PREROUTING chains). When the "!" argument is used before the interface name, the sense is inverted. If the interface name ends in a "+", then any interface which begins with this name will match. If this option is omitted, any interface name will match.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von frankw » 26.02.2019 11:18:34

die internen interfaces sind wesentlich mehr (vpn,lan,vlan,bridge,...) bei den externen sind es aktuell 2

mludwig
Beiträge: 559
Registriert: 30.01.2005 19:35:04

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von mludwig » 26.02.2019 13:11:33

Definiere eine neue Kette

Code: Alles auswählen

iptables -N neue_chain1
iptables -N neue_chain2
Die chain1 springst du dann für reinkommende Pakete von beiden externen Interfaces an, die chain2 für den Rest. Und deine Forwarding/NAT etc sortierst du entsprechend in die neuen Ketten ein, hier dann chain2.

Code: Alles auswählen

iptables -t nat -A PREROUTING -i extif1 -j neue_chain1
iptables -t nat -A PREROUTING -i extif2 -j neue_chain1
iptables -t nat -A PREROUTING -j neue_chain2 
Aufpassen: custom chains haben RETURN als Standard-Policy, d. h. am Ende springen sie in die alte Kette zurück und machen dort weiter.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von frankw » 26.02.2019 20:00:02

das mit dem return ist aktuell nicht schlimm, danke für den hinweis...

prinzipiell kann ich ja nur meine Zeile oben damit ersetzen, also alles an port 80 in die jeweilige chain...wie wende ich dann meine regel auf die intern-chain an? ist ja dann nicht mehr prerouting, richtig?

Code: Alles auswählen

${ipt} -A neue_chain2 -p tcp --dport 80 -j DNAT --to-destination ${LXC_WEB_IP}:80
in der extern-chain würde dann aktuell nichts passieren, sie wird nur zum separieren verwendet (alles was nicht extern ist landet in chain2)

habe noch nicht viel mit eigenen chains gemacht..kann ich nach dem verschieben noch ermitteln ob es aus der INPUT/OUTPUT oder FORWARDING-Chain kam? sonst muss ich für jede ursprungschain (INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING) eigene chains definieren (+zusätzliche Unterscheidungsmerkmale), oder?

oder werden die wie in meinem konkreten Fall nur temporär verwendet

mludwig
Beiträge: 559
Registriert: 30.01.2005 19:35:04

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von mludwig » 26.02.2019 20:33:02

So wie es da steht wird aus PREROUTING heraus nach den neuen Chains gesprungen. Ich würde dann nach source/destination-ip bzw. Input/Output - Interface filtern, und das geht ja weiterhin, da die Pakete diese Eigenschaften ja nicht verlieren. Wenn später noch speziell nach INPUT/OUTPUT etc was gemacht werden soll, kann man ja die Tatsache nutzen, dass am Ende der eigenen Kette das Paket wie gesagt in der Kette weiter bearbeitet wird, aus der iptables die eigene Kette angesprungen hat.

Du könntest auch einfach zuerst alles an Port 80 auf die externen Interfaces droppen, und dann den Rest wie bisher forwarden, ganz ohne extra Chains, aber wenn du von Extern auch was mit den Paketen vorhast, dann würde ich über die extra chains gehen. In Chain 1 dann die Pakete von extern auf Port 80 behandeln, und in Chain2 die Pakete vom Rest so wie gewünscht weiterleiten.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von frankw » 01.03.2019 19:51:12

@mludwig

wenn ich das jetzt richtig verstehe, werden externe Pakete in die externe chain verschoben und nach Abarbeitung dieser (return) zusammen mit den Paketen von den internen Schnittstellen in die interne liste geschoben. wenn ich nun in der internen LIste regeln habe, werden diese genauso auf die externen Pakete angewendet (wenn in der externen Liste nichts greift, da diese aber nur zum sortieren ist, ist diese leer)

das einzige was aus meiner (aktuellen) Sicht funktionieren würde ist das droppen der port-80-Pakete an den externen Schnittstellen bevor die "intern"-Regel greift

so etwas:

Code: Alles auswählen

for ext in ${external[@]}; do
  ${ipt} -t nat -A PREROUTING -i $ext -p tcp --dport 80 -j REJECTED
done
${ipt} -t nat -A PREROUTING -m addrtype --dst-type LOCAL -p tcp --dport 80 -j DNAT --to-destination ${LXC_WEB_IP}:80
Rejected ist mein Drop-Ersatz, wo zusätzlich ein tcp-reset geschickt wird (damit ein Client nicht ewig hängt während er auf Antwort wartet).
Zuletzt geändert von frankw am 11.03.2019 08:16:55, insgesamt 1-mal geändert.

TomL
Beiträge: 4207
Registriert: 24.07.2014 10:56:59

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von TomL » 01.03.2019 20:33:21

frankw hat geschrieben: ↑ zum Beitrag ↑
01.03.2019 19:51:12
wenn ich das jetzt richtig verstehe, werden externe Pakete in die externe chain verschoben und nach Abarbeitung dieser (return) zusammen mit den Paketen von den internen Schnittstellen in die interne liste geschoben.
Nein, es werden keine Pakete oder sonst was von irgendwo nach irgendwo verschoben. Stell Dir das Regelwerk (also alle Regeln) der Tabelle Filter als lange Kette vor, die oben mit der ersten Regel angefangen sequentiell alle Regeln nacheinander bis zur letzten abarbeitet. Diese Kette wird unterbrochen und beendet, wenn eine Regel ein abschließendes Urteil "fällt", also z.B. DROP oder ACCEPT oder REJECT. Das passiert dann, wenn die Match-Bedingungen der Regel mit den Merkmalen des TCP-Paketes übereinstimmen. Wenn keine der Regeln wg. der Match-Bedingungen passt, greift ganz am Ende die Default-Policy, normalerweise mit ACCEPT.

Wenn eine Regel wg. passender Matches allerdings kein abschließendes Urteil fällt und NUR irgendwohin jump't und mit "RETURN" zurückkehrt, dann sind die Regeln im Jump-Ziel nix anderes, als in die primäre Tabelle an dieser Stelle eingefügte Regeln.... die auch nur wiederrum sequentiell abgearbet werden. Bildlich gesprochen sieht das so aus, wenn Du im Table Filter die Regeln von 1-20 hast und bei 7 einen Jump durchführst, wo 5 Regeln enthalten sind, dann wird das wie folgt abgearbeitet: 1,2,3,4,5,6,7 (,7.1,7.2,7.3,7.4,7.5), 8,9, usw. , wieder so lange, bis eine Regel ultimativ entscheidet "gut" oder "nicht gut". Es wird dabei nichts verschoben, alle Regeln schauen dabei immer auf das gleiche TCP/UDP-Paket, der Kernel wartet schlichtweg auf das Urteil einer Regel... welche das ist, ist ihm egal.

Ich würde Dir empfehlen, ein leichteres Regelwerk zu entwickeln, was dann auch leichter reproduzierbar und kontrollierbar ist. Nicht alles,was möglich ist, verbessert am Ende auch wirklich die Sicherheit. Ich würde deshalb erst Mal prüfen, welche tatsächlichen "virtuellen Gegner" diese von Dir beabsichtigten Regeln haben... wenn das nur theoretische Probleme sind, würde ich darauf verzichten.
vg, Thomas

mludwig
Beiträge: 559
Registriert: 30.01.2005 19:35:04

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von mludwig » 01.03.2019 20:52:01

frankw hat geschrieben: ↑ zum Beitrag ↑
01.03.2019 19:51:12

Code: Alles auswählen

for ext in ${external[@]}; do
  ${ipt} -t nat -A PREROUTING -i $ext -p tcp --dport 80 -j REJECTED
done
${ipt} -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination ${LXC_WEB_IP}:80
Rejected ist mein Drop-Ersatz, wo zusätzlich ein tcp-reset geschickt wird (damit ein Client nicht ewig hängt während er auf Antwort wartet).
Das sieht gut aus. Einfach, übersichtlich und macht das, was du willst. Ich finde einfach immer besser. Wenn man mit zusätzlichen Chains arbeitet und zusätzliche, unnötige Komplexität einbaut, entsteht die Gefahr von Fehlern, die dann auch noch schwer zu beheben sind. Wenn es ohne geht also um so besser ...

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: iptables - forwarding nur lokale Schnittstellen

Beitrag von frankw » 02.03.2019 11:07:13

@TomL

das habe ich schon so verstanden, den Begriff "verschieben" habe ich nur deswegen gewählt, weil man nicht mehr nach der Chain selbst (input,output,prerouting,...) unterscheiden kann (da das ja geändert wird).

mir ging es nur darum, dass in dem Fall, wo extern leer ist nicht mittels chains nach intern/extern "sortiert" werden kann, da letztendlich alles in intern landet...das funktioniert nur, wenn die Pakete in der extern-chain abschließend bearbeitet werden.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: [gelöst] iptables - forwarding nur lokale Schnittstellen

Beitrag von frankw » 05.03.2019 07:41:36

ein kleiner Fehler war noch drin: ich muss natürlich statt "-t nat -A PREROUTING" "-A INPUT" nehmen, da sonst Fehler kommt, dass die NAT-Tabelle nicht zum filtern ist

Antworten