대상 OS: Rocky Linux 9

서버 보안에서 가장 흔한 사고는 “필요 없는 포트가 열려 있었다”로 끝납니다.
서비스가 늘고, 테스트 규칙이 남고, 어느 순간 방화벽이 누더기가 되죠.
그래서 방화벽은 단순히 ‘막는다’가 아니라, 네트워크 구역(공용/내부/관리망)을 나누고 그 구역마다 노출면을 설계하는 작업입니다.
Rocky Linux 9의 firewalld는 zone(존)과 service(서비스) 개념으로 이 설계를 운영 친화적으로 만들 수 있습니다.

이 글은 firewalld 존/서비스를 이용해 “공용망은 최소만, 내부망은 필요한 것만” 노출하도록 구성하고, rich rule로 예외를 다루며, 런타임/영구 규칙 차이와 점검/롤백까지 실전 운영 관점으로 정리합니다.

---

1) firewalld를 zone 기반으로 써야 하는 이유

1)

인터페이스(또는 소스 대역)별로 보안 정책을 분리할 수 있다

2)

서비스 이름 단위로 허용/차단을 관리해 규칙이 읽기 쉬워진다

3)

예외는 rich rule로 최소 범위만 열 수 있다

4)

런타임/영구 규칙이 분리되어, 실수로 재부팅 후 정책이 사라지거나 반대로 영구 적용되는 사고를 줄일 수 있다

---

2) 현재 상태 스냅샷(변경 전)

1)

firewalld 동작 여부

sudo systemctl status firewalld --no-pager

2)

활성 존/인터페이스 확인

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --get-default-zone

3)

현재 존별 설정 덤프

sudo firewall-cmd --list-all
sudo firewall-cmd --list-all --zone=public

4)

실제 리스닝 포트와 교차 확인

sudo ss -ltnp | head -n 80
sudo ss -lunp | head -n 80

방화벽 규칙과 실제 리스닝 포트는 반드시 같이 봐야 합니다.

---

3) 존 설계 예시(공용/내부/관리망)

예시 목표
- public 존: 외부에 공개할 서비스만(예: 80/443)
- internal 존: 내부망에서만 접근할 서비스(예: 모니터링)
- mgmt 존(선택): 점프서버/VPN에서만 SSH 허용

중요: 어떤 인터페이스가 어느 존인지 명확히 해야 합니다.

1)

네트워크 인터페이스 확인

ip -br a

2)

존 목록 확인

sudo firewall-cmd --get-zones

---

4) 인터페이스를 존에 바인딩(영구 설정 권장)

예시로
- eth0 = public
- eth1 = internal
이라고 가정합니다.

1)

영구로 존 설정

sudo firewall-cmd --permanent --zone=public --change-interface=eth0
sudo firewall-cmd --permanent --zone=internal --change-interface=eth1

2)

리로드

sudo firewall-cmd --reload
sudo firewall-cmd --get-active-zones

주의
- 원격 서버에서 eth0가 SSH 경로라면, 규칙을 먼저 열고(zone 바인딩은 마지막) 적용하세요.
- 콘솔 접근이 없으면 한 번의 실수로 잠길 수 있습니다.

---

5) public 존: 최소 서비스만 허용(HTTP/HTTPS)

1)

현재 public 허용 목록 확인

sudo firewall-cmd --zone=public --list-all

2)

필요 서비스만 추가(영구)

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

3)

리로드 후 확인

sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-services

운영 팁
- 포트를 직접 열기(--add-port)보다, 가능한 서비스 이름(--add-service)을 우선 사용하세요.
- 서비스 정의가 없으면 그때 포트를 직접 여는 게 낫습니다.

---

6) internal 존: 내부에서만 필요한 포트 허용

예를 들어 node exporter(9100/tcp)는 내부 모니터링에서만 접근하게 합니다.

1)

내부망에서만 9100 허용

sudo firewall-cmd --permanent --zone=internal --add-port=9100/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --zone=internal --list-ports

이 방식은 “서비스는 켜져 있어도 외부(public)에서는 접근 불가”라는 운영 표준을 만들기 좋습니다.

---

7) SSH를 더 안전하게: rich rule로 ‘관리망만 허용’

SSH는 가장 민감한 포트입니다.
가능하면 public 존에서 SSH를 아예 열지 말고, 특정 소스 대역에서만 허용하세요.

예: 공용 인터페이스(public 존)에서 SSH는 사무실 IP만 허용

1)

rich rule 추가(영구)

sudo firewall-cmd --permanent --zone=public \
  --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" service name="ssh" accept'

2)

리로드 및 확인

sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-rich-rules

주의
- source address는 실제 관리망/점프서버 IP로 바꾸세요.
- IP가 유동적이면 VPN/점프서버를 먼저 마련하는 쪽이 더 안정적입니다.

---

8) 런타임 vs 영구(permanent): 운영 사고를 막는 규칙

1)

런타임 규칙

- 즉시 반영
- 재부팅/리로드 후 사라질 수 있음

2)

영구 규칙(--permanent)

- 리로드 후 반영
- 서버 재부팅 후에도 유지

운영 표준
- 긴급 대응(테스트)은 런타임으로 먼저
- 문제 없으면 permanent로 승격

런타임 테스트 예시

sudo firewall-cmd --zone=public --add-service=http
sudo firewall-cmd --zone=public --remove-service=http

---

9) 점검 루틴: “열려 있는 것”을 정기적으로 확인

1)

존별 서비스/포트 덤프

sudo firewall-cmd --list-all --zone=public
sudo firewall-cmd --list-all --zone=internal

2)

실제 노출 포트 확인(중요)

sudo ss -ltnp | head -n 120
sudo ss -lunp | head -n 120

3)

설정 파일 백업(재해복구)

sudo tar -czf /root/firewalld.backup.$(date +%F_%H%M%S).tgz /etc/firewalld

---

10) 롤백/긴급 복구

원격으로 잠길 위험이 있으면, 롤백 커맨드를 알고 있어야 합니다.

1)

firewalld 비활성화(긴급용)

sudo systemctl stop firewalld

2)

영구 설정을 되돌리기(백업 복원)

sudo tar -xzf /root/firewalld.backup.*.tgz -C /
sudo systemctl restart firewalld

주의
- stop firewalld는 “방화벽을 끈다”는 의미라 매우 위험합니다.
- 정말 긴급한 경우에만, 그리고 상위 방화벽/관리망이 있는 환경에서만 고려하세요.

---

마무리

Rocky Linux 9에서 firewalld를 zone 기반으로 운영하면, 방화벽이 “규칙 나열”이 아니라 “노출면 설계”로 바뀝니다.
public은 최소만, internal은 필요한 것만, SSH는 rich rule로 소스 제한.
이 원칙만 지켜도 운영 서버의 공격면이 눈에 띄게 줄어듭니다.

정리하면
- 존(공용/내부/관리)을 명확히 하고
- 인터페이스를 존에 고정하고
- 서비스/포트를 최소 허용으로 관리하고
- 런타임→영구 승격 절차와 점검/롤백을 표준화

이 흐름이 firewalld를 ‘운영 가능한 보안’으로 만들어 줍니다.