UFW(방화벽) 기본 설정 방법 정리

UFW(방화벽) 기본 설정 방법 정리

서버를 인터넷에 공개하는 순간부터 전 세계 어디에서든 접근 시도가 들어옵니다. 서버를 배포하고 몇 시간만 지나도 SSH 로그에 모르는 IP에서 접속을 시도한 기록이 쌓여 있는 걸 볼 수 있습니다. 자동화된 봇들이 쉬지 않고 서버를 스캔하면서 열린 포트와 취약점을 찾고 있기 때문입니다. 방화벽은 이런 불필요한 접근을 차단하는 가장 기본적인 보안 장치입니다. 리눅스에는 iptables라는 방화벽이 기본으로 내장되어 있지만 설정이 복잡합니다. UFW는 이 iptables를 쉽게 다룰 수 있도록 만든 도구입니다. 이번 글에서는 UFW로 서버 방화벽을 설정하는 방법을 처음부터 정리해보겠습니다.

UFW란 무엇인가

UFW는 Uncomplicated Firewall의 약자입니다. 이름 그대로 복잡하지 않은 방화벽이라는 뜻입니다. Ubuntu에 기본으로 설치되어 있고, 직관적인 명령어로 방화벽 규칙을 관리할 수 있습니다.

리눅스 방화벽의 실체는 커널에 내장된 netfilter이고, 이걸 제어하는 도구가 iptables입니다. iptables는 강력하지만 명령어가 길고 복잡해서 규칙 하나 추가하는 데도 여러 옵션을 기억해야 합니다. UFW는 iptables 위에 올라가는 인터페이스로, 간단한 명령어만으로 동일한 기능을 수행합니다. UFW에서 규칙을 추가하면 내부적으로 iptables 규칙이 생성됩니다.

UFW 설치 확인과 상태 확인

Ubuntu에는 UFW가 기본 설치되어 있습니다. 설치 여부를 확인하려면 이렇게 합니다.

sudo ufw version

버전 정보가 나오면 설치되어 있는 겁니다. 혹시 없다면 설치합니다.

sudo apt install ufw

현재 방화벽 상태를 확인합니다.

sudo ufw status

처음에는 “Status: inactive”라고 나옵니다. UFW가 설치되어 있지만 아직 활성화되지 않은 상태입니다. 활성화하기 전에 반드시 SSH 허용 규칙부터 추가해야 합니다. 그렇지 않으면 방화벽이 켜지면서 SSH 연결이 끊기고 서버에 접속할 수 없게 됩니다.

SSH부터 허용하고 활성화하기

UFW를 켜기 전에 가장 먼저 SSH를 허용합니다. 이 순서가 매우 중요합니다.

sudo ufw allow OpenSSH

OpenSSH는 UFW에 미리 등록되어 있는 애플리케이션 프로필입니다. 이 명령어 하나로 SSH 기본 포트인 22번이 허용됩니다.

SSH 포트를 기본 22번이 아닌 다른 포트로 변경해서 사용하고 있다면 해당 포트를 직접 지정해야 합니다.

sudo ufw allow 2222/tcp

SSH를 허용한 뒤에 UFW를 활성화합니다.

sudo ufw enable

활성화할 때 “기존 SSH 연결이 끊길 수 있다”는 경고가 나옵니다. SSH 허용 규칙을 이미 추가했으니 y를 눌러서 진행합니다.

활성화 후 상태를 확인합니다.

sudo ufw status verbose

Status가 active로 바뀌어 있고, 기본 정책과 추가한 규칙이 표시됩니다. 기본 정책은 들어오는 트래픽은 전부 차단하고 나가는 트래픽은 전부 허용하는 상태입니다. 허용 규칙에 추가한 포트만 외부에서 접속할 수 있습니다.

웹 서버 포트 허용

이전 글들에서 다뤘던 것처럼 웹 서비스를 운영하려면 HTTP(80번)와 HTTPS(443번) 포트를 열어야 합니다.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

또는 Nginx가 설치되어 있다면 애플리케이션 프로필을 사용할 수 있습니다.

sudo ufw allow 'Nginx Full'

Nginx Full은 80번과 443번을 동시에 허용합니다. HTTP만 허용하고 싶으면 Nginx HTTP, HTTPS만 허용하고 싶으면 Nginx HTTPS를 사용합니다.

등록된 애플리케이션 프로필 목록을 확인하려면 이렇게 합니다.

sudo ufw app list

