# 방화벽

**방화벽(Firewall)**은 미리 정의된 보안 규칙에 기반하여, 들어오고 나가는 네트워크 트래픽을 모니터링하고 제어하는 네트워크 보안 시스템을 의미한다. 방화벽은 신뢰할 수 있는 내부 네트워크, 신뢰할 수 없는 외부 네트워크 간의 장벽을 구성하여 외부의 위협으로부터 내부 네트워크를 안전하게 유지할 수 있다.

# 리눅스에서 지원하는 방화벽

### 1. 리눅스 주요 방화벽 소프트웨어 비교

| 방화벽 소프트웨어 | 주요 특징 |
|------------------|-------------------------------------------------------------|
| **iptables** | 커널 레벨에서 작동하며 개별 패킷을 직접 필터링하는 강력한 방화벽 도구. |
| **nftables** | iptables의 후속 기술로 개발되어 향상된 성능을 제공하며, 더 적은 코드로 유연한 관리 가능. |
| **firewalld** | iptables/nftables를 백엔드로 활용하며, Zone 기반의 관리 방식을 제공.<br>대부분의 RHEL 계열의 운영체제에서 기본적으로 지원. <b>(RHEL 7 이상)</b> |
| **ufw** | iptables를 백엔드로 활용하며, 초보자 친화적인 명령어 기반 인터페이스를 제공.<br>대부분의 우분투 계열의 운영체제에서 기본적으로 지원. |

### 2. 장단점 비교

#### iptables

**장점**:

- 강력한 패킷 필터링 기능 제공
- 대부분의 리눅스 배포판에서 지원
- 커스텀 스크립트를 활용한 정밀한 제어 가능

**단점**:

- 설정이 복잡하고 학습 곡선이 가파름
- 동적 변경이 어렵고, 설정 변경 시 전체 규칙을 다시 로드해야 함

#### nftables

**장점**:

- iptables보다 성능이 개선되고 더 적은 코드로 관리 가능
- 하나의 프레임워크에서 IPv4, IPv6, ARP, 브리지 필터링 지원
- 동적 규칙 업데이트가 가능

**단점**:

- 사용법에 대한 자료가 iptables에 비해 상대적으로 적음

#### firewalld

**장점**:

- iptables나 nftables에 비해 편리한 설정 가능
- 존(Zone) 개념을 활용하여 트래픽을 용도에 따라 유연하게 관리 가능
- 동적 규칙 업데이트가 가능

**단점**:

- iptables나 nftables 대비 낮은 커스터마이징 자유도
- 성능이 중요한 환경에서는 문제가 발생할 수 있음

#### ufw

**장점**:

- 사용이 매우 간편하여 초보자도 쉽게 접근 가능
- 직관적인 명령어 사용 (`ufw allow 22/tcp` 등)
- Ubuntu 등에서 기본 제공되므로 추가 설치가 필요 없음

**단점**:

- 세밀한 설정이 어렵고, 복잡한 방화벽 규칙 적용이 어려움
- iptables와 연동되므로 직접적인 nftables 지원 부족

# firewalld

## 1. firewalld란?

