Skip to content

Instantly share code, notes, and snippets.

@jglien
Last active April 23, 2024 21:01
Show Gist options
  • Save jglien/cb6f14ce19edecdec4bd732e310a7948 to your computer and use it in GitHub Desktop.
Save jglien/cb6f14ce19edecdec4bd732e310a7948 to your computer and use it in GitHub Desktop.
A minimal, secure iptables rule list allowing SSH and http(s) to Docker
# Generated by iptables-save v1.8.10 on Tue Apr 23 14:57:55 2024
*filter
:INPUT DROP [28216:5015938]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [294460:212080236]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-c2ab3973c136 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-c2ab3973c136 -j DOCKER
-A FORWARD -i br-c2ab3973c136 ! -o br-c2ab3973c136 -j ACCEPT
-A FORWARD -i br-c2ab3973c136 -o br-c2ab3973c136 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-c2ab3973c136 ! -o br-c2ab3973c136 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-c2ab3973c136 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -p tcp -m tcp --dport 443 -j ACCEPT
-A DOCKER-USER -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER-USER -j DROP
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Tue Apr 23 14:57:55 2024
# Generated by iptables-save v1.8.10 on Tue Apr 23 14:57:55 2024
*nat
:PREROUTING ACCEPT [29740:5103699]
:INPUT ACCEPT [1537:86576]
:OUTPUT ACCEPT [2804:195130]
:POSTROUTING ACCEPT [2806:195210]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.20.0.0/16 ! -o br-c2ab3973c136 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-c2ab3973c136 -j RETURN
@jglien
Copy link
Author

jglien commented Apr 19, 2024

The non-default lines are

...
:INPUT DROP [10128:1623983]
:FORWARD DROP [0:0]
...
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
...
-A DOCKER-USER -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -p tcp -m tcp --dport 443 -j ACCEPT
-A DOCKER-USER -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER-USER -j DROP
...

It's important that -A DOCKER-USER -j DROP is last.

See Arch Linux wiki for more details.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment