قواعد Nftables لتقوية تثبيت Discourse

شكرًا لك @OrkoGrayskull!

هل هناك أي تحديثات حول هذا الآن بعد أن يمكن أن يحتوي /etc/docker/daemon.json على firewall-backend مضبوطًا على nftables، وأفترض أنك الآن تستخدم Debian Trixie أو Bookworm - أنا أجرب هذا…

لقد وجدت أنه في /etc/sysctl.conf من الضروري تعيين net.ipv4.ip_forward=1.
لدى وثائق Docker مع nftables:

لا تقم بتعديل جداول Docker مباشرة لأن التعديلات من المحتمل أن تُفقد، يتوقع Docker أن يكون لديه ملكية كاملة لجداولته.

لذا آمل ألا أضطر إلى المساس بقواعد Docker…

هذا ما لدي حاليًا، بعض القواعد التي أضفتها عبر Ansible (يحتوي هذا الخادم على إعادة توجيه Postfix SMTP إلى Discourse، ولهذا السبب المنفذ 25 ضروري):

table inet ansible_firewall {
        chain inbound_ipv4 {
                icmp type echo-request limit rate 5/second accept comment "قبول طلبات ping ICMP ذات معدل محدود"
        }

        chain inbound_ipv6 {
                icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept comment "قبول اكتشاف الجوار لـ IPv6"
                icmpv6 type echo-request limit rate 5/second accept comment "قبول طلبات ping ICMP لـ IPv6 ذات معدل محدود"
        }

        chain inbound {
                type filter hook input priority filter; policy drop;
                ct state vmap { invalid : drop, established : accept, related : accept } comment "السماح بحركة المرور من الحزم المتصلة والذات الصلة، إسقاط غير الصالح"
                iifname "lo" accept comment "السماح بحركة المرور من واجهة العودية"
                meta protocol vmap { ip : jump inbound_ipv4, ip6 : jump inbound_ipv6 } comment "الانتقال إلى السلسلة وفقًا لبروتوكول الطبقة 3 باستخدام خريطة قرار"
                tcp dport 22 accept comment "السماح بـ SSH على المنفذ TCP/22"
                tcp dport { 80, 443 } accept comment "السماح بـ HTTP على المنفذ TCP/80 و HTTPS على المنفذ 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 "السماح بالخروج من واجهة العودية"
        }
}

والقواعد من Docker / Discourse (لاحظ أن هذا الخادم ليس لديه عنوان 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;
        }
}

وكل شيء باستثناء المنفذين 80 و 443 يعمل بشكل جيد… :roll_eyes: