nftables 규칙은 분명히 ssh 트래픽을 차단하고 있습니다. 아마도 특수 문자일까요?

nftables 규칙은 분명히 ssh 트래픽을 차단하고 있습니다. 아마도 특수 문자일까요?

다음과 같은 형식의 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 액세스가 차단됩니다.

관련 정보