Debian
nftables (nft) 鏈優先級問題
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_nginx
為counter_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"; }
此方法使用標記,因此將更難與已將標記用於其他目的的其他防火牆規則集成。通過按位運算保留一些標記位仍然是可能的。