1. firewall-cmd 개요
firewall-cmd는 CentOS 7 이상에서 사용되는 firewalld 데몬의 CLI(Command Line Interface) 도구입니다. 기존 iptables와 달리, firewalld는 다음과 같은 장점을 제공합니다:
- 동적 규칙 업데이트: 규칙 변경 시 서비스를 재시작할 필요 없이 즉시 적용됩니다.
- Zone 기반 관리: 네트워크 인터페이스에 특정 보안 영역(public, internal, dmz 등)을 할당하여 관리할 수 있습니다.
- 직관적인 사용법: TCP/IP 프로토콜에 대한 깊은 이해 없이도 대부분의 방화벽 기능을 사용할 수 있습니다.
firewalld는 iptables와 마찬가지로 커널의 netfilter 모듈을 통해 실제 패킷 필터링을 수행합니다. 즉, firewalld와 iptables 모두 규칙을 관리하는 도구이며, 실제 처리는 netfilter가 담당합니다.
2. firewall-cmd 명령어 구조
기본 형식
firewall-cmd [옵션 ...]
공통 옵션
-h, --help # 도움말 출력
-V, --version # 버전 정보 출력
-q, --quiet # 상태 메시지 출력 안 함
상태 관리 옵션
--state # firewalld 실행 상태 확인
--reload # 연결 중단 없이 규칙 다시 로드
--complete-reload # 모든 연결 중단 후 규칙 다시 로드
--runtime-to-permanent # 현재 런타임 규칙을 영구 저장
--check-config # 설정 파일 구문 검사
로그 관련 옵션
--get-log-denied # 차단된 패킷 로그 설정 확인
--set-log-denied=<값> # 차단 로그 수준 설정 (all, unicast, broadcast, multicast, off)
3. 주요 사용 예제
설치 및 서비스 제어
# firewalld 설치
yum install firewalld firewall-config
# 서비스 시작/상태 확인/중지/비활성화
systemctl start firewalld
systemctl status firewalld # 또는 firewall-cmd --state
systemctl stop firewalld
systemctl disable firewalld
# iptables로 전환하려면
systemctl stop firewalld
systemctl disable firewalld
yum install iptables-services
systemctl start iptables
systemctl enable iptables
기본 정보 확인
firewall-cmd --version # 버전 확인
firewall-cmd --state # 실행 상태
firewall-cmd --get-active-zones # 활성화된 zone 목록
firewall-cmd --get-zone-of-interface=eth0 # eth0 인터페이스가 속한 zone
firewall-cmd --panic-on # 모든 패킷 차단
firewall-cmd --panic-off # 차단 해제
firewall-cmd --query-panic # 패닉 모드 상태 확인
Zone 및 인터페이스 관리
# 인터페이스를 특정 zone에 추가
firewall-cmd --zone=public --add-interface=eth0
# 기본 zone 설정
firewall-cmd --set-default-zone=home
# 활성화된 zone 확인
firewall-cmd --get-active-zones
# 특정 인터페이스가 속한 zone 확인
firewall-cmd --get-zone-of-interface=eth0
# 사용 가능한 모든 zone 목록
firewall-cmd --get-zones
# zone의 상세 설정 확인
firewall-cmd --zone=public --list-all
# 인터페이스 zone 변경 (일시적/영구적)
firewall-cmd --zone=internal --change-interface=eth0
firewall-cmd --permanent --zone=internal --change-interface=eth0
서비스 관리
# 모든 지원 서비스 목록 확인
firewall-cmd --get-services
# SSH 서비스 허용
firewall-cmd --add-service=ssh
# HTTP 서비스를 internal zone에 영구 추가
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload
# 현재 활성화된 서비스 목록
firewall-cmd --list-services
# Samba 서비스 임시 허용 (600초)
firewall-cmd --add-service=samba --timeout=600
포트 관리
# TCP 443 포트 열기
firewall-cmd --add-port=443/tcp
# 3690/TCP 포트 영구 오픈
firewall-cmd --permanent --add-port=3690/tcp
firewall-cmd --reload
# 현재 열린 포트 확인
firewall-cmd --list-ports
# 특정 zone의 포트 목록 확인
firewall-cmd --zone=dmz --list-ports
직접 모드 (Direct Mode)
# iptables 규칙 직접 추가 (TCP 9999 포트 허용)
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
firewall-cmd --reload
4. 고급 기능
커스텀 서비스 관리
firewalld는 사용자 정의 서비스를 생성하여 포트, 프로토콜, 모듈 등을 그룹화할 수 있습니다.
# 새 서비스 생성 (영구 전용)
firewall-cmd --new-service=myservice
# 서비스에 포트 추가
firewall-cmd --service=myservice --add-port=9000/tcp
# 서비스 정보 확인
firewall-cmd --info-service=myservice
# 서비스 삭제
firewall-cmd --delete-service=myservice
포트 포워딩
# 로컬 80 → 8080 포워딩
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 로컬 80 → 원격 서버 192.168.0.1:80 포워딩
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1
# 로컬 80 → 원격 192.168.0.1:8080 포워딩
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080
# 포워딩 사용 전 마스커레이드 활성화 필수
firewall-cmd --add-masquerade
마스커레이드 (IP 위장)
firewall-cmd --query-masquerade # 상태 확인
firewall-cmd --add-masquerade # 활성화
firewall-cmd --remove-masquerade # 비활성화
5. 주의사항
- 서비스와 포트는 별도로 관리되며, 서비스로 열린 포트는 서비스 이름으로만 닫을 수 있고, 포트 번호로 직접 연 것은 포트 번호로만 닫을 수 있습니다.
- 포트를 추가할 때는 반드시 프로토콜(tcp/udp)을 명시해야 합니다.
- 영구 변경(--permanent) 후에는
firewall-cmd --reload를 실행해야 적용됩니다. - 임시 변경(--permanent 없이)은 재부팅 시 사라집니다.
6. 전체 설정 확인 방법
# 특정 zone의 모든 설정 확인
firewall-cmd --zone=public --list-all
# 시스템 전체 zone 목록
firewall-cmd --list-all-zones