100===Dev Ops/Firewalld

Firewalld 소개 ⚠️

블로글러 2024. 6. 12. 08:45

오늘은 firewalld에 대해 깊이 있게 알아보겠습니다! Linux 서버를 운영하거나 네트워크 보안을 관리해야 하는 경우, firewalld는 매우 강력하면서도 유연한 방화벽 도구입니다. 지금부터 개념부터 동작 원리, 실제 예제까지 차근차근 살펴보겠습니다.


1. firewalld란? 🤔

🔹 개념 요약

firewalld는 Linux 시스템에서 동작하는 동적 방화벽 관리 도구로, iptables의 후속 개념으로 자주 언급됩니다. iptables가 규칙을 변경할 때마다 방화벽을 재시작해야 했던 불편함을 해결하고, Zone(영역)이라는 개념을 활용해 네트워크 인터페이스 또는 서비스별로 서로 다른 정책을 간편하게 적용할 수 있도록 한 것이 특징입니다.

🔹 실생활 예시

  • 집이나 회사의 네트워크를 구분해서 보안 설정을 달리해야 할 때, 예를 들어 사내 망은 내부 서비스에 대해 비교적 관대한 규칙을 적용하고, 외부망은 엄격한 규칙을 적용하고 싶다면?
  • WIFI, 이더넷, VPN 등 다양한 네트워크 인터페이스마다 보안 수준을 다르게 적용하고 싶을 때?

이 모든 상황에서 firewalld의 ‘Zone’ 개념을 사용하면 무척 간편해집니다.

🔹 어떤 문제를 해결하는가?

기존 iptables를 사용할 때는 규칙 추가 시 재시작을 해야 하고, 방화벽 정책 적용이 까다로웠습니다. 또한, 영역(Zone)을 통한 동적 정책 변경에 어려움이 있었습니다. firewalld는 이러한 문제들을 해결해 실시간(policy reload 없이)으로 방화벽 정책을 변경하고, 사용자가 손쉽게 네트워크 보안 정책을 구성할 수 있도록 돕습니다.


2. 어떻게 동작하나요? 🎬

1) 기본 개념

firewalld는 내부적으로 nftables 또는 iptables를 사용하여 규칙을 적용합니다. 하지만 사용자 입장에서는 firewall-cmd라는 명령어를 통해 Zone, Service, Port 등의 추상화된 개념을 사용하게 되므로 설정이 보다 직관적입니다.

  • Zone(영역): 네트워크 인터페이스별 혹은 소스 IP 주소별로 서로 다른 방화벽 규칙을 적용할 수 있는 단위입니다. 예: public, home, work, internal 등.
  • Service(서비스): 특정 포트와 프로토콜에 대한 규칙을 미리 정의해 둔 템플릿입니다. 예: ssh, http, https 등.
  • Direct rules: Zone이나 Service 개념만으로 구현하기 어려운 규칙을 직접 입력할 수 있는 기능입니다.

아래는 기본적인 firewall-cmd 명령어 구조 예시입니다:

# firewalld 현재 상태 확인
firewall-cmd --state

# 사용 가능한 Zone 목록 확인
firewall-cmd --get-zones

# 현재 기본(Default) Zone 확인
firewall-cmd --get-default-zone

# 특정 Zone에 열려 있는 서비스 확인
firewall-cmd --list-services --zone=public

# 특정 Zone에 새로운 서비스 추가 (실시간 적용)
firewall-cmd --zone=public --add-service=http

# 같은 명령을 영구(Permanent) 적용
firewall-cmd --zone=public --permanent --add-service=http

# 설정 재로드
firewall-cmd --reload

2) 실제 적용 예시

예를 들어, 서버에 HTTP(80), HTTPS(443) 트래픽만 허용하고 싶다고 합시다. public Zone에 대해서 다음과 같이 설정할 수 있습니다:

# public Zone에 http 서비스 허용
firewall-cmd --zone=public --add-service=http

# public Zone에 https 서비스 허용
firewall-cmd --zone=public --add-service=https

# 영구 적용 후 재로드
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd --reload

이렇게 하면 재부팅 후에도 HTTP/HTTPS 포트는 계속 열려 있게 됩니다.


