RHEL/CentOS 이제 시스템 부팅 시 방화벽에 nftable 규칙을 추가하시겠습니까?

RHEL/CentOS 이제 시스템 부팅 시 방화벽에 nftable 규칙을 추가하시겠습니까?

저는 RHEL 8에서 방화벽을 사용하고 있으며 몇 가지 nftable 규칙도 추가해야 합니다.

(nftable 규칙은 다음에 대한 답변을 기반으로 합니다.nft 및 방화벽이 있는 NAT 라우터인 CentOS 8 - TFTP를 통과하도록 하는 방법은 무엇입니까?)

실행 중인 방화벽에서는 nft -f 명령과 잘 작동합니다.

그러나 재부팅하면 이 정보가 손실됩니다.

그만큼레드햇 문서(페이월 뒤)은 재부팅 시 규칙을 로드하기 위해 nftables.service 서비스를 사용할 것을 제안하지만 이는 방화벽과 함께 작동하지 않습니다. 두 서비스는 충돌하는 것으로 나열되며 그렇지 않은 경우에도 Firewalld는 nftable 규칙을 플러시할 가능성이 높습니다.

다시 시작할 때 nftable 규칙을 로드하는 또 다른 방법이 있습니까?

답변1

그만큼방화벽유틸리티를 사용할 때nftables백엔드,속하지 않는 테이블은 플러시하지 않습니다.:

Firewalld의 규칙만 플러시합니다.

nftables는 (테이블을 통해) 네임스페이스를 허용하므로방화벽은 더 이상 방화벽 규칙을 완전히 플러시하지 않습니다.. 다음의 규칙만 플러시합니다. 방화벽테이블. 이렇게 하면 방화벽을 다시 시작하거나 다시 로드할 때 사용자 지정 사용자 규칙이나 다른 도구에 의해 설치된 규칙이 예기치 않게 지워지는 시나리오를 방지할 수 있습니다.

다른 테이블을 관리할 때도 마찬가지입니다.

실제로 이전 답변에서는 이미 완료되었습니다.nftables규칙은 멱등적으로 삭제됩니다.오직자신의 테이블: handletftp.

nftables.service안타깝게도 다음의 경우에는 그렇지 않습니다.멈추다행동:

ExecStop=/sbin/nft flush ruleset

시스템 서비스의 중지 부분이 작업을 수행하는 동안 모든 규칙을 직접 플러시하지 않도록 해야 합니다. 이 작업은 전담 부서에 위임됩니다.nftables에 대한 규칙멈추다행동.

따라서 실용적인 방법은 다음과 같습니다. 복제(예: systemctl cat nftables.services)하고 nftables.service인스턴스화된 버전으로 변경하여 [email protected]다음에 넣습니다 ./etc/systemd/system/[email protected]

[Unit]
Description=Idempotent nftables rules for %I
Wants=network-pre.target
Before=network-pre.target

[Service]
Type=oneshot
ProtectSystem=full
ProtectHome=true
ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# As the rules are idempotent, ExecReload is same as ExecStart
ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# The stop rules should only have the first boilerplate parts
ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

위에서 사용한 전용 구성 디렉터리를 만듭니다.

mkdir -p /etc/nftables/idempotent

정의된 각 테이블에 대해 항상 다음과 같이 시작하는 규칙을 배치하므로 규칙 로드는 다른 테이블과 독립적입니다.멱등성(테이블 ip foo및 의 예 bridge bar):

table ip foo
delete table ip foo

table bridge bar
delete table bridge bar

table ip foo {
    ...
}

table bridge bar {
    ....
}

또는 파일당 하나의 테이블을 사용하십시오. 이 flush ruleset문은 전역적이므로 금지됩니다.

테이블이 생성, 삭제 및 재생성되는 이유는 멱등성을 갖는 결과를 얻기 위한 것입니다. 존재하지 않는 테이블을 삭제하면 오류가 발생하고 원자적으로 전체 로딩이 실패하게 되며, 이를 정의하지 않고 기존 테이블을 선언하면(빈 테이블을 추가하여) 절대 실패하지 않고 아무것도 하지 않는다비어있는 것을 제외하고이전에 존재하지 않았다면. 두 경우 모두(부팅 시 존재하지 않았으며 다시 로드 시 존재함)삭제이제 바로 테이블을 정의할 수 있는 공간을 남겨두고 작업할 수 있습니다. 이 모든 것은 동일한 트랜잭션에서 발생하며 여전히 원자적입니다. 누락된 패킷은 평가되지 않습니다.IP foo이 동안 이전에 테이블이 존재했다면 테이블입니다.

준비하다멈추다삭제만 하는 위의 버전(여기서 빈 선언은 꼭 필요한 것은 아니며 테이블이 하나뿐인 경우 제거할 수 있지만 테이블이 두 개 이상인 경우 유지해야 합니다. 실패는 전체 트랜잭션에 대한 것입니다):

table ip foo
delete table ip foo

table bridge bar
delete table bridge bar

모든 것을 해당 위치에 두십시오.

/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft

이제 다음을 통해 활성화할 수 있습니다.

systemctl enable --now local-idempotent-nft@foobar

이전 OP 질문의 예:

안에 /etc/nftables/idempotent/handletftp.nft:

table ip handletftp
delete table ip handletftp

table ip handletftp {
    ct helper helper-tftp {
        type "tftp" protocol udp
    }

    chain sethelper {
        type filter hook forward priority 0; policy accept;
        ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp"
    }
}

~ 안에/etc/nftables/idempotent/stop-handletftp.nft

table ip handletftp
delete table ip handletftp

활성화 및 시작:

systemctl enable --now local-idempotent-nft@handletftp

중지하는 방법:

systemctl stop local-idempotent-nft@handletftp

떠날 것이다방화벽의 규칙이 적용되었습니다. 마찬가지로 중지하거나 다시 시작합니다.방화벽이 규칙은 그대로 두겠습니다.

아마도 다음과 같은 개선 사항이 있을 것입니다.

  • nftables가지고있다포함하다상용구의 중복을 피하기 위해 어떻게든 사용될 수 있는 명령문입니다.
  • nf_nat_tftpTFTP에 대한 구체적인 예는 자동으로 수행되지 않는 로딩에 의존합니다 ( nf_conntrack_tftp규칙의 참조에서 자동으로 로드되거나방화벽이는 nf_nat_tftp명시적으로 로드됩니다). 매우 관련이 있지만 엄격하지는 않습니다.nftables구성을 염두에 두어야 합니다(이 설정 하나만 간단히 에 넣을 수 있음 /etc/modules-load.d/).

관련 정보