설치된 서비스에 따라 프로필이 다르게 나옵니다. OpenSSH, Nginx Full, Nginx HTTP, Nginx HTTPS 같은 프로필이 있을 수 있습니다.

포트 허용과 차단

특정 포트를 허용하는 기본 형식입니다.

sudo ufw allow 포트번호

프로토콜을 지정할 수도 있습니다. TCP만 허용하거나 UDP만 허용할 때 사용합니다.

sudo ufw allow 3000/tcp
sudo ufw allow 53/udp

포트를 차단하려면 allow 대신 deny를 사용합니다.

sudo ufw deny 3306

이렇게 하면 MySQL 기본 포트인 3306번으로의 외부 접근이 차단됩니다. 데이터베이스 포트는 외부에서 직접 접근할 필요가 없는 경우가 대부분이기 때문에 차단해두는 게 좋습니다. 앱 서버가 같은 서버에서 localhost로 접속하는 건 방화벽과 무관하게 됩니다.

포트 범위를 지정할 수도 있습니다.

sudo ufw allow 8000:8100/tcp

8000번부터 8100번까지의 TCP 포트를 허용합니다.

IP 기반 규칙 설정

특정 IP에서만 접근을 허용하는 설정이 실무에서 매우 유용합니다. SSH는 내 IP에서만 접속 가능하게 하고, 나머지는 전부 차단하는 식입니다.

특정 IP에서의 모든 접근을 허용하려면 이렇게 합니다.

sudo ufw allow from 203.0.113.50

특정 IP에서 특정 포트로의 접근만 허용하려면 이렇게 합니다.

sudo ufw allow from 203.0.113.50 to any port 22

이건 203.0.113.50에서 오는 SSH 접속만 허용한다는 뜻입니다. 다른 IP에서는 22번 포트에 접근할 수 없습니다.

이전 글에서 다뤘던 CIDR 표기법을 사용해서 IP 대역을 지정할 수도 있습니다.

sudo ufw allow from 203.0.113.0/24 to any port 22

203.0.113.0부터 203.0.113.255까지의 IP 대역에서 SSH 접속을 허용합니다. 회사 네트워크 대역을 지정할 때 유용합니다.

특정 IP를 차단하는 것도 가능합니다.

sudo ufw deny from 192.168.1.100

악의적인 접속 시도가 반복되는 IP를 차단할 때 사용합니다.

규칙 확인과 삭제

현재 설정된 규칙을 번호와 함께 확인하려면 이렇게 합니다.

sudo ufw status numbered

결과가 이런 식으로 나옵니다.

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 3306                       DENY IN     Anywhere

규칙을 삭제하려면 번호를 지정합니다.

sudo ufw delete 4

4번 규칙인 3306 차단 규칙이 삭제됩니다. 삭제 전에 확인 메시지가 나오니 실수로 잘못 삭제할 걱정은 적습니다.

규칙을 번호 대신 내용으로 삭제할 수도 있습니다.

sudo ufw delete allow 80/tcp

규칙이 많아지면 번호가 바뀔 수 있기 때문에 삭제 전에 항상 sudo ufw status numbered로 현재 번호를 확인하는 게 안전합니다.

기본 정책 설정

UFW의 기본 정책은 들어오는 트래픽을 어떻게 처리할지 결정합니다.

sudo ufw default deny incoming
sudo ufw default allow outgoing

첫 번째 줄은 들어오는 트래픽을 기본적으로 차단합니다. 명시적으로 허용한 포트만 접근 가능합니다. 두 번째 줄은 나가는 트래픽을 기본적으로 허용합니다. 서버에서 외부로 나가는 요청은 자유롭게 가능합니다. 패키지 업데이트나 외부 API 호출이 정상적으로 동작하려면 나가는 트래픽은 허용되어야 합니다.

이 설정이 UFW를 처음 활성화할 때 기본으로 적용되는 정책입니다. 보안상 이 기본 정책을 바꿀 필요는 거의 없습니다. 필요한 포트만 하나씩 열어주는 화이트리스트 방식이 가장 안전합니다.

로그 설정

UFW의 로그를 활성화하면 차단된 접근 시도를 기록으로 남길 수 있습니다.

sudo ufw logging on

로그 레벨을 지정할 수도 있습니다.

sudo ufw logging medium

low, medium, high, full 네 단계가 있습니다. low는 차단된 패킷만 기록하고, high와 full은 허용된 패킷까지 기록합니다. 일반적으로 medium이면 충분합니다.

로그는 /var/log/ufw.log에 기록됩니다.

sudo tail -50 /var/log/ufw.log