🚀 동작 원리

  1. Zone 매핑: 먼저 네트워크 인터페이스(또는 소스 IP)마다 어떤 Zone이 할당되어 있는지 확인합니다. firewalld는 서버 부팅 시 ifcfg 설정이나 사용자의 추가 설정에 따라 Interface→Zone 매핑을 결정합니다.
  2. 서비스/포트 규칙 적용: 해당 Zone에는 미리 정의된 서비스나 사용자가 설정한 포트 기반 규칙이 적용됩니다. 예: SSH, HTTP, NFS 등.
  3. 동적 변경: firewall-cmd를 통해 실시간으로 규칙을 추가/제거합니다. 필요 시 --permanent 옵션으로 영구 변경 가능하며, --reload를 통해 영구 변경 사항을 실제 방화벽에 반영합니다.

3. 주요 장점 🌟

  1. 동적(Dynamic) 적용: iptables와 달리, 규칙 변경 시 방화벽 전반을 재시작할 필요 없이 실시간으로 변경 가능합니다.
  2. Zone 기반 관리: 네트워크 상태(내부망, 외부망)에 따라 자유롭게 보안 정책을 분리하여 관리할 수 있어, 복잡한 환경에서도 체계적인 보안 설정이 가능합니다.
  3. 친숙하고 직관적인 명령: firewall-cmd 명령 하나로 대부분의 작업을 수행할 수 있어 러닝 커브가 상대적으로 낮습니다.

4. 주의할 점 ⚠️

  1. 기본 Zone 확인: firewall-cmd --get-default-zone 결과가 public인 경우가 많습니다. 만약 이 기본 Zone에 인터페이스가 자동으로 할당되어 있으면, 의도치 않게 외부로부터 트래픽이 허용될 수 있습니다.
  2. 실시간 vs 영구 설정 혼동: --permanent 옵션 없이 추가한 규칙은 재부팅 시 초기화될 수 있으므로, 중요한 규칙은 영구 설정 후 반드시 firewall-cmd --reload를 해줘야 합니다.
  3. 직접 규칙(Direct rules) 사용 시 주의: Zone과 Service로도 충분히 설정할 수 있는데 직접 규칙을 남발하면 관리가 복잡해집니다. 가급적 Zone/Service를 적극 활용하는 것이 좋습니다.

5. 실제 사용 예시 📱

예시 1) 특정 포트만 열기

# 8080 포트를 TCP로 허용
firewall-cmd --zone=public --add-port=8080/tcp
firewall-cmd --zone=public --permanent --add-port=8080/tcp
firewall-cmd --reload
  • 특정 서비스가 아닌 임의의 포트를 열어야 할 경우 사용합니다.

예시 2) Zone 변경

# enp0s3 네트워크 인터페이스를 "internal" Zone으로 변경
nmcli connection modify enp0s3 connection.zone internal
# 또는 NetworkManager GUI에서 설정 가능
  • 사내 네트워크 전용 인터페이스를 internal Zone으로 할당하여, 외부에서 들어오는 트래픽은 차단하고 내부 트래픽만 허용하도록 설정할 수 있습니다.

예시 3) 서비스 직접 정의

# /etc/firewalld/services/myapp.xml 생성 예시
<service>
  <short>MyApp</short>
  <description>Custom Application Service</description>
  <port protocol="tcp" port="5000"/>
</service>
# 커스텀 서비스 등록 후 허용
firewall-cmd --permanent --add-service=myapp
firewall-cmd --reload
  • 내부 어플리케이션이 사용하는 포트를 하나하나 지정하기보다, 새 서비스로 묶어서 관리하면 편리합니다.

6. 마치며 🎁

지금까지 firewalld의 개념, 동작 원리, 주요 기능, 그리고 실제 예제까지 살펴보았습니다. 간단한 명령어로 동적 방화벽 제어가 가능해지는 것은 물론이고, Zone 개념을 적극 활용하면 네트워크 인터페이스별로 맞춤형 보안 설정을 쉽게 적용할 수 있습니다.

만약 방화벽 설정을 코드 관리 도구나 자동화 스크립트(Ansible, Puppet 등)와 연동한다면, 대규모 인프라에서도 매우 손쉽게 방화벽 정책을 구성할 수 있을 것입니다. 이 기술을 사용하면 서버의 보안성을 한층 더 높이면서도, 관리의 편의성까지 얻을 수 있습니다!


참고 자료 및 출처

  • Red Hat 공식 문서: firewalld
  • man firewall-cmd
  • /etc/firewalld/ 디렉터리 내 설정 파일들

감사합니다. 다음에도 더욱 유익한 주제로 찾아뵙겠습니다!

728x90