지난 3회차에서는 로그를 실시간으로 분석하여 공격자를 자동으로 차단하는 능동형 보안 도구인 Fail2ban에 대해 알아보았습니다. Fail2ban이 침입자를 잡아내는 '형사' 역할이라면, 그 형사가 체포한 범인을 가두는 '감옥'이자 서버로 들어오는 모든 트래픽의 통행증을 검사하는 '성문' 역할을 하는 것이 바로 방화벽(Firewall)입니다.
리눅스 커널 내부에는 네트워크 패킷을 필터링하는 강력한 서브시스템인 nftables(과거 iptables)가 내장되어 있습니다. 하지만 이 커널 방화벽을 직접 제어하는 명령어는 문법이 매우 복잡하고 진입 장벽이 높습니다. 이를 해결하기 위해 리눅스 진영에서는 관리자가 쉽고 직관적으로 방화벽 규칙을 제어할 수 있는 관리 도구를 제공하는데, 그것이 바로 데비안/우분투 계열의 UFW와 레드햇/로키리눅스 계열의 Firewalld입니다.
연재 네 번째 시간인 이번 글에서는 리눅스 방화벽의 두 축인 UFW와 Firewalld의 작동 메커니즘을 이해하고, 실무에서 즉시 활용할 수 있는 포트 제어, IP 차단, 정책 관리 기법을 예시와 함께 완벽히 마스터해 보겠습니다.
방화벽 설정을 시작하기 전, 모든 인프라 엔지니어가 가슴에 새겨야 할 대원칙이 있습니다. 바로 '화이트리스트(Whitelist) 정책'입니다.
모든 포트를 열어두고 나쁜 IP나 포트만 찾아 차단하는 방식(블랙리스트)은 새로 등장하는 위협을 막을 수 없습니다. 가장 안전한 방화벽 운영 방식은 외부에서 서버로 들어오는 모든 접근(Inbound 트래픽)을 일단 완전히 차단한 뒤, 서비스 운영에 반드시 필요한 포트(예: SSH, HTTP, HTTPS)와 신뢰할 수 있는 IP에 대해서만 송곳처럼 예외적으로 구멍을 뚫어 허용하는 것입니다. 반대로 서버에서 외부로 나가는 트래픽(Outbound 트래픽)은 기본적으로 모두 허용하여 패키지 업데이트나 외부 API 호출에 지장이 없도록 구성합니다.
UFW는 이름 그대로 '복잡하지 않은 방화벽'입니다. 직관적인 문장형 문법을 사용하여 초보자도 쉽게 방화벽 규칙을 적용할 수 있습니다.
UFW를 처음 사용할 때는 방화벽의 기본 뼈대(인바운드 차단, 아웃바운드 허용)를 먼저 세워야 합니다.
Bash
# 기본 정책 설정
sudo ufw default deny incoming
sudo ufw default allow outgoing
# [매우 중요] 현재 접속 중인 SSH 포트를 반드시 먼저 허용해야 합니다.
# 2회차에서 포트를 22022로 바꿨다고 가정하고 예시를 들겠습니다.
sudo ufw allow 22022/tcp
# 방화벽 서비스 활성화 (경고 문구가 나오면 y를 누릅니다)
sudo ufw enable
비즈니스 환경에 맞는 다양한 예외 규칙을 추가하는 방법입니다.
Bash
# 예시 1: 웹 서버 운영을 위한 HTTP(80) 및 HTTPS(443) 포트 전체 개방
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 예시 2: 특정 신뢰할 수 있는 관리자 IP(예: 211.234.56.78)에서만 데이터베이스(MySQL: 3306) 포트 접근 허용
sudo ufw allow from 211.234.56.78 to any port 3306 proto tcp
# 예시 3: 악의적인 공격을 일삼는 특정 대역의 IP(예: 198.51.100.0/24)를 통째로 차단
sudo ufw deny from 198.51.100.0/24
방화벽에 적용된 규칙들을 한눈에 확인하고, 더 이상 필요 없는 규칙을 제거하는 방법입니다.
Bash
# 적용된 방화벽 규칙 번호와 함께 보기
sudo ufw status numbered
출력 결과로 [ 1] 22022/tcp ALLOW IN Anywhere 형식의 목록이 나옵니다. 특정 규칙을 지우고 싶다면 번호를 지정해 간단히 삭제할 수 있습니다.
Bash
# 3번에 위치한 방화벽 규칙 삭제
sudo ufw delete 3
Firewalld는 UFW보다 한 단계 더 고도화된 '영역(Zone)'이라는 개념을 사용합니다. 네트워크 인터페이스(예: eth0, wlan0)마다 서로 다른 보안 등급의 영역을 지정하여, 하나의 서버 안에서도 네트워크 망에 따라 각기 다른 방화벽 규칙을 유연하게 적용할 수 있는 강력한 도구입니다.
별도의 설정을 하지 않는다면 기본적으로 public 영역이 활성화되어 모든 인터페이스에 적용됩니다.
Bash
# Firewalld 서비스 활성화 및 시작
sudo systemctl enable firewalld
sudo systemctl start firewalld
# 방화벽 현재 상태 및 기본 영역 확인
sudo firewall-cmd --state
sudo firewall-cmd --get-default-zone
Firewalld에서 규칙을 추가할 때 주의할 점은 --permanent 옵션의 유무입니다. 이 옵션을 넣지 않으면 규칙이 즉시 반영되지만 서버를 재부팅하면 사라집니다. 실무에서는 영구 적용 옵션을 주고 방화벽을 재로드(Reload)하는 방식을 사용합니다.
Bash
# 예시 1: 2회차에서 변경한 커스텀 SSH 포트(22022) 영구 허용
sudo firewall-cmd --permanent --add-port=22022/tcp
# 예시 2: 웰노운(Well-Known) 서비스명 기반으로 웹 트래픽(HTTP/HTTPS) 허용
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 예시 3: 변경 사항을 시스템에 최종 반영 (반드시 실행 필요)
sudo firewall-cmd --reload
Firewalld의 진가는 특정 IP를 특정 영역에 매핑하여 격리할 때 발휘됩니다.
Bash
# 예시 1: 사내 내부망 IP 대역(10.0.0.0/24)을 'internal' 영역에 등록하고, 해당 대역에는 모든 포트 개방
sudo firewall-cmd --permanent --zone=internal --add-source=10.0.0.0/24
sudo firewall-cmd --permanent --zone=internal --add-service=ssh
# 예시 2: 특정 공격자 IP(203.0.113.50)를 패킷을 아예 버리는 'drop' 영역에 넣어 격리
sudo firewall-cmd --permanent --zone=drop --add-source=203.0.113.50
# 설정 반영 및 현재 적용된 규칙 요약 보기
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
방화벽 설정은 서버의 네트워크를 직접 끊고 잇는 작업이기 때문에 원격 환경에서 사소한 실수 한 번으로 서버가 미아가 되는 '락아웃(Lock-out)' 현상이 자주 발생합니다. 이를 예방하기 위한 안전장치를 소개합니다.
Firewalld에는 영구 저장하기 전에 일정 시간 동안만 규칙을 유지해 보고, 문제가 없다면 확정하는 기막힌 기능이 있습니다.
Bash
# 새로운 규칙을 임시로 적용하되, 10분 동안 관리자의 확정(--panic-on 등이 포함된 검증)이 없으면 자동 롤백
sudo firewall-cmd --reload
# (원격 접속이 끊어지지 않았다면 영구 저장)
sudo firewall-cmd --runtime-to-permanent
UFW 설정을 대대적으로 변경할 때는 10분 뒤에 자동으로 방화벽을 꺼버리는 임시 예약을 걸어두고 작업하는 것이 안전합니다.
Bash
# 방화벽 규칙을 만지기 직전, 터미널에 입력 (10분 뒤 자동 방화벽 중지 명령)
echo "sudo ufw disable" | at now + 10 minutes
작업이 아무런 문제 없이 완벽하게 끝나고 접속 유지가 보장된다면 atq 명령어로 해당 예약을 취소(atrm)하면 됩니다. 만약 설정을 잘못하여 접속이 끊기더라도 10분만 기다리면 방화벽이 꺼지면서 다시 접속할 수 있게 됩니다.
이번 시간에는 리눅스 인프라를 외부 위협으로부터 물리적으로 격리하는 UFW와 Firewalld 방화벽 활용법을 상세히 다루어 보았습니다.
모든 문을 굳게 닫아걸고(Default Deny), 신뢰할 수 있는 통로만 정교하게 열어두는 방화벽 정책은 보안의 마침표가 아닌 '기본값'입니다. 내가 사용하는 리눅스 배포판의 방화벽 도구 문법을 완벽히 숙지하고, 허용 포트를 최소화하는 화이트리스트 정책을 유지하는 것만으로도 대부분의 네트워크 기반 침해 사고를 원천 봉쇄할 수 있습니다.
다음 5회차에서는 네트워크를 넘어 서버 내부로 시선을 돌려보겠습니다. 시스템을 이용하는 사용자 계정 자체의 보안을 강화하고, 비밀번호의 복잡성을 강제하며, 로그인 실패 시 계정을 잠가버리는 시스템 내부의 수문장, '계정 보안과 PAM 패스워드 정책 설정'에 대해 심도 있게 알아보겠습니다.