1. 배포판별 방화벽 도구 확인
서버의 운영체제에 따라 기본적으로 활성화되어 있는 도구가 다릅니다. 먼저 현재 시스템에서 어떤 도구를 사용하는지 확인해야 합니다.
| 배포판 | 기본 방화벽 도구 | 특이사항 |
|---|---|---|
| CentOS 7+, RHEL 7+, Fedora | firewalld | 동적 규칙 관리 방식 |
| Ubuntu, Debian | ufw | iptables의 간소화 버전 |
| CentOS 6, 레거시 시스템 | iptables | 모든 리눅스 커널의 표준 |
현재 상태 확인 명령:
# firewalld 상태 확인
systemctl status firewalld
# ufw 상태 확인
ufw status
# iptables 규칙 리스트 출력
iptables -L -n
2. firewalld (RHEL/CentOS 계열)
firewalld는 'Zone(구역)' 개념을 사용하여 네트워크 신뢰도에 따라 규칙을 관리합니다. 설정을 변경해도 연결이 끊기지 않는 동적 관리가 특징입니다.
주요 Zone 개념
- public: 기본값. 공용 네트워크에서 사용하며 선택한 서비스만 허용합니다.
- trusted: 모든 네트워크 연결을 신뢰합니다.
- drop: 들어오는 모든 패킷을 응답 없이 버립니다.
핵심 설정 명령어
# 방화벽 시작 및 부팅 시 자동 실행 설정
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 특정 포트 허용 (예: 8080/TCP) - 영구 적용
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
# 특정 서비스 허용 (예: HTTPS)
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --reload
# 특정 IP 주소 차단 (Rich Rule 활용)
sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.50' reject"
sudo firewall-cmd --reload
# 현재 활성화된 전체 규칙 확인
sudo firewall-cmd --list-all
3. iptables (전통적인 규칙 관리)
iptables는 Chain(INPUT, OUTPUT, FORWARD)을 기반으로 패킷을 처리합니다. 규칙의 순서가 매우 중요하며 위에서부터 순차적으로 적용됩니다.
기본 정책 및 규칙 설정
# 모든 규칙 초기화
iptables -F
# 기본 정책을 DROP으로 설정 (보안 강화)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 루프백(localhost) 통신 허용 (필수)
iptables -A INPUT -i lo -j ACCEPT
# 이미 연결된 세션의 패킷 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH(22), HTTP(80) 포트 개방
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 특정 IP(10.0.0.5)로부터의 접속 차단
iptables -A INPUT -s 10.0.0.5 -j DROP
※ iptables 설정은 메모리에서 동작하므로, 서버 재부팅 후에도 유지하려면 iptables-services 패키지를 통해 저장하거나 iptables-save 명령을 사용해야 합니다.
4. ufw (Ubuntu/Debian 계열)
사용자 친화적인 인터페이스를 제공하며, 복잡한 iptables 명령어를 직관적으로 사용할 수 있게 설계되었습니다.
기본 사용법
# ufw 활성화
sudo ufw enable
# 기본 정책 설정
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 포트 허용 및 차단
sudo ufw allow 443/tcp
sudo ufw deny 23/tcp
# 특정 서브넷의 접근 허용
sudo ufw allow from 192.168.1.0/24
# 규칙 삭제 (번호 확인 후 삭제)
sudo ufw status numbered
sudo ufw delete [규칙번호]
5. 실무 적용 시나리오
시나리오 1: 웹 서버 보안 설정
웹 서비스(80, 443)와 원격 관리(22) 포트만 열고 나머지는 모두 닫는 구성입니다.
# firewalld 기준
sudo firewall-cmd --permanent --add-service={http,https,ssh}
sudo firewall-cmd --reload
# ufw 기준
sudo ufw allow 80,443,22/tcp
sudo ufw enable
시나리오 2: 특정 IP에서만 데이터베이스 접속 허용
MySQL(3306) 포트를 관리자 PC(211.1.2.3)에서만 접속 가능하도록 제한합니다.
# firewalld Rich Rule 활용
sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='211.1.2.3' port protocol='tcp' port='3306' accept"
sudo firewall-cmd --reload
# ufw 활용
sudo ufw allow from 211.1.2.3 to any port 3306
6. 운영 시 주의사항
- SSH 접속 유지: 방화벽 설정을 처음 활성화할 때 SSH 포트(기본 22번)를 먼저 허용하지 않으면 원격 접속이 끊겨 서버에 접근할 수 없게 됩니다.
- 영구 적용 확인: firewalld의 경우
--permanent옵션 유무를 확인하고, iptables는 별도의 저장 과정을 거쳤는지 반드시 점검해야 합니다. - 규칙 순서: iptables를 직접 수정할 때는 거부(DROP) 규칙이 허용(ACCEPT) 규칙보다 상단에 위치하여 중요한 통신이 차단되지 않도록 순서를 조정해야 합니다.