Debian

nftables (nft) 鏈優先級問題

  • January 21, 2022

nft讓我頭疼不已,無論我如何調整政策,我仍然無法讓它發揮作用。

我想到的概念:

  • 一個存在通用規則的“基礎”鏈(例如允許ssh等)
  • 一個或多個特定於守護程序特定規則所在的應用程序(例如 http 伺服器鏈)

我嘗試了許多不同的規則排列,但我永遠無法同時獲得“基礎”+ 守護程序流量,我總是最終阻止其中一個!;-(

這是我目前的(簡化的)配置(目前構成它允許ssh但不允許http

/etc/nftables.conf:

#!/usr/sbin/nft -f                                                                                                                                                                                                                                              
flush ruleset                                                                                                                       
table inet filter {   
    counter input_ssh {}     
       set my_admin_ipv4 {                                                                                                        
               type ipv4_addr                                                                                                      
               flags interval                                                                                                      
               counter                                                                                                             
               elements = {                                                                                                        
                       10.0.0.0/8,                                                                                                 
                       172.16.0.0/12,                                                                                              
                       192.168.0.0/16                                                                                                                                                                                      
               }                                                                                                                   
       }         
      chain input {
               type filter hook input priority filter;
               iifname lo accept comment "Allow loopback traffic";
               ct state established,related accept comment "Allow established/related connections";
               ct state invalid drop comment "Deny invalid connections";

               # SSH
               tcp dport ssh ip saddr @my_admin_ipv4 counter name input_ssh accept comment "Allow IPv4 SSH from Admin";
   policy drop;
       }
       chain forward {
               type filter hook forward priority 0;
               policy drop;
       }
       chain output {
               type filter hook output priority 0;
       }
include "/etc/nft/*.conf"
}

/etc/nft/http.conf:

counter input_http {} 
  chain http {
   type filter hook input priority filter - 1;
     # HTTP #
     tcp dport {80,443} counter name input_nginx accept comment "Allow HTTP";
   policy accept; 
   }

您可以選擇在同一鉤子的後續鏈中將數據包標記為安全行為。

  • 每個接受規則都應該標記數據包

執行顯式接受的規則應在接受之前標記數據包。任何發生:

... accept

應替換為:

... meta mark set 0xf00 accept

如果標記沒有其他角色,則該值不重要,只要它不為 0。

  • 每個鏈都應該接受一個標記的數據包,因為這是安全的行為

通過在鏈的早期使用此規則:

meta mark != 0 accept

這是一般的想法。如果更有意義,仍然可以進行調整和例外。

這是遵循這種方法的重新審視的規則集。該標記在ct ... invalid drop規則之後被接受,這是一條不應被繞過的重要規則(實際上本可以在較早的鏈中一勞永逸地完成,因為它是一個丟棄規則)。如果在下面,輸入是過濾器/輸入鉤子中的最後一個鏈,它實際上並不需要標記已接受的數據包,但這樣做並沒有什麼壞處。

/etc/nftables.conf::

flush ruleset 
table inet filter {   
   counter input_ssh {}     
   set my_admin_ipv4 {                                                                                                        
       type ipv4_addr                                                                                                      
       flags interval                                                                                                      
       counter                                                                                                             
       elements = {                                                                                                        
           10.0.0.0/8,                                                                                                 
           172.16.0.0/12,                                                                                              
           192.168.0.0/16                                                                                                                                                                                      
       }                                                                                                                   
   }         
   chain input {
       type filter hook input priority filter; policy drop;
       iifname lo meta mark set 0x1 accept comment "Allow loopback traffic";
       ct state established,related meta mark set 0x1 accept comment "Allow established/related connections";
       ct state invalid drop comment "Deny invalid connections";
       meta mark != 0 accept

       # SSH
       tcp dport ssh ip saddr @my_admin_ipv4 counter name input_ssh meta mark set 0x1 accept comment "Allow IPv4 SSH from Admin";
   }
   chain forward {
       type filter hook forward priority 0; policy drop;                      
   }
   chain output {
       type filter hook output priority 0; policy accept;
   }
   include "/etc/nft/*.conf"
}

/etc/nft/http.conf(替換counter_nginxcounter_http)。meta mark != 0 accept這裡可能不需要該規則,因為之前可能沒有任何其他鏈,但擁有它也沒有什麼壞處。

   counter input_http {} 
   chain http {
       type filter hook input priority filter - 1; policy accept;
        meta mark != 0 accept
        # HTTP #
        tcp dport {80,443} counter name input_http meta mark set 0x2 accept comment "Allow HTTP";
   }

此方法使用標記,因此將更難與已將標記用於其他目的的其他防火牆規則集成。通過按位運算保留一些標記位仍然是可能的。

引用自:https://serverfault.com/questions/1090764