VMware로 인프라 구축할 때 매번 막히는 부분이 생기면 대부분의 경우가 이 방화벽이었다.
정확이 이게 뭐고 왤캐 나를 걸고 넘어지는지 알아봐야겠다.
목차
- 방화벽(Firewall)이란?
- 네트워크 트래픽 흐름을 제어하는 보안 장치
- 방화벽의 계층적 분류
- 호스트 기반 방화벽
- 네트워크 기반 방화벽
- 애플리케이션 방화벽
- 방화벽 계층별 역할
- Layer 3~4: 패킷 차단 중심 (iptables, ASA 등)
- Layer 7: 콘텐츠 기반 필터링 (WAF 등)
- 호스트 기반 방화벽의 개념과 특징
- 개별 서버에서의 포트 제어
- 기본적으로 모든 트래픽을 막는다
- 리눅스에서 사용되는 대표 도구: iptables, firewalld, ufw
- Rocky Linux의 firewalld 구조 이해
- firewalld는 iptables 위에서 동작하는 인터페이스
- Zone 기반 모델 설명
- 기본 제공 Zone 종류와 보안 수준
- --permanent, --reload, 서비스 단위 관리
- 실습: Apache 웹 서버에서 방화벽 설정하기
- httpd 설치 및 페이지 작성
- firewalld를 이용한 HTTP 포트 열기
- ss, curl로 서비스 확인
- HTTPS 설정 예시 포함
- 회고: 이제야 방화벽이 보인다
- 명령어 외우기보다는 구조 이해가 먼저
- 실무에 필요한 방화벽 체크리스트 필요성
방화벽(Firewall)
네트워크 트래픽의 흐름을 제어하여 불필요하거나 악의적인 접근을 차단하는 보안 장치
1. 호스트 기반 방화벽
2. 네트워크 기반 방화벽
3. 애플리케이션 방화벽
이렇게 계층적으로 구성되어 있다.
방화벽의 계층적 구조
호스트 기반 방화벽
VM을 하나 만들면 설정해줘야하는 방화벽이 이것이다.
개별 서버에서 포트를 제어하고 서버 단위로 접근을 제어한다.
ex) iptables, firewalld(Rocky), ufw(Debian)
네트워크 기반 방화벽
라우터, 게이트웨이 또는 전용 장비에서 네트워크 흐름 제어
사설망 <->외부망 구간 통제함
ex) Cisco ASA, Fortigate, AWS Security Group
애플리케이션 방화벽
HTTP 요청에 포함된 악성 문자열, SQL 인젝션, 경로 우회 등 감지
웹 애플리케이션 취약점 대응
ex) ModSecurity, AWS WAF, Cloudflare
이렇게 3,4 계층에서의 방화벽과 7 계층에서의 방화벽으로 계층적으로 접근을 제어해 보안을 높이려하는 것
지금까지 실습에서 항상 신경을 써줘야 했던간
호스트 기반 방화벽이었다.
이 방화벽에 대해 더 자세하게 알아보겠다.
호스트 기반 방화벽
개별 컴퓨터(호스트, 서버, 가상머신)에 설치되어
그 호스트 자체로 들어오거나 나가는 네트워크 트래픽을 제어하는 보안 시스템
기본적으로 방화벽에는 아래와 같이 적용해 보안을 높이고 있다.
1. 최소 권한 원칙: 꼭 필요한 것만 열기
2. 명시적 허용, 암시적 거부: 요청하기 전까지는 거부가 기본
3. 계층적 방화벽을 두어 보안 강화: 여러 방화벽을 두어 보안 UP
여기서 왜 내가 항상 방화벽에서 막혔는지 알 수 있다.
방화벽은 기본적으로 설정을 안해주면 다 막아버리기 때문이다.
웹 서버용으로 VM을 만들고 httpd 패키지를 설치해도, 방화벽에서 포트를 열어주지 않으면 접속할 수 없었다.
이런 걸 막고 허용해주는게 호스트 기반 방화벽이었다.
리눅스 기반의 호스트 방화벽은
netfilter 라는 리눅스 커널 기능을 기반으로 만든 리눅스 방화벽 엔진인 iptables 가 있고
그걸 사용하기 편리하게 만든게
Rocky 에서 사용하는 게 firewalld
Ubuntu가 속한 Debian 계열에서는 ufw를 사용한다.
먼저 firewalld에 대해 알아보겠다.
Rocky의 firewalld
firewalld는 iptables에 여러 기능이 추가되어 편리하게 사용할 수 있게 해주는 방화벽 프레임워크
특징
Zone 기반 모델
미리 정의된 zone과 자신만의 zone을 만들 수도 있다.
zone에는 인터페이스를 넣어 구성할 수 있다.
미리 정의된 zone에는 기본 정책이 설정되어 있고 변경이 불가능하다.
Zone | 이름기본 | 정책사용 대상 위치 | 보안 수준 | 설명 |
trusted | 모든 트래픽 허용 (ACCEPT ALL) | 매우 안전한 내부망, VPN 터널 | 🔓 매우 낮음 | 모든 포트/서비스 허용, 위험! 실습/내부망 한정 |
public | 기본 DROP (명시된 것만 허용) | 일반 서버 외부 노출용 | 🔒 보통 | 인터넷에 노출되는 웹서버 등에 기본 설정 |
external | 기본 DROP + Masquerade 활성화 | 라우터의 외부 NIC, WAN | 🔒 보통~높음 | NAT 라우터나 인터넷 연결 서버에서 사용 |
internal | 기본 DROP | DB, 파일 서버, 내부망 전용 서버 | 🔒 보통 | 외부 접근 불필요한 서버 간 통신용 |
dmz | 기본 DROP | DMZ 구간 (반공개 서버) | 🔒 중간 | HAPROXY, 중간 프록시, 모니터링 등 |
drop | 모든 요청 차단 + 응답 없음 | 공격 대응, honeypot | 🔐 매우 높음 | 패킷을 아예 무시 (Stealth Mode) |
block | 모든 요청 차단 + ICMP 응답만 허용 | 탐지 가능한 차단 | 🔐 매우 높음 | DROP과 달리 응답(RST, ICMP)만 반환 |
home | 기본 DROP, 홈/사설망 대상 | 내부 네트워크 (SOHO 환경) | 🔒 보통 | 공유기 하단 클라이언트용 |
work | 기본 DROP, 사무실 네트워크용 | 기업 내부망 사용자 | 🔒 보통 | 프린터, NAS와 통신 허용 등 |
nm-shared | 기본 허용, 네트워크 공유용 | NetworkManager 전용 공유 NIC | ⚠️ 낮음 | 일반적으로 사용하지 않음 (주의) |
실습에서는 2개의 인터페이스를 external와 internal에 넣어 구성했다.
영구/일시 설정 분리
`--permanent` 옵션 유무로 설정 지속 여부 결정
동적 적용
`firewall-cmd --reload` 로 설정을 재부팅 하지 않아도 즉시 반영 시킬 수 있다.
서비스 단위 관리
포트 대신 http, dns 같은 서비스명으로 제어 `-add-service=http`
이게 `80/tcp`랑 완전 동일
인터페이스 단위 제어
특정 NIC에만 Zone 적용 가능 `--change-interface=ens160`
백엔드 엔진 선택 가능
iptables 또는 nftables 사용 가능 `firewall-cmd --backend`
Web 서버 방화벽 설정 실습
웹서버에서 방화벽을 어떻게 설정해야 할지 알아보자
#########################################
# 1. Apache 설치 및 서비스 시작
#########################################
dnf install -y httpd # Apache 웹서버(httpd) 설치
systemctl enable --now httpd # 부팅 시 자동 실행 설정 + 즉시 실행
systemctl status httpd # 서비스 상태 확인 (active여야 정상)
#########################################
# 2. 기본 웹 페이지 작성
#########################################
echo "Hello Dawon!" > /var/www/html/index.html # 기본 웹페이지 내용 설정
#########################################
# 3. firewalld 설정 – HTTP 포트 허용
#########################################
firewall-cmd --get-active-zones # 현재 NIC에 연결된 Zone 확인
firewall-cmd --zone=public --add-service=http --permanent # HTTP 서비스 허용
firewall-cmd --reload # 설정 반영 (영구 설정 시 필수)
firewall-cmd --zone=public --list-all # 설정 확인 (http가 services에 있어야 함)
#########################################
# 4. 포트 열려 있는지 확인
#########################################
ss -tuln | grep :80 # 80번 포트가 LISTEN 상태인지 확인
curl http://localhost # 로컬 테스트
# 또는 외부에서:
# curl http://<서버_IP>
# 브라우저에서 http://<서버_IP> 접속
#########################################
# [선택] HTTPS도 열고 싶을 경우
#########################################
dnf install -y mod_ssl # SSL 모듈 설치
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --reload
마무리
배운 걸 바탕으로 기업 인프라를 혼자 구성해보고 있었는데
방화벽이 뭔지 이해하지 못한 채 그냥 명령어만 작성하고 있었는데
이렇게 간단하게나마 정리하니까 방화벽 설정할 때 도움이 될 거 같다.
트러블슈팅의 대부분이 이거였는데
적절한 방화벽 관련 체크리스트 하나 만드는 것도 좋을 것 같다.
'공부일지 > 개인학습' 카테고리의 다른 글
[SAA 도전기] #00 SAA 가보자고 (3) | 2025.04.30 |
---|---|
Nginx로 스트리밍 서버 만들기 (2) | 2025.04.26 |
NGINX, 러시아에서 태어난 웹 서버 (0) | 2025.04.21 |
[Docker #2] 이미지와 컨테이너 (1) | 2025.04.19 |
애플리케이션 빌드/ 도커 빌드 (1) | 2025.04.18 |