firewall-cmd 명령어 실전 가이드

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

태그: firewalld CentOS linux netfilter 방화벽

7월 2일 06:51에 게시됨