CentOS Stream 10에서 firewalld 서비스가 시작되지 않는 문제를 해결하는 방법

안녕하세요. 지구 IDC 기술팀입니다.

CentOS Stream 10에서 firewalld 서비스를 시작했지만 실패하거나, firewall-cmd 실행 시 방화벽 데몬에 연결할 수 없다는 메시지가 표시되는 경우가 있습니다. 주요 원인은 서비스가 마스크된 상태, 패키지 누락 또는 손상, 잘못된 XML 설정 파일, systemd 사용자 정의 설정, 다른 방화벽 관리 서비스와의 충돌입니다.

이 문서에서는 현재 상태와 로그를 먼저 확인한 뒤 원인별로 안전하게 복구하는 방법을 설명합니다. 설정 파일을 초기화하는 절차는 마지막 수단으로만 사용하며, 원격 서버에서는 SSH 접속 규칙을 보존한 상태에서 진행해야 합니다.

적용 환경

운영체제 CentOS Stream 10
방화벽 관리 도구 firewalld, firewall-cmd
서비스명 firewalld.service
기본 설정 경로 /etc/firewalld, /usr/lib/firewalld, /etc/firewalld/firewalld.conf

1. 서비스 상태와 오류 로그 확인

복구 명령을 바로 실행하기보다 운영체제 버전, 패키지 설치 여부, 서비스 상태를 먼저 확인합니다. Loaded, Active, enabled 또는 masked 상태를 확인하면 문제 범위를 빠르게 좁힐 수 있습니다.

cat /etc/os-release
rpm -q firewalld
sudo systemctl status firewalld.service --no-pager -l
sudo systemctl is-active firewalld.service
sudo systemctl is-enabled firewalld.service

Unit firewalld.service could not be found가 표시되면 패키지가 설치되지 않았거나 서비스 단위 파일이 손상되었을 가능성이 있습니다. masked가 표시되면 서비스 시작이 명시적으로 차단된 상태입니다.

이번 부팅에서 발생한 로그 확인

서비스 시작 실패 원인은 systemd 저널에 기록됩니다. 아래 명령으로 현재 부팅 이후의 firewalld 로그와 상세 오류를 확인합니다.

sudo journalctl -u firewalld.service -b --no-pager -n 100
sudo journalctl -xeu firewalld.service --no-pager

로그에서 파일 경로, XML 오류, 잘못된 zone 또는 service 이름, nftables 관련 오류, 권한 오류를 확인합니다. 오류 메시지에 특정 설정 파일이 표시되면 해당 파일을 먼저 백업한 뒤 수정해야 합니다.

2. 패키지 누락과 서비스 마스크 해제

firewalld 패키지가 설치되지 않은 경우

rpm -q firewalld 결과가 설치되지 않았다고 표시되면 CentOS Stream 저장소에서 패키지를 설치합니다.

sudo dnf install -y firewalld

설치 후 서비스를 부팅 시 자동 시작하도록 설정하고 즉시 시작합니다.

sudo systemctl enable --now firewalld.service

서비스가 masked 상태인 경우

마스크된 서비스는 수동 시작과 다른 서비스에 의한 자동 시작이 모두 차단됩니다. firewalld를 사용하려는 서버라면 마스크를 해제한 뒤 서비스를 시작합니다.

sudo systemctl unmask firewalld.service
sudo systemctl daemon-reload
sudo systemctl enable --now firewalld.service

마스크가 의도적으로 설정된 서버라면 기존에 nftables.service 또는 별도 보안 솔루션이 방화벽을 관리하는지 먼저 확인하십시오.

3. firewalld 설정 오류 검사

/etc/firewalld에는 관리자가 생성하거나 수정한 영구 설정이 저장됩니다. 잘못된 XML 문법, 존재하지 않는 service 참조, 잘못된 주소 또는 포트 형식이 있으면 데몬이 시작 단계에서 실패할 수 있습니다.

firewalld가 실행되지 않는 상태에서는 오프라인 검사 도구로 기본 설정과 사용자 설정의 XML 유효성 및 의미 오류를 검사합니다.

sudo firewall-offline-cmd --check-config

오류가 없으면 명령이 정상 종료됩니다. 오류가 표시되면 메시지에 나온 파일과 항목을 확인합니다.

사용자 설정 백업

수정 전에 /etc/firewalld 전체를 백업합니다. 아래 명령은 실행 시각이 포함된 백업 디렉터리를 /root에 생성합니다.

sudo cp -a /etc/firewalld "/root/firewalld-backup-$(date +%Y%m%d-%H%M%S)"
sudo find /etc/firewalld -maxdepth 3 -type f -print

오류가 발생한 사용자 정의 파일 격리

로그 또는 검사 결과에서 특정 XML 파일이 지목되면 해당 파일만 설정 경로 밖으로 이동합니다. 아래의 INVALID_ZONE.xml은 실제 오류 파일명으로 변경해야 합니다.

