Firewalld 설정 가이드¶
Firewalld는 Rocky Linux에서 기본으로 사용하는 방화벽 데몬임.
외부 접근 제어를 위해 필수적으로 설정함.
Node.js(3000), DB(3306), Redis(6379) 등 내부 서비스 포트는 외부에 개방하지 않음.
1. firewalld 설치¶
sudo dnf install -y firewalld
2. firewalld 서비스 시작 및 활성화¶
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo systemctl status firewalld
Active Zone 확인¶
sudo firewall-cmd --get-active-zones
3. SSH 허용¶
기본 예시¶
sudo firewall-cmd --permanent --add-service=ssh
위 방식은 SSH를 전체 소스에 대해 허용하는 기본 예시임.
Gateway / 운영 서버 권장¶
Main Gateway 또는 운영 서버에서 SSH를 내부망으로만 제한하려면
전역 ssh service 허용 대신 source 제한 rule 을 사용함.
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept'
- 위 방식은
192.168.0.0/24에서 오는 SSH만 허용함 - 운영 환경에서는 관리망 CIDR 에 맞게 주소 대역을 조정함
- 기본 예시와 내부망 제한 예시는 동시에 사용하지 않음
4. 서비스 기반 허용 (http / https)¶
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
5. 포트 커스텀¶
sudo firewall-cmd --permanent --add-port=[PORT]/tcp
6. cockpit 설정 제거¶
sudo firewall-cmd --remove-service=cockpit --permanent
sudo dnf remove cockpit -y
7. 설정 적용 및 확인¶
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --list-all
8. AllowZoneDrifting 비활성화¶
Rocky Linux 9 (firewalld ≥ 0.9 / nftables backend)에서는 AllowZoneDrifting 옵션이 완전히 제거됨.
AllowZoneDrifting이란?¶
AllowZoneDrifting은 과거 iptables 기반 firewalld에서 존재하던 legacy 기능으로,
- 트래픽이 여러 zone 규칙을 넘나들며 처리될 수 있음
- 보안 정책의 일관성이 깨질 수 있음
- 의도하지 않은 포트/서비스 허용 가능성 존재
이로 인해 보안 모델 혼란을 유발하는 문제점이 있었음.
현재 상태 (중요)¶
- firewalld 0.9 이상부터 해당 옵션 제거
- nftables 백엔드에서는 구조적으로 불필요
/etc/firewalld/firewalld.conf에 설정 항목이 존재하지 않는 것이 정상
👉 Rocky Linux 9 환경에서는
👉 별도 설정이나 비활성화 작업이 필요 없음
운영 기준 정리¶
- Rocky Linux 8 이하 (iptables 기반): 비활성화 필요
- Rocky Linux 9 이상 (nftables 기반): 옵션 자체가 없음 → 조치 불필요
AllowZoneDrifting 관련 설정을 시도하려다
설정 항목이 보이지 않는 것은 오류가 아니라 정상 동작임.
만약 존재한다면
반드시 비활성화
AllowZoneDrifting는 트래픽이 여러 zone 규칙을 넘나들며 처리되는 legacy 기능임.
보안 정책의 일관성을 해치고 의도하지 않은 포트 허용이 발생할 수 있으므로
서버 환경에서는 반드시 비활성화함.
/etc/firewalld/firewalld.conf 파일 수정.
sudo vi /etc/firewalld/firewalld.conf
AllowZoneDrifting=no
설정 적용 후 firewalld 재시작.
sudo systemctl restart firewalld
9. Packet Forwarding 비활성화¶
서버가 Router / NAT Gateway / VPN Gateway 와 같이 Linux Kernel의 Packet Forwarding 기능을 사용하는 역할이 아닌, Nginx Reverse Proxy, Node.js, Next.js, Laravel, PHP-FPM 등의 구조는 모두 애플리케이션 레벨에서 upstream 서버로 새로운 TCP 연결을 생성하는 방식으로 동작함. 즉, Linux Kernel 의 Packet Forwarding 기능과는 무관함.
따라서 일반적인 웹 애플리케이션 서버 및 Reverse Proxy 서버에서는 Firewalld의 forward 기능이 필요하지 않으며, 명시적으로 비활성화하는 것을 권장함.
일반적인 웹 애플리케이션 서버 또는 Reverse Proxy 서버는 다음과 같은 구조로 동작함.
Internet
↓
공유기 (Port Forward)
↓
Gateway Server (Nginx Reverse Proxy)
↓
Internal Servers (192.168.0.0/24)
즉
- HTTP 요청을 수신하고
- 내부 backend 서버로 새 TCP 연결을 생성
할 뿐.
Nginx는 애플리케이션 레벨 Reverse Proxy로 동작하며 Linux Kernel의 Packet Forwarding 기능을 사용하지 않음
즉 HTTP 요청을 받아 내부 서버로 새로운 TCP 연결을 생성할 뿐이며 패킷을 라우팅하는 L3 Router 역할은 수행하지 않음
따라서 Firewalld의 forward 기능은 필요하지 않으며 비활성화하는 것을 권장
Packet Forwarding이란¶
Packet Forwarding은 서버가 패킷을 다른 네트워크로 전달하는 기능
주로 다음과 같은 서버에서 사용
- Router
- NAT Gateway
- VPN Gateway
- Network Bridge
- L3 Network Device
이러한 서버는 네트워크 인터페이스 간에 패킷을 전달해야 하므로 Linux Kernel의 forwarding 기능이 필요함.
Forward가 활성화되어 있을 경우 위험¶
불필요한 Forward 기능이 활성화되어 있으면 다음과 같은 위험이 존재
- 서버가 의도치 않게 L3 Router처럼 동작할 가능성
- 내부망 트래픽 전달 가능성 증가
- 방화벽 정책 복잡도 증가
- 보안 정책의 명확성 저하
따라서 웹 애플리케이션 서버 및 Reverse Proxy 서버에서는 Packet Forwarding을 비활성화하는 것이 권장
현재 Forward 상태 확인¶
sudo firewall-cmd --zone=public --query-forward
출력 예시
yes
Forward 비활성화¶
sudo firewall-cmd --permanent --zone=public --remove-forward
sudo firewall-cmd --reload
적용 확인¶
sudo firewall-cmd --zone=public --query-forward
정상 상태
no
운영 기준¶
Reverse Proxy Gateway 서버에서는 다음 정책을 사용함.
| 정책 | 설정 |
|---|---|
| http | 허용 |
| https | 허용 |
| ssh | 내부망만 허용 |
| forward | 비활성화 |
비고¶
Packet Forwarding을 비활성화하더라도 Nginx Reverse Proxy 동작에는 영향이 없음.
이는 Nginx가 Kernel Packet Forwarding을 사용하는 것이 아니라
애플리케이션 레벨에서 내부 서버로 새로운 TCP 연결을 생성하는 방식이기 때문임.