docs: add Docker/firewalld bypass diagram to firewall-and-network.md
Visualizes the documented gap: pfSense always applies, firewalld only covers native services, Docker-published ports skip straight past it.
This commit is contained in:
2 files changed
+6
No files matched your search
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Do not edit this file with editors other than draw.io -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="822px" height="705px" viewBox="0 0 822 705" id="ge-svg-45Po1F0wK5Lgy7woHj7E" content="<mxfile host="embed.diagrams.net" scale="1" border="0"> <diagram name="Docker Firewalld Bypass" id="docker-bypass-1"> <mxGraphModel dx="1178" dy="659" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="700" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="traffic" parent="1" style="shape=cloud;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=#666666;fontColor=#333333;fontSize=14;fontStyle=1;shadow=1;" value="Incoming Traffic" vertex="1"> <mxGeometry height="90" width="200" x="440" y="30" as="geometry" /> </mxCell> <mxCell id="pfsense" parent="1" style="shape=mxgraph.basic.shield;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;fontSize=14;fontStyle=1;shadow=1;" value="pfSense&lt;br&gt;&lt;font style=&quot;font-size:11px&quot;&gt;Layer 1 — always applies&lt;/font&gt;" vertex="1"> <mxGeometry height="120" width="120" x="480" y="170" as="geometry" /> </mxCell> <mxCell id="bgfill_host" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=none;" vertex="1"> <mxGeometry height="300" width="820" x="140" y="360" as="geometry" /> </mxCell> <mxCell id="host" parent="1" style="swimlane;whiteSpace=wrap;html=1;startSize=30;fillColor=none;strokeColor=#666666;dashed=1;fontSize=12;fontStyle=1;fontColor=#333333;align=left;spacingLeft=8;verticalAlign=middle;" value="TARGET HOST — everything below this line is decided by what&#39;s running on it" vertex="1"> <mxGeometry height="300" width="820" x="140" y="360" as="geometry" /> </mxCell> <mxCell id="firewalld" parent="host" style="shape=mxgraph.basic.shield;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#333333;fontSize=13;fontStyle=1;shadow=1;" value="firewalld&lt;br&gt;&lt;font style=&quot;font-size:11px&quot;&gt;Layer 2 — native services only&lt;/font&gt;" vertex="1"> <mxGeometry height="110" width="110" x="80" y="70" as="geometry" /> </mxCell> <mxCell id="native" parent="host" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#333333;fontSize=13;fontStyle=1;shadow=1;" value="Native Service&lt;br&gt;&lt;font style=&quot;font-size:11px&quot;&gt;e.g. Alloy, Wazuh agent&lt;/font&gt;" vertex="1"> <mxGeometry height="65" width="190" x="40" y="210" as="geometry" /> </mxCell> <mxCell id="docker" parent="host" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333;fontSize=13;fontStyle=1;shadow=1;" value="Docker-published port&lt;br&gt;&lt;font style=&quot;font-size:11px&quot;&gt;dozens of containerized apps&lt;/font&gt;" vertex="1"> <mxGeometry height="65" width="220" x="550" y="210" as="geometry" /> </mxCell> <mxCell id="e3" edge="1" parent="host" source="firewalld" style="html=1;endArrow=block;strokeColor=#6c8ebf;strokeWidth=2;rounded=1;" target="native"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="e1" edge="1" parent="1" soLine truncated
|
||||||
|
After Width: | Height: | Size: 386 KiB |
@@ -62,6 +62,8 @@ rule family="ipv4" source address="[automation host]" port port="[this host's SS
|
|||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> **A real, documented gap**: on Docker hosts, container-published ports bypass firewalld entirely — Docker's own iptables rules are evaluated before firewalld's zone rules, so firewalld's local restrictions only actually protect the small number of *native*, non-containerized services on that host (things like the observability agent from [`docs/observability.md`](observability.md)), not the dozens of containerized apps in [`stacks/`](../stacks/). The network-level segmentation above still applies regardless — pfSense doesn't care whether a port is opened by firewalld or by Docker's own NAT rules — so this is a defense-in-depth gap specifically at the host layer, not an open-to-the-world one. Worth naming precisely rather than glossing over: firewalld protects less of a Docker host's actual attack surface than it might first appear to.
|
> **A real, documented gap**: on Docker hosts, container-published ports bypass firewalld entirely — Docker's own iptables rules are evaluated before firewalld's zone rules, so firewalld's local restrictions only actually protect the small number of *native*, non-containerized services on that host (things like the observability agent from [`docs/observability.md`](observability.md)), not the dozens of containerized apps in [`stacks/`](../stacks/). The network-level segmentation above still applies regardless — pfSense doesn't care whether a port is opened by firewalld or by Docker's own NAT rules — so this is a defense-in-depth gap specifically at the host layer, not an open-to-the-world one. Worth naming precisely rather than glossing over: firewalld protects less of a Docker host's actual attack surface than it might first appear to.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Edge firewall: three jobs, one device
|
## Edge firewall: three jobs, one device
|
||||||
|
|
||||||
One device, three distinct responsibilities, not three separate boxes:
|
One device, three distinct responsibilities, not three separate boxes:
|
||||||
|
|||||||
Reference in new issue
Block a user