sudo mv /etc/firewalld/zones/INVALID_ZONE.xml /root/INVALID_ZONE.xml.disabled
sudo firewall-offline-cmd --check-config
sudo systemctl start firewalld.service

4. systemd 설정과 패키지 파일 복구

서비스 단위 파일과 drop-in 설정 확인

기본 서비스 파일을 덮어쓴 로컬 단위 파일이나 /etc/systemd/system/firewalld.service.d의 drop-in 설정이 시작 명령, 환경 변수 또는 의존성을 잘못 변경했을 수 있습니다.

sudo systemctl cat firewalld.service
sudo systemctl show firewalld.service -p FragmentPath -p DropInPaths
sudo find /etc/systemd/system/firewalld.service.d -maxdepth 1 -type f -print 2>/dev/null

문제가 발생한 시점에 추가한 drop-in 파일이 있다면 파일을 백업한 뒤 임시로 이동하고 systemd 설정을 다시 읽습니다. 운영 목적이 확인되지 않은 설정을 무조건 삭제하지 마십시오.

sudo mkdir -p /root/firewalld-systemd-backup
sudo cp -a /etc/systemd/system/firewalld.service.d /root/firewalld-systemd-backup/ 2>/dev/null || true
sudo systemctl daemon-reload
sudo systemctl restart firewalld.service

위 명령은 백업만 수행합니다. 실제 오류가 있는 drop-in 파일은 내용을 확인한 뒤 개별적으로 수정하거나 설정 경로 밖으로 이동해야 합니다.

패키지 파일 무결성 확인과 재설치

rpm -V는 패키지에서 제공한 파일이 변경되었는지 확인합니다. 출력이 있더라도 사용자 설정 파일 변경일 수 있으므로 결과를 검토한 뒤 재설치를 진행합니다.

sudo rpm -V firewalld
sudo dnf reinstall -y firewalld
sudo systemctl daemon-reload
sudo systemctl restart firewalld.service

패키지 재설치는 일반적으로 /etc/firewalld의 사용자 정의 규칙을 초기화하지 않습니다. 따라서 설정 오류가 원인인 경우에는 재설치 후에도 동일한 문제가 계속될 수 있습니다.

SELinux 파일 컨텍스트 복구

다른 서버에서 설정 파일을 복사했거나 백업을 수동 복원한 뒤 권한 관련 오류가 발생한다면 기본 소유권과 SELinux 파일 컨텍스트를 확인합니다.

sudo chown -R root:root /etc/firewalld
sudo restorecon -RFv /etc/firewalld
sudo firewall-offline-cmd --check-config
sudo systemctl restart firewalld.service

5. nftables 서비스와 관리 방식 확인

firewalld는 내부적으로 nftables 백엔드를 사용할 수 있지만, 별도의 nftables.service를 통해 사용자 규칙 파일을 자동 로드하는 구성과는 관리 방식이 다릅니다. 두 방식을 혼합하면 규칙이 덮어써지거나 예상하지 못한 상태가 발생할 수 있으므로 서버에서 어떤 도구가 방화벽을 관리하도록 설계되었는지 확인해야 합니다.

sudo systemctl is-active nftables.service
sudo systemctl is-enabled nftables.service
sudo nft list ruleset

nftables.service가 의도적으로 방화벽을 관리하고 있다면 firewalld를 추가로 활성화하지 말고 기존 운영 방식을 유지합니다. firewalld로 전환하려는 경우에는 현재 nftables 규칙을 먼저 백업합니다.

sudo sh -c 'nft list ruleset > "/root/nftables-ruleset-$(date +%Y%m%d-%H%M%S).nft"'
sudo systemctl disable --now nftables.service
sudo systemctl enable --now firewalld.service

6. 설정을 기본값으로 초기화

개별 오류 파일을 찾기 어렵고 사용자 설정 전체가 손상된 경우에만 기본값 초기화를 고려합니다. 이 작업은 사용자 정의 zone, service, port, rich rule, NAT 설정을 제거할 수 있으므로 반드시 백업 후 진행합니다.

먼저 서비스를 중지하고 현재 설정을 백업한 뒤 기본값으로 초기화합니다.

sudo systemctl stop firewalld.service
sudo cp -a /etc/firewalld "/root/firewalld-before-reset-$(date +%Y%m%d-%H%M%S)"
sudo firewall-offline-cmd --reset-to-defaults

SSH가 기본 22번 포트를 사용한다면 사전 정의된 SSH 서비스를 허용합니다.

sudo firewall-offline-cmd --zone=public --add-service=ssh

SSH가 사용자 정의 포트를 사용한다면 실제 포트를 별도로 추가합니다. 다음 예시는 TCP 2222번 포트를 사용하는 경우입니다.

sudo firewall-offline-cmd --zone=public --add-port=2222/tcp

설정 검사를 통과한 뒤 서비스를 시작합니다.

