들어가기
리눅스에서 네트워크 통신을 다룬다는 것은, 결국 어떤 패킷을 허용하고 어떤 패킷을 차단할 것인가를 결정하는 일입니다.
서비스를 운영하다 보면 포트를 열어야 하는 순간이 반드시 오고, 그때 방화벽은 선택이 아니라 기본 전제가 됩니다.
이 글에서는 RHEL 7 이후 표준 방화벽 관리 방식인 FirewallD를 기준으로,
방화벽이 어떤 구조로 동작하는지, 그리고 실습 명령어들이 어떤 의미를 가지는지까지 흐름 중심으로 정리해보려 합니다.
Netfilter와 Firewall의 변화
리눅스 커널에는 오래전부터 Netfilter라는 패킷 필터링 프레임워크가 존재해왔습니다.
iptables, ip6tables 같은 도구는 모두 이 Netfilter를 직접 제어하는 방식이었습니다.
문제는 다음과 같았습니다.
- 규칙이 많아질수록 관리가 복잡해짐
- 규칙 변경 시 서비스 중단 위험
- 네트워크 환경별 정책 분리가 어려움
이런 한계를 보완하기 위해 RHEL 7부터는 FirewallD가 기본 방화벽 관리 방식으로 채택되었습니다.
FirewallD란 무엇인가
FirewallD는 단순한 방화벽 도구가 아니라,
동적으로 방화벽 규칙을 관리하는 데몬 서비스입니다.
핵심 특징은 다음과 같습니다.
- 런타임 규칙 변경 가능 (서비스 재시작 불필요)
- 네트워크 신뢰 수준 기반 정책 관리
- 내부적으로 Netfilter(nftables/iptables)를 추상화
관리 방법도 다양합니다.
- GUI : firewall-config
- CLI : firewall-cmd
- D-BUS : 다른 프로그램과 연동 가능
FirewallD의 핵심 개념: Zone
FirewallD를 이해하는 가장 중요한 개념은 Zone(존) 입니다.
Zone은 단순히 포트 목록이 아니라,
네트워크의 신뢰 수준에 따라 미리 정의된 방화벽 규칙 묶음입니다.
즉, 질문은 이것입니다.
이 네트워크를 얼마나 믿을 수 있는가?
Zone의 동작 구조
FirewallD는 다음과 같은 흐름으로 패킷을 처리합니다.
- 네트워크 인터페이스 또는 소스 IP가 특정 Zone에 매핑됨
- 들어오는 패킷이 Zone으로 분류됨
- 해당 Zone에 허용된 서비스/포트만 통과
- 나머지 트래픽은 기본적으로 차단
정리하면 다음과 같습니다.
Interface → Zone → Rule
주요 Zone 종류
FirewallD에는 여러 기본 Zone이 존재합니다.
- public : 신뢰되지 않은 외부 네트워크 (기본값)
- dmz : 외부에 노출되는 서버 영역
- internal : 내부 네트워크
- home : 가정용 네트워크
- trusted : 모든 트래픽 허용
- drop : 응답 없이 패킷 폐기
- block : ICMP 거부 메시지 후 차단
실무에서는 대부분 public, dmz, internal 정도만 사용하게 됩니다.
Default Zone의 의미
인터페이스에 Zone을 명시적으로 지정하지 않으면,
FirewallD는 Default Zone을 자동으로 적용합니다.
현재 기본 Zone은 다음 명령으로 확인할 수 있습니다.
- 현재 시스템의 기본 Zone 확인
- 새로 연결되는 인터페이스에 자동 적용되는 Zone
운영 환경에서는 이 기본 Zone이 무엇인지 반드시 확인해야 합니다.
FirewallD 실습 흐름 해설
아래에서는 앞에서 설명한 개념이 실제 명령어로 어떻게 연결되는지,
최소한의 예제를 통해 흐름을 확인해봅니다.
Zone 목록과 현재 상태 확인
처음 해야 할 일은, 시스템에 어떤 Zone들이 정의되어 있는지 확인하는 것입니다.
Zone 전체 목록을 확인하면 각 Zone에 어떤 서비스와 포트가 허용되어 있는지 함께 볼 수 있습니다.
bash# 시스템에 정의된 모든 Zone과 규칙 확인
firewall-cmd --list-all-zones
또한 현재 기본 Zone이 무엇인지도 반드시 확인해야 합니다.
bash# 현재 기본 Zone 확인
firewall-cmd --get-default-zone
이 값은 Zone을 지정하지 않은 인터페이스에 자동 적용되는 정책이므로,
운영 환경에서는 매우 중요합니다.
기본 Zone 변경의 의미
기본 Zone을 변경하면,
명시적으로 Zone이 지정되지 않은 모든 인터페이스의 보안 정책이 함께 변경됩니다.
bash# 기본 Zone을 dmz로 변경
firewall-cmd --set-default-zone=dmz
이 명령은 단순히 포트를 여는 것과는 다릅니다.
해당 인터페이스 전체의 신뢰 수준 자체를 바꾸는 작업이기 때문에,
실무에서는 사전에 구조를 충분히 이해한 상태에서만 적용해야 합니다.
서비스 허용과 런타임 규칙
FirewallD에서 서비스는 단순한 포트 번호가 아니라,
미리 정의된 포트·프로토콜 묶음입니다.
예를 들어 웹 서버를 운영하는 경우 다음과 같이 서비스를 허용할 수 있습니다.
bash# http, https 서비스 허용 (런타임)
firewall-cmd --add-service=http
firewall-cmd --add-service=https
이 설정은 즉시 반영되지만,
재부팅 후에는 사라집니다.
현재 Zone에 적용된 설정은 다음 명령으로 확인할 수 있습니다.
bashfirewall-cmd --list-all
Permanent 옵션의 정확한 의미
영구 설정은 --permanent 옵션을 사용합니다.
bash# 재부팅 후에도 유지되는 서비스 허용
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
중요한 점은,
permanent 설정은 즉시 적용되지 않는다는 것입니다.
이 상태에서 바로 확인하면 아직 반영되지 않은 것처럼 보입니다.
bashfirewall-cmd --list-all
reload의 역할
permanent 설정을 실제 방화벽 규칙으로 반영하려면 reload가 필요합니다.
bash# permanent 설정을 런타임에 반영
firewall-cmd --reload
reload는 다음과 같은 특징을 가집니다.
- 기존 연결 유지
- 서비스 재시작 불필요
- 운영 중 안전하게 적용 가능
그래서 FirewallD는 운영 환경에서도 비교적 부담 없이 정책 변경이 가능합니다.
포트 기반 허용의 실제 의미
특정 포트를 직접 허용하는 경우는 보통 다음과 같습니다.
- 서비스 정의가 없는 커스텀 데몬
- syslog (514/udp)
- 커스텀 SSH 포트
예를 들어 원격 로그 수신을 허용하려면 다음과 같이 설정합니다.
bash# syslog 수신 포트 허용
firewall-cmd --permanent --add-port=514/udp
이는 외부에서 들어오는 syslog 패킷을 허용하는 설정입니다.
SSH 포트 변경 시 방화벽 설정
SSH 포트를 기본값이 아닌 다른 값으로 변경했다면,
방화벽 설정도 반드시 함께 변경해야 합니다.
bash# SSH를 222/tcp 포트로 허용
firewall-cmd --permanent --add-port=222/tcp
firewall-cmd --reload
이 작업이 빠지면 sshd가 정상 동작하더라도
외부에서는 접속할 수 없는 상태가 됩니다.
또한 실제 환경에서는 SELinux 포트 정책도 함께 확인해야 합니다.
sources: 소스 IP 기반 제어
FirewallD는 포트보다 먼저 출발지 IP를 기준으로 신뢰할 수 있습니다.
bash# 특정 네트워크 대역을 신뢰
firewall-cmd --permanent --add-source=192.168.11.0/24
# 특정 호스트만 신뢰
firewall-cmd --permanent --add-source=10.100.1.2
firewall-cmd --reload
이 방식은 내부 관리망이나 VPN 구간에서 특히 유용합니다.
ICMP 제어의 의미
ICMP는 단순한 ping이 아니라,
네트워크 오류 전달과 상태 확인에 사용됩니다.
예를 들어 echo-request를 차단하면 ping 요청에 응답하지 않게 됩니다.
bash# ICMP echo-request 차단
firewall-cmd --permanent --add-icmp-block=echo-request
firewall-cmd --reload
보안을 강화할 수는 있지만,
장애 진단이 어려워질 수 있으므로 환경에 따라 신중하게 선택해야 합니다.
정리
FirewallD는 단순한 방화벽 명령어 집합이 아닙니다.
- Zone을 중심으로 한 정책 설계
- 런타임과 영구 설정의 분리
- 서비스 중단 없는 정책 변경
이 구조를 이해하면,
방화벽 설정은 더 이상 외워야 할 명령어가 아니라
의도적으로 설계하는 보안 정책이 됩니다.