Merci @OrkoGrayskull !
Y a-t-il des mises à jour à ce sujet maintenant que /etc/docker/daemon.json peut avoir firewall-backend défini sur nftables et je suppose que vous utilisez maintenant Debian Trixie ou Bookworm — je fais des expériences avec ceci…
J’ai découvert que dans /etc/sysctl.conf il est nécessaire de définir net.ipv4.ip_forward=1.
La documentation Docker avec nftables indique :
Ne modifiez pas directement les tables de Docker, car les modifications seront probablement perdues ; Docker s’attend à avoir la pleine propriété de ses tables.
Donc j’espère ne pas toucher aux règles Docker…
Voici ce que j’ai actuellement, quelques règles que j’ai ajoutées via Ansible (ce serveur transmet le SMTP de Postfix vers Discourse, c’est pourquoi le port 25 est nécessaire) :
table inet ansible_firewall {
chain inbound_ipv4 {
icmp type echo-request limit rate 5/second accept comment "Accepter les pings ICMP IPv4 limités en débit"
}
chain inbound_ipv6 {
icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept comment "Accepter la découverte de voisin IPv6"
icmpv6 type echo-request limit rate 5/second accept comment "Accepter les pings ICMP IPv6 limités en débit"
}
chain inbound {
type filter hook input priority filter; policy drop;
ct state vmap { invalid : drop, established : accept, related : accept } comment "Autoriser le trafic des paquets établis et liés, abandonner les paquets invalides"
iifname "lo" accept comment "Autoriser le trafic de la boucle locale"
meta protocol vmap { ip : jump inbound_ipv4, ip6 : jump inbound_ipv6 } comment "Sauter vers la chaîne selon le protocole de couche 3 en utilisant une carte de verdict"
tcp dport 22 accept comment "Autoriser SSH sur le port TCP/22"
tcp dport { 80, 443 } accept comment "Autoriser HTTP sur le port TCP/80 et HTTPS sur le port TCP/443"
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
oifname "lo" accept comment "Autoriser les sorties depuis l'interface de boucle locale"
}
}
Et les règles de Docker / Discourse (notez que ce serveur n’a pas d’adresse IPv6) :
table ip docker-bridges {
map filter-forward-in-jumps {
type ifname : verdict
elements = { "docker0" : jump filter-forward-in__docker0 }
}
map filter-forward-out-jumps {
type ifname : verdict
elements = { "docker0" : jump filter-forward-out__docker0 }
}
map nat-postrouting-in-jumps {
type ifname : verdict
elements = { "docker0" : jump nat-postrouting-in__docker0 }
}
map nat-postrouting-out-jumps {
type ifname : verdict
elements = { "docker0" : jump nat-postrouting-out__docker0 }
}
chain filter-FORWARD {
type filter hook forward priority filter; policy accept;
oifname vmap @filter-forward-in-jumps
iifname vmap @filter-forward-out-jumps
}
chain nat-OUTPUT {
type nat hook output priority -100; policy accept;
ip daddr != 127.0.0.0/8 fib daddr type local counter jump nat-prerouting-and-output
}
chain nat-POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
iifname vmap @nat-postrouting-out-jumps
oifname vmap @nat-postrouting-in-jumps
}
chain nat-PREROUTING {
type nat hook prerouting priority dstnat; policy accept;
fib daddr type local counter jump nat-prerouting-and-output
}
chain nat-prerouting-and-output {
iifname != "docker0" tcp dport 80 counter dnat to 172.17.0.2:80 comment "DNAT"
iifname != "docker0" tcp dport 443 counter dnat to 172.17.0.2:443 comment "DNAT"
}
chain raw-PREROUTING {
type filter hook prerouting priority raw; policy accept;
ip daddr 172.17.0.2 iifname != "docker0" counter drop comment "DROP DIRECT ACCESS"
}
chain filter-forward-in__docker0 {
ct state established,related counter accept
iifname "docker0" counter accept comment "ICC"
ip daddr 172.17.0.2 tcp dport 80 counter accept
ip daddr 172.17.0.2 tcp dport 443 counter accept
counter drop comment "UNPUBLISHED PORT DROP"
}
chain filter-forward-out__docker0 {
ct state established,related counter accept
counter accept comment "OUTGOING"
}
chain nat-postrouting-in__docker0 {
}
chain nat-postrouting-out__docker0 {
oifname != "docker0" ip saddr 172.17.0.0/16 counter masquerade comment "MASQUERADE"
}
}
table ip6 docker-bridges {
map filter-forward-in-jumps {
type ifname : verdict
}
map filter-forward-out-jumps {
type ifname : verdict
}
map nat-postrouting-in-jumps {
type ifname : verdict
}
map nat-postrouting-out-jumps {
type ifname : verdict
}
chain filter-FORWARD {
type filter hook forward priority filter; policy accept;
oifname vmap @filter-forward-in-jumps
iifname vmap @filter-forward-out-jumps
}
chain nat-OUTPUT {
type nat hook output priority -100; policy accept;
ip6 daddr != ::1 fib daddr type local counter jump nat-prerouting-and-output
}
chain nat-POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
iifname vmap @nat-postrouting-out-jumps
oifname vmap @nat-postrouting-in-jumps
}
chain nat-PREROUTING {
type nat hook prerouting priority dstnat; policy accept;
fib daddr type local counter jump nat-prerouting-and-output
}
chain nat-prerouting-and-output {
}
chain raw-PREROUTING {
type filter hook prerouting priority raw; policy accept;
}
}
Et tout, sauf les ports 80 et 443, semble fonctionner… ![]()