# 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 이상만 해당한다.