다음과 같은 형식의 nftable 규칙 세트가 있습니다.
chain INPUT {
type filter hook input priority filter; policy drop;
ip saddr 11.37.79.97/29 counter packets 0 bytes 0 log prefix "'**A Log Prefix**'"
ct state established,related counter packets 70 bytes 12769 accept
iifname "lo" counter packets 0 bytes 0 accept
ct state new tcp dport 22 counter packets 0 bytes 0 accept
ip saddr 11.137.79.0/24 ct state new counter packets 0 bytes 0 accept comment "A comment"
ip saddr 11.37.79.0/24 ip daddr 11.37.140.0/22 ct state new counter packets 0 bytes 0 accept comment "another comment"
ip saddr 11.37.36.0/22 ip daddr 11.37.140.0/22 ct state new counter packets 0 bytes 0 accept comment "another comment"
ct state new tcp dport 1234 counter packets 0 bytes 0 accept
ct state new tcp dport 2234 counter packets 0 bytes 0 accept
ct state new tcp dport 2244 counter packets 0 bytes 0 accept
tcp dport 61151 ct state new counter packets 0 bytes 0 accept comment "Some Application"
counter packets 0 bytes 0 drop
}
}
...
#existing rules from firewall rich rules populating nftables are of the form:
table inet firewalld {
set OUR-NET {
type ipv4_addr
flags interval
elements = { 11.0.0.0/8 }
}
set OUR-VPN {
type ipv4_addr
flags interval
elements = { 72.60.16.0/20, 72.60.144.0/20,
72.60.192.0/24 }
}
set Management-Support {
type ipv4_addr
flags interval
elements = { 11.37.223.0/24, 11.37.128.0/24,
11.37.129.0/24, 11.37.130.0/24}
}
chain mangle_PREROUTING {
type filter hook prerouting priority mangle + 10; policy accept;
jump mangle_PREROUTING_POLICIES_pre
jump mangle_PREROUTING_ZONES
jump mangle_PREROUTING_POLICIES_post
}
chain mangle_PREROUTING_POLICIES_pre {
jump mangle_PRE_policy_allow-host-ipv6
}
chain mangle_PREROUTING_ZONES {
iifname "ens197" goto mangle_PRE_public
goto mangle_PRE_public
}
chain mangle_PREROUTING_POLICIES_post {
}
chain filter_PREROUTING {
type filter hook prerouting priority filter + 10; policy accept;
icmpv6 type { nd-router-advert, nd-neighbor-solicit } accept
meta nfproto ipv6 fib saddr . mark . iif oif missing log prefix "rpfilter_DROP: " drop
}
chain filter_INPUT {
type filter hook input priority filter + 10; policy accept;
ct state { established, related } accept
ct status dnat accept
iifname "lo" accept
jump filter_INPUT_POLICIES_pre
jump filter_INPUT_ZONES
ct state { invalid } log prefix "STATE_INVALID_DROP: "
ct state { invalid } drop
log prefix "FINAL_REJECT: "
reject with icmpx type admin-prohibited
}
chain filter_FORWARD {
type filter hook forward priority filter + 10; policy accept;
ct state { established, related } accept
ct status dnat accept
iifname "lo" accept
ip6 daddr { ::/96} log prefix "IPv4_REJECT: " reject with icmpv6 type addr-unreachable
jump filter_FORWARD_IN_ZONES
jump filter_FORWARD_OUT_ZONES
ct state { invalid } log prefix "STATE_INVALID_DROP: "
ct state { invalid } drop
log prefix "FINAL_REJECT: "
reject with icmpx type admin-prohibited
}
chain filter_OUTPUT {
type filter hook output priority filter + 10; policy accept;
ct state { established, related } accept
oifname "lo" accept
ip6 daddr { ::/96 } log prefix "IPv4_REJECT: " reject with icmpv6 type addr-unreachable
}
chain filter_INPUT_POLICIES_pre {
jump filter_IN_policy_allow-host-ipv6
}
chain filter_INPUT_ZONES {
iifname "ens197" goto filter_IN_public
goto filter_IN_public
}
chain filter_FORWARD_IN_ZONES {
iifname "ens197" goto filter_FWDI_public
goto filter_FWDI_public
}
chain filter_FORWARD_OUT_ZONES {
oifname "ens197" goto filter_FWDO_public
goto filter_FWDO_public
}
chain filter_IN_public {
jump filter_IN_public_log
jump filter_IN_public_allow
meta l4proto { icmp, ipv6-icmp } accept
}
chain filter_IN_public_log {
ip saddr @Management-Support tcp dport 22 ct state { new, untracked } limit rate 10/minute log prefix "SSH" level info
ip saddr @OUR-VPN tcp dport 22 ct state { new, untracked } limit rate 10/minute log prefix "SSH" level info
ip saddr @OUR-NET tcp dport 22 ct state { new, untracked } limit rate 10/minute log prefix "SSH" level info
}
chain filter_IN_public_allow {
ip saddr @Management-Support tcp dport 22 ct state { new, untracked } accept
ip saddr @OUR-VPN tcp dport 22 ct state { new, untracked } accept
ip saddr @OUR-NET tcp dport 22 ct state { new, untracked } accept
}
chain filter_FWDI_public {
jump filter_FWDI_public_allow
meta l4proto { icmp, ipv6-icmp } accept
}
chain filter_FWDI_public_allow {
ip saddr @OUR-NET icmp type destination-unreachable icmp code 4 accept
}
chain filter_IN_policy_allow-host-ipv6 {
jump filter_IN_policy_allow-host-ipv6_allow
}
chain filter_IN_policy_allow-host-ipv6_allow {
icmpv6 type nd-neighbor-advert accept
icmpv6 type nd-neighbor-solicit accept
icmpv6 type nd-router-advert accept
icmpv6 type nd-redirect accept
}
}
table ip firewalld {
set OUR-NET {
type ipv4_addr
flags interval
elements = { 11.0.0.0/8 }
}
set OUR-VPN {
type ipv4_addr
flags interval
elements = { 72.60.16.0/20, 72.60.144.0/20,
72.60.192.0/24 }
}
set Management-Support {
type ipv4_addr
flags interval
elements = { 11.37.223.0/24, 11.37.128.0/24,
11.37.129.0/24, 11.37.130.0/24 }
}
chain nat_PREROUTING {
type nat hook prerouting priority dstnat + 10; policy accept;
jump nat_PREROUTING_ZONES
}
chain nat_PREROUTING_ZONES {
iifname "ens197" goto nat_PRE_public
goto nat_PRE_public
}
chain nat_POSTROUTING {
type nat hook postrouting priority srcnat + 10; policy accept;
jump nat_POSTROUTING_ZONES
}
chain nat_POSTROUTING_ZONES {
oifname "ens197" goto nat_POST_public
goto nat_POST_public
}
}
table ip6 firewalld {
set OUR-NET {
type ipv4_addr
flags interval
elements = { 11.0.0.0/8 }
}
set OUR-VPN {
type ipv4_addr
flags interval
elements = { 72.60.16.0/20, 72.60.144.0/20,
72.60.192.0/24 }
}
set Management-Support {
type ipv4_addr
flags interval
elements = { 11.37.223.0/24, 11.37.128.0/24,
11.37.129.0/24, 11.37.130.0/24,
11.37.131.0/24, 11.37.132.0/24,
11.37.133.0/24, 11.137.128.0/24,
11.137.129.0/24, 11.137.130.0/24,
11.137.131.0/24, 11.137.132.0/24,
11.137.133.0/24 }
}
chain nat_PREROUTING {
type nat hook prerouting priority dstnat + 10; policy accept;
jump nat_PREROUTING_ZONES
}
chain nat_PREROUTING_ZONES {
iifname "ens197" goto nat_PRE_public
goto nat_PRE_public
}
chain nat_POSTROUTING {
type nat hook postrouting priority srcnat + 10; policy accept;
jump nat_POSTROUTING_ZONES
}
chain nat_POSTROUTING_ZONES {
oifname "ens197" goto nat_POST_public
goto nat_POST_public
}
}
다양한 규칙 형식에서 기존 규칙의 형식은 다음과 같습니다.
'rule family=ipv4 source ipset=Management-Support port port=22 protocol=tcp log prefix=SSH level=info limit value=10/m accept'
'rule family=ipv4 source ipset=OUR-NET port port=22 protocol=tcp log prefix=SSH level=info limit value=10/m accept'
'rule family=ipv4 source ipset=OUR-VPN port port=22 protocol=tcp log prefix=SSH level=info limit value=10/m accept'
내가 이해하는 한도에서는:
- 기존 규칙은 소스가 풍부한 규칙에 나열된 IP 집합 중 하나에서 오는 경우 포트 22에 대한 액세스를 허용합니다.
- nftables를 통한 새로운 규칙은 INPUT 체인에 나열된 패턴을 따르지 않는 모든 INPUT 트래픽을 삭제합니다.
INPUT 체인은 다음과 같아야 합니다.
- 소스 주소가 11.37.79.97/29인 모든 항목을 기록하세요.
- 확립되거나 관련된 연결에 대한 모든 트래픽을 허용합니다.
- 로컬호스트 트래픽 허용
- 대상 포트 22(SSH)에 대한 모든 트래픽을 허용합니다.
- 11.137.79.x의 소스 IP 패턴과 일치하는 모든 트래픽을 허용합니다.
- 11.37.79.x의 소스 IP 패턴과 일치하는 모든 트래픽을 허용합니다. 여기에는 위에 기록된 트래픽이 포함됩니다.
- 등.
그렇다면 문제는 이 구현이 SSH를 차단하는 이유는 무엇입니까?
내 분석에 따르면 이 INPUT 체인에 도달하고 DROP의 기본 정책이 적용되고 있는 것으로 나타났습니다(방화벽 체인이 처음 또는 마지막으로 실행되는지에 관계없이 이 INPUT에 도달하여 삭제됩니다). DROP의 기본 정책은 체인에 다른 명령이 없는 경우에만 실행되어야 합니다. 이는 체인의 다른 어떤 것도 평가하지 않음을 의미합니다. 이로 인해 SSH dport 22 수락 행 이전 어딘가에 구문 오류가 있다고 생각됩니다. 기존 SSH 연결을 삭제하므로 11.37.79.97/29 트래픽에 대해 기록된 첫 번째 줄이 아닐까 의심됩니다.
누구든지 무슨 일이 일어나고 있는지 명확히 할 수 있습니까?
- - 갱신 - -
순서를 바꾸고 로그 접두사 줄 끝에 accept를 추가했습니다. 이제 ct state new tcp dport 22....라인을 따릅니다. 그런 다음 새로 고친 후 규칙 세트를 로드 nft -f <filename>
하고 Firewall-cmd --reload를 수행합니다. 이로 인해 연결이 끊어지고 SSH 액세스가 차단됩니다.