opsec2022
Goto Top

Zugriff auf Docker Container Port auf bestimmte IP-Adresse beschränken

Hallo Zusammen,

Ich habe den Container xy, welcher den Port 1234 (3398 auf dem Host) bereitstellt. Dieser stellt eine VPN-Verbindung bereit und ich verbinde mich über diese via RDP auf ein System in meinem Heimnetz. Ohne jegliche Regeln auf dem Host, klappt dies auch wunderbar. Nun möchte ich den Zugriff auf diesen Port jedoch auf meine IP-Adresse beschränken. Ich habe versucht auf dem Host via IP-Tables die INPUT und FORWARD Policies zu droppen und entsprechende Richtlinien zum Erlauben meiner IP-Adresse als Source und 1234 als Zielport hinzuzufügen. Nun ist es aber so, egal in welcher Konstellation ich die IP-Tables regeln anlege, kann sich entweder jeder oder niemand auf den Port verbinden oder der Container kann eine VPN-Verbindung establishen aber das Remotesystem nicht mehr erreichen.

Was ich unter anderem Versucht habe

    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -A INPUT -s 192.168.0.10 --dport 1234 -j ACCEPT
    iptables -A FORWARD -s 192.168.0.10 --dport 1234 -j ACCEPT

Hat jemand eine Idee wie ich die Verbindung auf den Port, auf meine IP beschränken kann, ohne den Container einzuschränken?

Gruß OpSec

Content-Key: 14074216788

Url: https://administrator.de/contentid/14074216788

Printed on: April 28, 2024 at 09:04 o'clock

Member: DarkZoneSD
DarkZoneSD Oct 11, 2023 at 18:20:47 (UTC)
Goto Top
Moin,

ist völlig aus der Luft gegriffen, aber werden die Regeln nicht von oben nach unten angewendet? Also kommen die unteren garnicht erst zum Schuss weil die oberen es bereits verbieten. die DROP Regeln sollten also unterhalb stehen.

Grüße
Member: jsysde
jsysde Oct 11, 2023 at 18:25:46 (UTC)
Goto Top
Moin.

Schließe mich @DarkZoneSD an - Firewall-Regeln werde afaik überall hierarchisch von oben nach unten abgearbeitet. Erste Regel, die greift, wird angewendet und das Regelwerk nicht weiter verarbeitet.

Alternativ könntest du die Port-Zuordnung deines Containers anpassen.
Statt
    ports:
      - 1234:3000

könntest du mal
    ports:
      - a.b.c.d:1234:3000

ausprobieren, wobei a.b.c.d die gewünschte IP-Adresse ist, die zugreifen können soll.

Cheers,
jsysde
Member: opsec2022
opsec2022 Oct 11, 2023 updated at 20:06:46 (UTC)
Goto Top
Hallo und Danke für die Antworten,

Letzteres ist leider keine Option, da ich ggf. mehrere IP-Adressen für einen Port erlauben muss.
Mit folgendem procedere:

  • Policies INPUT u. FORWARD auf Allow
  • Flush INPUT u. FORWARD
  • Anlegen der entsprechenden regeln
  • Policies INPUT u. FORWARD auf DROP

also

 iptables -A INPUT -s 192.168.0.10 --dport 1234 -j ACCEPT
 iptables -A FORWARD -s 192.168.0.10 --dport 1234 -j ACCEPT
 iptables -P INPUT DROP
 iptables -P FORWARD DROP

kann nun der Container das Remotesystem nicht mehr erreichen. Meines Verständnisses nach erstellt Docker ein virtuelles Interface bzw. eine virtuelle Ethernet Bridge docker0, an welche die Container gebunden werden. Anschließend wird IP-Tables so angepasst, dass Kommunikation zwischen den Exposed Ports und dem Host-Netzwerk gestattet wird. Durch die o.g. Regeln wird nun sämtlicher Inbound Traffic an den Host selbst außer von IP X auf Host-Port Y unterbunden. Wo wird hier der Outbound Traffic des Containers, welcher über die Bridge läuft eingeschränkt?
Muss ich hier ggf. mit den Chains DOCKER o. DOCKER-USER arbeiten?

Gruß OpSec
Member: opsec2022
opsec2022 Oct 20, 2023 updated at 18:47:02 (UTC)
Goto Top
Das o.g. Problem mit dem outbound traffic konnte ich lösen. Den Zugriff auf die Container beschränken allerdings nicht.

Regeln zum Start des Servers:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F INPUT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
Weder append noch insert der folgenden Regeln hat das gewünschte Ergebnis zu Folge

iptables -A DOCKER-USER -p tcp -m conntrack --ctorigsrc {my_ip} -m tcp --dport {port}-j ACCEPT
iptables -A INPUT -p tcp -s {my_ip} --dport {port} -j ACCEPT

Ich kann mit einem anderen Client immer noch eine Verbindung zum Host auf dem entsprechenden Port herstellen. Hat hier noch jemand eine Idee?