어떤 IP에서 어떤 포트로 접근을 시도했는데 차단됐는지 확인할 수 있습니다. 특정 IP에서 반복적으로 접근을 시도하고 있다면 해당 IP를 deny 규칙으로 추가할 수 있습니다. 하지만 이런 수동 차단보다는 Fail2ban 같은 도구를 사용하는 게 효율적입니다. Fail2ban은 로그를 감시하다가 일정 횟수 이상 접속에 실패한 IP를 자동으로 차단해줍니다.

실무에서 자주 사용하는 설정 조합

웹 서버를 운영하는 일반적인 구성에서 UFW 설정은 이런 식이 됩니다.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

이렇게 하면 SSH, HTTP, HTTPS만 열리고 나머지는 전부 차단됩니다. 앱 서버가 사용하는 3000번 포트는 외부에 열 필요가 없습니다. 이전 글에서 다뤘던 것처럼 Nginx가 리버스 프록시로 80번과 443번 포트를 받아서 내부적으로 3000번에 전달하기 때문입니다.

SSH를 특정 IP에서만 허용하고 싶다면 좀 더 엄격하게 설정할 수 있습니다.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from 내IP주소 to any port 22
sudo ufw allow 'Nginx Full'
sudo ufw enable

이렇게 하면 SSH는 내 IP에서만 접속 가능하고, 웹 트래픽은 모든 곳에서 접근 가능합니다. 가장 안전한 구성 중 하나입니다.

데이터베이스를 외부에서 접근해야 하는 특수한 경우에도 모든 IP에 열지 말고 필요한 IP만 허용합니다.

sudo ufw allow from 앱서버IP to any port 3306

앱 서버의 IP에서만 데이터베이스 포트에 접근할 수 있게 합니다.

UFW 비활성화와 초기화

UFW를 임시로 끄려면 이렇게 합니다.

sudo ufw disable

규칙은 유지되지만 방화벽이 비활성화됩니다. 다시 enable하면 이전 규칙이 그대로 적용됩니다.

규칙을 전부 초기화하고 처음부터 다시 설정하고 싶으면 이렇게 합니다.

sudo ufw reset

모든 규칙이 삭제되고 UFW가 비활성화됩니다. 다시 설정할 때는 SSH 허용부터 시작해야 한다는 걸 잊지 말아야 합니다.

주의할 점들

가장 중요한 건 SSH 허용 없이 UFW를 활성화하지 않는 것입니다. 원격으로 서버를 관리하는 상황에서 SSH가 차단되면 서버에 접속할 방법이 없어집니다. 클라우드 서비스에서는 콘솔 접속 기능을 제공하기도 하지만, 직접 관리하는 서버라면 물리적으로 가서 모니터와 키보드를 연결해야 할 수도 있습니다.

규칙 순서도 중요합니다. UFW는 규칙을 위에서부터 순서대로 확인하고, 먼저 매칭되는 규칙을 적용합니다. 같은 포트에 대해 allow와 deny가 둘 다 있으면 먼저 나오는 규칙이 적용됩니다. 특정 IP를 차단하고 싶은데 그 위에 해당 포트를 전부 허용하는 규칙이 있으면 차단이 동작하지 않습니다.

특정 규칙을 목록의 특정 위치에 삽입하고 싶으면 insert를 사용합니다.

sudo ufw insert 1 deny from 악성IP

1번 위치에 규칙을 삽입해서 다른 규칙보다 먼저 적용되게 합니다.

클라우드 서비스를 사용하고 있다면 클라우드의 보안 그룹과 UFW가 이중으로 동작한다는 점도 알아둬야 합니다. AWS의 보안 그룹에서 포트를 열어도 UFW에서 차단하면 접근이 안 되고, 반대로 UFW에서 열어도 보안 그룹에서 차단하면 접근이 안 됩니다. 양쪽 모두에서 허용되어야 실제로 접근이 가능합니다.

마무리

UFW는 서버 보안의 가장 기본적인 계층입니다. 필요한 포트만 열고 나머지를 전부 닫는 단순한 원칙만 지켜도 상당수의 불필요한 접근을 차단할 수 있습니다. SSH, HTTP, HTTPS 세 가지만 열면 일반적인 웹 서버 운영에는 충분하고, SSH를 특정 IP로 제한하면 보안이 한층 더 강화됩니다. 서버를 배포한 직후에 UFW 설정을 하는 걸 습관으로 만들어두면 좋습니다. 다음 글에서는 서버에 접속이 안 될 때 확인해야 할 전체 체크리스트를 정리해보겠습니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *