I am working to script that should generate a Firewall Diagram - the script generates a .dot file which is used to generate the .png
dot -Tpng input.dot -o output.png
At the moment the script does not investigate the chain relations (i.e. it does not follow the β-jβ/jump directives). Therefore the diagram includes only the Chains with a Policy attached and their children chains.
It is possible to add arrows/links to reflect the dependencies but the amount of arrows will make the diagram hard to be read.
Any suggestion on additional layers (information) to be added (the script will generate the input.dot file automatically)
Current result:
digraph UnifiedFW { rankdir=TB; node [shape=rect, style=filled, fillcolor=white];
graph [compound=true, ranksep=1.0, nodesep=0.5];
subgraph "cluster_table_raw" { label="TABLE: raw"; style=filled; fillcolor=ivory; color=blue; penwidth=2;
subgraph "cluster_raw_PREROUTING" { label="PREROUTING"; style=filled; fillcolor=lightgrey;
"raw_PREROUTING_SYN_FLOOD_PROTECT" [label="SYN_FLOOD_PROTECT", fillcolor=white];
}
subgraph "cluster_raw_OUTPUT" { label="OUTPUT"; style=filled; fillcolor=lightgrey;
"anchor_raw_OUTPUT" [label="", style=invis, width=0, height=0];
}
}
subgraph "cluster_table_mangle" { label="TABLE: mangle"; style=filled; fillcolor=ivory; color=blue; penwidth=2;
subgraph "cluster_mangle_PREROUTING" { label="PREROUTING"; style=filled; fillcolor=lightgrey;
"mangle_PREROUTING_CONNMARK" [label="CONNMARK", fillcolor=white];
"mangle_PREROUTING_NAT_DESTINATION" [label="NAT_DESTINATION", fillcolor=white];
"mangle_PREROUTING_CONNMARK" -> "mangle_PREROUTING_NAT_DESTINATION" [color=blue, weight=10];
}
subgraph "cluster_mangle_INPUT" { label="INPUT"; style=filled; fillcolor=lightgrey;
"mangle_INPUT_IPS_SCAN_IN" [label="IPS_SCAN_IN", fillcolor=white];
"mangle_INPUT_IPS" [label="IPS", fillcolor=white];
"mangle_INPUT_IPS_SCAN_IN" -> "mangle_INPUT_IPS" [color=blue, weight=10];
"mangle_INPUT_IPS_CLEAR" [label="IPS_CLEAR", fillcolor=white];
"mangle_INPUT_IPS" -> "mangle_INPUT_IPS_CLEAR" [color=blue, weight=10];
}
subgraph "cluster_mangle_FORWARD" { label="FORWARD"; style=filled; fillcolor=lightgrey;
"mangle_FORWARD_IPS_SCAN_IN" [label="IPS_SCAN_IN", fillcolor=white];
"mangle_FORWARD_IPS_SCAN_OUT" [label="IPS_SCAN_OUT", fillcolor=white];
"mangle_FORWARD_IPS_SCAN_IN" -> "mangle_FORWARD_IPS_SCAN_OUT" [color=blue, weight=10];
"mangle_FORWARD_IPS" [label="IPS", fillcolor=white];
"mangle_FORWARD_IPS_SCAN_OUT" -> "mangle_FORWARD_IPS" [color=blue, weight=10];
"mangle_FORWARD_IPS_CLEAR" [label="IPS_CLEAR", fillcolor=white];
"mangle_FORWARD_IPS" -> "mangle_FORWARD_IPS_CLEAR" [color=blue, weight=10];
}
subgraph "cluster_mangle_OUTPUT" { label="OUTPUT"; style=filled; fillcolor=lightgrey;
"mangle_OUTPUT_IPS_SCAN_OUT" [label="IPS_SCAN_OUT", fillcolor=white];
"mangle_OUTPUT_IPS" [label="IPS", fillcolor=white];
"mangle_OUTPUT_IPS_SCAN_OUT" -> "mangle_OUTPUT_IPS" [color=blue, weight=10];
"mangle_OUTPUT_IPS_CLEAR" [label="IPS_CLEAR", fillcolor=white];
"mangle_OUTPUT_IPS" -> "mangle_OUTPUT_IPS_CLEAR" [color=blue, weight=10];
}
subgraph "cluster_mangle_POSTROUTING" { label="POSTROUTING"; style=filled; fillcolor=lightgrey;
"anchor_mangle_POSTROUTING" [label="", style=invis, width=0, height=0];
}
}
subgraph "cluster_table_nat" { label="TABLE: nat"; style=filled; fillcolor=ivory; color=blue; penwidth=2;
subgraph "cluster_nat_PREROUTING" { label="PREROUTING"; style=filled; fillcolor=lightgrey;
"nat_PREROUTING_CUSTOMPREROUTING" [label="CUSTOMPREROUTING", fillcolor=white];
"nat_PREROUTING_CAPTIVE_PORTAL" [label="CAPTIVE_PORTAL", fillcolor=white];
"nat_PREROUTING_CUSTOMPREROUTING" -> "nat_PREROUTING_CAPTIVE_PORTAL" [color=blue, weight=10];
"nat_PREROUTING_SQUID" [label="SQUID", fillcolor=white];
"nat_PREROUTING_CAPTIVE_PORTAL" -> "nat_PREROUTING_SQUID" [color=blue, weight=10];
"nat_PREROUTING_NAT_DESTINATION" [label="NAT_DESTINATION", fillcolor=white];
"nat_PREROUTING_SQUID" -> "nat_PREROUTING_NAT_DESTINATION" [color=blue, weight=10];
}
subgraph "cluster_nat_INPUT" { label="INPUT"; style=filled; fillcolor=lightgrey;
"anchor_nat_INPUT" [label="", style=invis, width=0, height=0];
}
subgraph "cluster_nat_OUTPUT" { label="OUTPUT"; style=filled; fillcolor=lightgrey;
"nat_OUTPUT_NAT_DESTINATION" [label="NAT_DESTINATION", fillcolor=white];
}
subgraph "cluster_nat_POSTROUTING" { label="POSTROUTING"; style=filled; fillcolor=lightgrey;
"nat_POSTROUTING_CUSTOMPOSTROUTING" [label="CUSTOMPOSTROUTING", fillcolor=white];
"nat_POSTROUTING_WGNAT" [label="WGNAT", fillcolor=white];
"nat_POSTROUTING_CUSTOMPOSTROUTING" -> "nat_POSTROUTING_WGNAT" [color=blue, weight=10];
"nat_POSTROUTING_OVPNNAT" [label="OVPNNAT", fillcolor=white];
"nat_POSTROUTING_WGNAT" -> "nat_POSTROUTING_OVPNNAT" [color=blue, weight=10];
"nat_POSTROUTING_IPSECNAT" [label="IPSECNAT", fillcolor=white];
"nat_POSTROUTING_OVPNNAT" -> "nat_POSTROUTING_IPSECNAT" [color=blue, weight=10];
"nat_POSTROUTING_NAT_SOURCE" [label="NAT_SOURCE", fillcolor=white];
"nat_POSTROUTING_IPSECNAT" -> "nat_POSTROUTING_NAT_SOURCE" [color=blue, weight=10];
"nat_POSTROUTING_NAT_DESTINATION_FIX" [label="NAT_DESTINATION_FIX", fillcolor=white];
"nat_POSTROUTING_NAT_SOURCE" -> "nat_POSTROUTING_NAT_DESTINATION_FIX" [color=blue, weight=10];
"nat_POSTROUTING_REDNAT" [label="REDNAT", fillcolor=white];
"nat_POSTROUTING_NAT_DESTINATION_FIX" -> "nat_POSTROUTING_REDNAT" [color=blue, weight=10];
}
}
subgraph "cluster_table_filter" { label="TABLE: filter"; style=filled; fillcolor=ivory; color=blue; penwidth=2;
subgraph "cluster_filter_INPUT" { label="INPUT"; style=filled; fillcolor=lightgrey;
"filter_INPUT_BADTCP" [label="BADTCP", fillcolor=white];
"filter_INPUT_CUSTOMINPUT" [label="CUSTOMINPUT", fillcolor=white];
"filter_INPUT_BADTCP" -> "filter_INPUT_CUSTOMINPUT" [color=blue, weight=10];
"filter_INPUT_HOSTILE" [label="HOSTILE", fillcolor=white];
"filter_INPUT_CUSTOMINPUT" -> "filter_INPUT_HOSTILE" [color=blue, weight=10];
"filter_INPUT_BLOCKLISTIN" [label="BLOCKLISTIN", fillcolor=white];
"filter_INPUT_HOSTILE" -> "filter_INPUT_BLOCKLISTIN" [color=blue, weight=10];
"filter_INPUT_GUARDIAN" [label="GUARDIAN", fillcolor=white];
"filter_INPUT_BLOCKLISTIN" -> "filter_INPUT_GUARDIAN" [color=blue, weight=10];
"filter_INPUT_WGBLOCK" [label="WGBLOCK", fillcolor=white];
"filter_INPUT_GUARDIAN" -> "filter_INPUT_WGBLOCK" [color=blue, weight=10];
"filter_INPUT_OVPNBLOCK" [label="OVPNBLOCK", fillcolor=white];
"filter_INPUT_WGBLOCK" -> "filter_INPUT_OVPNBLOCK" [color=blue, weight=10];
"filter_INPUT_IPTVINPUT" [label="IPTVINPUT", fillcolor=white];
"filter_INPUT_OVPNBLOCK" -> "filter_INPUT_IPTVINPUT" [color=blue, weight=10];
"filter_INPUT_ICMPINPUT" [label="ICMPINPUT", fillcolor=white];
"filter_INPUT_IPTVINPUT" -> "filter_INPUT_ICMPINPUT" [color=blue, weight=10];
"filter_INPUT_LOOPBACK" [label="LOOPBACK", fillcolor=white];
"filter_INPUT_ICMPINPUT" -> "filter_INPUT_LOOPBACK" [color=blue, weight=10];
"filter_INPUT_CAPTIVE_PORTAL" [label="CAPTIVE_PORTAL", fillcolor=white];
"filter_INPUT_LOOPBACK" -> "filter_INPUT_CAPTIVE_PORTAL" [color=blue, weight=10];
"filter_INPUT_CTINPUT" [label="CTINPUT", fillcolor=white];
"filter_INPUT_CAPTIVE_PORTAL" -> "filter_INPUT_CTINPUT" [color=blue, weight=10];
"filter_INPUT_DHCPGREENINPUT" [label="DHCPGREENINPUT", fillcolor=white];
"filter_INPUT_CTINPUT" -> "filter_INPUT_DHCPGREENINPUT" [color=blue, weight=10];
"filter_INPUT_DHCPBLUEINPUT" [label="DHCPBLUEINPUT", fillcolor=white];
"filter_INPUT_DHCPGREENINPUT" -> "filter_INPUT_DHCPBLUEINPUT" [color=blue, weight=10];
"filter_INPUT_TOR_INPUT" [label="TOR_INPUT", fillcolor=white];
"filter_INPUT_DHCPBLUEINPUT" -> "filter_INPUT_TOR_INPUT" [color=blue, weight=10];
"filter_INPUT_LOCATIONBLOCK" [label="LOCATIONBLOCK", fillcolor=white];
"filter_INPUT_TOR_INPUT" -> "filter_INPUT_LOCATIONBLOCK" [color=blue, weight=10];
"filter_INPUT_IPSECINPUT" [label="IPSECINPUT", fillcolor=white];
"filter_INPUT_LOCATIONBLOCK" -> "filter_INPUT_IPSECINPUT" [color=blue, weight=10];
"filter_INPUT_GUIINPUT" [label="GUIINPUT", fillcolor=white];
"filter_INPUT_IPSECINPUT" -> "filter_INPUT_GUIINPUT" [color=blue, weight=10];
"filter_INPUT_WIRELESSINPUT" [label="WIRELESSINPUT", fillcolor=white];
"filter_INPUT_GUIINPUT" -> "filter_INPUT_WIRELESSINPUT" [color=blue, weight=10];
"filter_INPUT_WGINPUT" [label="WGINPUT", fillcolor=white];
"filter_INPUT_WIRELESSINPUT" -> "filter_INPUT_WGINPUT" [color=blue, weight=10];
"filter_INPUT_OVPNINPUTRW" [label="OVPNINPUTRW", fillcolor=white];
"filter_INPUT_WGINPUT" -> "filter_INPUT_OVPNINPUTRW" [color=blue, weight=10];
"filter_INPUT_OVPNINPUTN2N" [label="OVPNINPUTN2N", fillcolor=white];
"filter_INPUT_OVPNINPUTRW" -> "filter_INPUT_OVPNINPUTN2N" [color=blue, weight=10];
"filter_INPUT_INPUTFW" [label="INPUTFW", fillcolor=white];
"filter_INPUT_OVPNINPUTN2N" -> "filter_INPUT_INPUTFW" [color=blue, weight=10];
"filter_INPUT_REDINPUT" [label="REDINPUT", fillcolor=white];
"filter_INPUT_INPUTFW" -> "filter_INPUT_REDINPUT" [color=blue, weight=10];
"filter_INPUT_POLICYIN" [label="POLICYIN", fillcolor=white];
"filter_INPUT_REDINPUT" -> "filter_INPUT_POLICYIN" [color=blue, weight=10];
}
subgraph "cluster_filter_FORWARD" { label="FORWARD"; style=filled; fillcolor=lightgrey;
"filter_FORWARD_BADTCP" [label="BADTCP", fillcolor=white];
"filter_FORWARD_TCPMSS" [label="TCPMSS", fillcolor=white];
"filter_FORWARD_BADTCP" -> "filter_FORWARD_TCPMSS" [color=blue, weight=10];
"filter_FORWARD_CUSTOMFORWARD" [label="CUSTOMFORWARD", fillcolor=white];
"filter_FORWARD_TCPMSS" -> "filter_FORWARD_CUSTOMFORWARD" [color=blue, weight=10];
"filter_FORWARD_HOSTILE" [label="HOSTILE", fillcolor=white];
"filter_FORWARD_CUSTOMFORWARD" -> "filter_FORWARD_HOSTILE" [color=blue, weight=10];
"filter_FORWARD_BLOCKLISTIN" [label="BLOCKLISTIN", fillcolor=white];
"filter_FORWARD_HOSTILE" -> "filter_FORWARD_BLOCKLISTIN" [color=blue, weight=10];
"filter_FORWARD_BLOCKLISTOUT" [label="BLOCKLISTOUT", fillcolor=white];
"filter_FORWARD_BLOCKLISTIN" -> "filter_FORWARD_BLOCKLISTOUT" [color=blue, weight=10];
"filter_FORWARD_GUARDIAN" [label="GUARDIAN", fillcolor=white];
"filter_FORWARD_BLOCKLISTOUT" -> "filter_FORWARD_GUARDIAN" [color=blue, weight=10];
"filter_FORWARD_IPSECBLOCK" [label="IPSECBLOCK", fillcolor=white];
"filter_FORWARD_GUARDIAN" -> "filter_FORWARD_IPSECBLOCK" [color=blue, weight=10];
"filter_FORWARD_WGBLOCK" [label="WGBLOCK", fillcolor=white];
"filter_FORWARD_IPSECBLOCK" -> "filter_FORWARD_WGBLOCK" [color=blue, weight=10];
"filter_FORWARD_OVPNBLOCK" [label="OVPNBLOCK", fillcolor=white];
"filter_FORWARD_WGBLOCK" -> "filter_FORWARD_OVPNBLOCK" [color=blue, weight=10];
"filter_FORWARD_IPTVFORWARD" [label="IPTVFORWARD", fillcolor=white];
"filter_FORWARD_OVPNBLOCK" -> "filter_FORWARD_IPTVFORWARD" [color=blue, weight=10];
"filter_FORWARD_LOOPBACK" [label="LOOPBACK", fillcolor=white];
"filter_FORWARD_IPTVFORWARD" -> "filter_FORWARD_LOOPBACK" [color=blue, weight=10];
"filter_FORWARD_CAPTIVE_PORTAL" [label="CAPTIVE_PORTAL", fillcolor=white];
"filter_FORWARD_LOOPBACK" -> "filter_FORWARD_CAPTIVE_PORTAL" [color=blue, weight=10];
"filter_FORWARD_CTINPUT" [label="CTINPUT", fillcolor=white];
"filter_FORWARD_CAPTIVE_PORTAL" -> "filter_FORWARD_CTINPUT" [color=blue, weight=10];
"filter_FORWARD_LOCATIONBLOCK" [label="LOCATIONBLOCK", fillcolor=white];
"filter_FORWARD_CTINPUT" -> "filter_FORWARD_LOCATIONBLOCK" [color=blue, weight=10];
"filter_FORWARD_IPSECFORWARD" [label="IPSECFORWARD", fillcolor=white];
"filter_FORWARD_LOCATIONBLOCK" -> "filter_FORWARD_IPSECFORWARD" [color=blue, weight=10];
"filter_FORWARD_WIRELESSFORWARD" [label="WIRELESSFORWARD", fillcolor=white];
"filter_FORWARD_IPSECFORWARD" -> "filter_FORWARD_WIRELESSFORWARD" [color=blue, weight=10];
"filter_FORWARD_FORWARDFW" [label="FORWARDFW", fillcolor=white];
"filter_FORWARD_WIRELESSFORWARD" -> "filter_FORWARD_FORWARDFW" [color=blue, weight=10];
"filter_FORWARD_REDFORWARD" [label="REDFORWARD", fillcolor=white];
"filter_FORWARD_FORWARDFW" -> "filter_FORWARD_REDFORWARD" [color=blue, weight=10];
"filter_FORWARD_POLICYFWD" [label="POLICYFWD", fillcolor=white];
"filter_FORWARD_REDFORWARD" -> "filter_FORWARD_POLICYFWD" [color=blue, weight=10];
}
subgraph "cluster_filter_OUTPUT" { label="OUTPUT"; style=filled; fillcolor=lightgrey;
"filter_OUTPUT_CUSTOMOUTPUT" [label="CUSTOMOUTPUT", fillcolor=white];
"filter_OUTPUT_HOSTILE" [label="HOSTILE", fillcolor=white];
"filter_OUTPUT_CUSTOMOUTPUT" -> "filter_OUTPUT_HOSTILE" [color=blue, weight=10];
"filter_OUTPUT_BLOCKLISTOUT" [label="BLOCKLISTOUT", fillcolor=white];
"filter_OUTPUT_HOSTILE" -> "filter_OUTPUT_BLOCKLISTOUT" [color=blue, weight=10];
"filter_OUTPUT_IPSECBLOCK" [label="IPSECBLOCK", fillcolor=white];
"filter_OUTPUT_BLOCKLISTOUT" -> "filter_OUTPUT_IPSECBLOCK" [color=blue, weight=10];
"filter_OUTPUT_LOOPBACK" [label="LOOPBACK", fillcolor=white];
"filter_OUTPUT_IPSECBLOCK" -> "filter_OUTPUT_LOOPBACK" [color=blue, weight=10];
"filter_OUTPUT_CTOUTPUT" [label="CTOUTPUT", fillcolor=white];
"filter_OUTPUT_LOOPBACK" -> "filter_OUTPUT_CTOUTPUT" [color=blue, weight=10];
"filter_OUTPUT_DHCPGREENOUTPUT" [label="DHCPGREENOUTPUT", fillcolor=white];
"filter_OUTPUT_CTOUTPUT" -> "filter_OUTPUT_DHCPGREENOUTPUT" [color=blue, weight=10];
"filter_OUTPUT_DHCPBLUEOUTPUT" [label="DHCPBLUEOUTPUT", fillcolor=white];
"filter_OUTPUT_DHCPGREENOUTPUT" -> "filter_OUTPUT_DHCPBLUEOUTPUT" [color=blue, weight=10];
"filter_OUTPUT_IPSECOUTPUT" [label="IPSECOUTPUT", fillcolor=white];
"filter_OUTPUT_DHCPBLUEOUTPUT" -> "filter_OUTPUT_IPSECOUTPUT" [color=blue, weight=10];
"filter_OUTPUT_TOR_OUTPUT" [label="TOR_OUTPUT", fillcolor=white];
"filter_OUTPUT_IPSECOUTPUT" -> "filter_OUTPUT_TOR_OUTPUT" [color=blue, weight=10];
"filter_OUTPUT_OUTGOINGFW" [label="OUTGOINGFW", fillcolor=white];
"filter_OUTPUT_TOR_OUTPUT" -> "filter_OUTPUT_OUTGOINGFW" [color=blue, weight=10];
"filter_OUTPUT_POLICYOUT" [label="POLICYOUT", fillcolor=white];
"filter_OUTPUT_OUTGOINGFW" -> "filter_OUTPUT_POLICYOUT" [color=blue, weight=10];
}
}
subgraph "cluster_table_security" { label="TABLE: security"; style=filled; fillcolor=ivory; color=blue; penwidth=2;
subgraph "cluster_security_INPUT" { label="INPUT"; style=filled; fillcolor=lightgrey;
"anchor_security_INPUT" [label="", style=invis, width=0, height=0];
}
subgraph "cluster_security_FORWARD" { label="FORWARD"; style=filled; fillcolor=lightgrey;
"anchor_security_FORWARD" [label="", style=invis, width=0, height=0];
}
subgraph "cluster_security_OUTPUT" { label="OUTPUT"; style=filled; fillcolor=lightgrey;
"anchor_security_OUTPUT" [label="", style=invis, width=0, height=0];
}
}
}