sudo firewall-offline-cmd --check-config
sudo systemctl enable --now firewalld.service

초기화 후에는 웹 서버, 데이터베이스, VPN, 컨테이너, 포트 포워딩 등 기존 서비스에 필요한 규칙을 백업 내용과 비교하여 다시 구성해야 합니다.

7. 복구 결과 확인

서비스가 정상 실행되고 부팅 시 자동 시작되도록 설정되었는지 확인합니다.

sudo systemctl is-active firewalld.service
sudo systemctl is-enabled firewalld.service
sudo firewall-cmd --state

정상 상태에서는 서비스가 active, 자동 시작이 enabled, firewalld 상태가 running으로 확인됩니다.

현재 활성 zone과 적용된 규칙을 확인합니다.

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --list-all
sudo firewall-cmd --check-config

원격 서버에서는 기존 SSH 세션을 종료하기 전에 다른 터미널에서 서버 IP와 현재 SSH 포트로 다시 접속합니다. 웹 서버나 데이터베이스 등 외부 공개 서비스가 있다면 해당 포트의 실제 접속도 함께 확인해야 합니다.

8. 자주 발생하는 오류와 해결 방법

firewalld 시작 실패 원인별 점검표
증상 가능한 원인 확인 방법 해결 방법
Unit firewalld.service could not be found 패키지 미설치 또는 서비스 파일 손상 rpm -q firewalld dnf install firewalld 또는 dnf reinstall firewalld
서비스 상태가 masked systemd 마스크 설정 systemctl is-enabled firewalld systemctl unmask firewalld 후 시작
XML 또는 zone 관련 오류 손상된 사용자 정의 설정 firewall-offline-cmd --check-config 오류 파일 백업·격리 후 재검사
권한 또는 접근 거부 오류 잘못된 소유권 또는 SELinux 컨텍스트 ls -lZ /etc/firewalld chownrestorecon으로 복구
시작 직후 규칙이 예상과 다름 별도 nftables 규칙 로더 또는 자동화 도구 사용 systemctl status nftables, nft list ruleset 방화벽 관리 도구를 하나로 정리하고 기존 규칙 백업
firewall-cmd가 데몬에 연결하지 못함 firewalld 미실행 또는 시작 중 실패 systemctl status, journalctl -u firewalld 저널의 최초 오류부터 원인별 복구

자주 묻는 질문

firewalld 패키지를 재설치하면 기존 규칙이 모두 삭제되나요?

일반적인 패키지 재설치만으로 /etc/firewalld의 사용자 정의 설정이 모두 초기화되지는 않습니다. 다만 작업 전 설정 디렉터리를 별도로 백업하는 것이 안전합니다.

firewall-offline-cmd는 언제 사용하나요?

firewall-offline-cmd는 firewalld 데몬이 실행되지 않을 때 영구 설정을 검사하거나 수정하는 도구입니다. 서비스가 실행 중인 상태에서는 일반적으로 firewall-cmd를 사용합니다.

firewalld와 nftables를 동시에 사용할 수 있나요?

firewalld 자체가 nftables 백엔드를 사용할 수는 있지만, 별도의 nftables.service가 사용자 규칙을 자동 로드하는 운영 방식과 혼합하면 관리 주체가 불명확해질 수 있습니다. 특별한 설계가 없다면 하나의 관리 방식으로 통일하는 것이 안전합니다.

서비스를 시작한 뒤 SSH 접속이 끊기면 어떻게 해야 하나요?

서버 콘솔로 접속해 현재 zone에 SSH 서비스 또는 실제 SSH 포트가 허용되어 있는지 확인합니다. 기본 포트라면 firewall-cmd --permanent --zone=public --add-service=ssh, 사용자 정의 포트라면 해당 포트를 직접 허용한 뒤 firewall-cmd --reload를 실행합니다.

설정을 초기화하기 전에 무엇을 백업해야 하나요?

/etc/firewalld 전체와 현재 nft list ruleset 출력, 사용 중인 SSH 포트, 공개 서비스 포트, NAT 및 포트 포워딩 규칙을 백업해야 합니다.

공식 참고자료

마무리

CentOS Stream 10에서 firewalld가 시작되지 않을 때는 서비스 재설치나 설정 초기화부터 진행하기보다 systemctl statusjournalctl로 최초 오류를 확인하는 것이 중요합니다. 이후 패키지와 마스크 상태, 사용자 XML 설정, systemd drop-in, 파일 권한, nftables 운영 여부를 순서대로 점검하면 불필요한 방화벽 초기화를 피할 수 있습니다.

원격 서버에서는 방화벽을 시작하거나 초기화하기 전에 현재 SSH 포트 허용 규칙과 콘솔 접속 수단을 반드시 확인하십시오. 복구 후에는 서비스 상태뿐 아니라 실제 원격 접속과 공개 서비스 포트까지 검증해야 합니다.

  • 0 Users Found This Useful
Was this answer helpful?
« Back