firewalld는 방화벽(firewall) + 데몬(deamon)의 합성어로, 주로 RHEL<sup>[1](#footnote_1)</sup> 기반의 운영체제에서 기본적으로 채용하고 있는 방화벽 소프트웨어다. firewalld의 주요 특징은 다음과 같다.

* **동적 방화벽 관리**: 서비스 중단 없이 규칙을 변경 가능  
* **존(Zone) 개념 지원**: 네트워크 인터페이스별로 다른 보안 수준을 적용 가능  
* **서비스 기반 규칙 설정**: 특정 포트가 아닌 서비스 단위로 방화벽 규칙 적용 가능
* **D-Bus API 지원**: GUI 및 명령줄 도구를 통해 쉽게 관리 가능

동적 방화벽 관리 및 유연한 보안 수준 적용이 가능하며 iptables에 비해 설정이 쉽다보니 다양한 리눅스 배포판에서 지원하고 있다. 특히 서버로 많이 사용되는 RHEL 기반의 운영체제를 사용한다면 firewalld의 사용법을 숙지해 두는 것이 좋다.

-----

## 2. Zone(영역)은 무엇일까?
firewalld에서 Zone(이하 영역)은 네트워크 인터페이스와 연결된 신뢰 수준을 정의하는 역할을 한다. 각 영역은 특정한 보안 정책을 가지며, 네트워크 인터페이스에 맞춰 적절한 영역을 설정할 수 있다. 예를들어 외부에 공개된 네트워크의 경우에는 최소한의 접근만 허용하거나 아웃바운드 트래픽만 허용하는 영역으로 설정한다거나, 신뢰할 수 있는 내부 네트워크를 사용하는 경우에는 모든 트래픽을 허용하는 영역으로 설정하는 방식으로 여러 개의 네트워크 인터페이스에 서로 다른 방화벽 규칙을 간편하게 적용할 수 있다. firewalld에서 기본적으로 생성되어 있는 영역의 종류는 다음과 같다.
|영역 명|네트워크 위치|설명|
|---|---|---|
|drop|외부|모든 인바운드 트래픽을 차단하고 아웃바운드 트래픽만 허용.|
|block|외부|모든 인바운드 트래픽을 차단하고 거부 메시지를 반환함. 단, 시스템 내에서 시작된 네트워크 연결은 모두 허용.|
|public|외부|최소한의 접근만 허용. **(기본 영역)**|
|external|외부|공유기와 같이 라우터의 마스커레이딩이 활성화 된 외부 네트워크에서 사용. 최소한의 접근만 허용.|
|dmz|외부|DMZ 영역에서 사용하는 영역. 내부 네트워크에 대한 최소한의 접근만 허용.|
|work|내부|업무용 네트워크 영역. 최소한의 접근만 허용.|
|home|내부|가정용 네트워크 영역. 최소한의 접근만 허용.|
|internal|내부|내부 네트워크 영역. 최소한의 접근만 허용.|
|trusted|내부|모든 접근 허용.|

위의 영역은 자주 쓰이는 영역을 프리셋화 한 것이고, 필요에 따라 새로운 영역을 생성할 수도 있다. 또한, 어플리케이션이 설치되는 과정에서 자동으로 영역이 생성되는 경우도 있다. (EX. 도커)

-----

## 3. firewalld 명령어
#### 3-1. 기본 명령어
##### firewalld 상태 확인
현재 firewalld가 동작중인지 확인합니다:
```Console
# firewall-cmd --state
```

##### 방화벽 규칙 즉시 적용 후 저장
변경된 규칙이 있을 경우 즉시 저장하고 적용합니다:
```Console
# firewall-cmd --reload
```

#### 3-2. 영역 관련 명령어

##### 사용 가능한 영역 확인
현재 firewalld에서 사용 가능한 모든 영역을 확인합니다:
```Console
# firewall-cmd --get-zones
```

##### 현재 활성화된 영역 확인
모든 네트워크 인터페이스가 어떤 영역에 존재하는지 확인합니다 (사용되지 않는 영역은 표시되지 않음):
```Console
# firewall-cmd --get-active-zones
```

##### 기본 영역 확인
지정된 기본 영역을 확인합니다:
```Console
# firewall-cmd --get-default-zone
```

##### 특정 영역의 설정 확인
지정한 영역의 상세 설정을 확인합니다 (지정된 영역이 없는 경우 기본 영역의 상세 설정이 표시됨):
```Console
# firewall-cmd --zone=public --list-all
```

##### 특정 인터페이스의 영역 설정 확인
지정한 인터페이스의 영역을 조회합니다.
```Console
# firewall-cmd --get-zone-of-interface=eth0
```

##### 기본 영역 변경
지정한 영역을 기본 영역으로 변경합니다.
```Console
# firewall-cmd --set-default-zone=internal
```

##### 특정 인터페이스의 영역 변경
지정한 인터페이스의 영역을 지정한 영역으로 변경합니다. `--permanent` 옵션을 사용하면 영구적으로 변경합니다.
```Console
# firewall-cmd --zone=internal --change-interface=eth1 --permanent
```

#### 3-3. 포트 기반 허용/차단 명령어
##### 포트 허용
`--zone=` 옵션에 선언된 영역에 지정된 프로토콜의 포트를 엽니다. `--zone=`옵션을 지정하지 않을 경우, `default-zone` 영역에 포트를 엽니다. `--permanent` 옵션을 사용하면 영구적으로 변경합니다.
```Console
# firewall-cmd --add-port=80/tcp --permanent
# firewall-cmd --zone=public --add-port=443/tcp --permanent
# firewall-cmd --zone=public --add-port=443/udp --permanent
```

##### 포트 차단
`--zone=` 옵션에 선언된 영역에 지정된 프로토콜의 포트를 차단합니다. `--zone=`옵션을 지정하지 않을 경우, `default-zone` 영역에 포트를 차단합니다. `--permanent` 옵션을 사용하면 영구적으로 변경합니다.
```Console
# firewall-cmd --remove-port=80/tcp --permanent
# firewall-cmd --zone=public --remove-port=443/tcp --permanent
# firewall-cmd --zone=public --remove-port=443/udp --permanent
```

#### 3-4. 서비스 기반 허용/차단 명령어
##### 서비스 허용
`--zone=` 옵션에 선언된 영역에 지정된 서비스를 엽니다. `--zone=`옵션을 지정하지 않을 경우, `default-zone` 영역에 서비스를 엽니다. `--permanent` 옵션을 사용하면 영구적으로 변경합니다.
```Console
# firewall-cmd --add-service=http --permanent
# firewall-cmd --zone=public --add-service=https --permanent
```
##### 서비스 차단
`--zone=` 옵션에 선언된 영역에 지정된 서비스를 차단합니다. `--zone=`옵션을 지정하지 않을 경우, `default-zone` 영역의 서비스를 차단합니다. `--permanent` 옵션을 사용하면 영구적으로 변경합니다.
```Console
# firewall-cmd --remove-service=http --permanent
# firewall-cmd --zone=public --remove-service=https --permanent
```
-----

<a name="footnote_1">1</a>. RHEL 7 이상만 해당한다.