UFW는 많은 사람들이 생각하는 'Ubuntu Firewall(우분투 방화벽)'이 아니라 'Uncomplicated Firewall(간단한 방화벽)'의 약자입니다. 이 이름은 그만큼 설정이 놀랄 만큼 쉽다는 사실을 잘 보여줍니다. 대부분의 사용자는 단 세 가지 옵션만 설정해도 어느 정도 안전한 상태가 되며, 고급 설정을 원하는 사용자라 해도 텍스트 파일을 조금 수정하는 수준으로 충분합니다.
UFW는 우분투 프로젝트 개발팀이 처음 설계했지만, 현재는 다른 배포판에서도 널리 사용할 수 있습니다. Debian, Arch, Linux Mint, Lubuntu, Xubuntu 사용자라면 이미 시스템에 설치되어 있을 가능성이 높습니다.
문제는 실제로 이를 활성화해서 사용하는 사용자가 많지 않다는 점입니다. 더 이상 iptables를 직접 다룰 필요는 없지만, 우분투에서는 ufw가 기본적으로 꺼진 상태로 설정되어 있습니다. 일부 데비안 구성에서는 패키지조차 기본 설치되어 있지 않습니다. 다행히 터미널을 조금만 다뤄본 경험이 있다면 누구나 손쉽게 시스템을 강화할 수 있습니다.
방법 1: 명령 프롬프트에서 UFW 활성화하기
별도로 설치하려 하기 전에 먼저 ufw 패키지가 이미 설치되어 있는지 확인하세요. 오류가 발생하더라도 나중에 언제든 패키지를 설치할 수 있으니 걱정하지 않아도 됩니다.
일반 사용자 계정으로 작업 중이라면 sudo ufw enable 명령어를 실행하고, 관리자 비밀번호 입력 요청이 나오면 비밀번호를 입력합니다. 그러면 ufw가 활성화되었으며 부팅 시 자동으로 실행된다는 메시지가 표시됩니다. 확실하게 하려면 sudo ufw status 명령어도 함께 실행해 보세요. "Status: active"라는 한 줄의 출력이 나오면 정상적으로 작동 중인 것입니다.
반대로 ufw가 설치되어 있지 않다는 메시지가 나올 수도 있습니다. Debian처럼 apt 기반 배포판 사용자는 sudo apt-get install ufw 명령어를 실행하면 됩니다. 설치 전에 sudo apt-get update와 sudo apt-get upgrade를 먼저 실행해 다른 패키지 상태를 점검하는 것도 좋은 습관입니다. Arch Linux 사용자는 sudo pacman -Syu로 패키지를 최신 상태로 만든 후 sudo pacman -S ufw로 설치하면 됩니다. 설치 후에는 위 단계를 따라 sudo ufw enable 명령어가 앞서 언급한 "Status: active" 출력을 반환하는지 반드시 확인하세요.
방법 2: UFW 기본 규칙 설정하기
방화벽 도구는 규칙 집합을 사용해 네트워크를 통해 컴퓨터로 들어오는 패킷의 수용 여부를 결정합니다. 다음 두 명령어는 거의 모든 사용자에게 필요합니다.
sudo ufw default allow outgoing
sudo ufw default deny incoming
첫 번째 명령어는 외부로 나가는 트래픽을 항상 허용합니다. 온라인에서 어떤 작업이든 한다면 필수적인 설정입니다. 당연히 발신 요청 자체를 위험하다고 볼 필요는 없습니다. 두 번째 명령어는 들어오는 요청을 차단하여, 거의 모든 가정 및 비즈니스 환경에 적합한 보안 상태를 만들어 줍니다. 고강도 온라인 FPS 게임을 즐기는 게이머조차 대부분 이 설정만으로 충분합니다.
재부팅 후에도 sudo ufw status 명령어가 활성화 메시지를 반환한다면, 대부분의 사용자는 여기서 설정을 마쳐도 됩니다. 설정 과정은 생각보다 간단합니다. 다만 SSH나 고급 네트워킹 기능이 필요한 사용자는 계속 읽어야 합니다.
방법 3: UFW 고급 설정 옵션
대부분의 사용자에게는 불필요하지만, 특정 상황에서는 유용한 규칙들이 있습니다. 예를 들어 일반적으로 사용되는 80번 포트의 TCP 연결을 허용하려면 다음 명령어를 실행합니다.
sudo ufw allow 80/tcp
특정 IP 주소와 서브넷을 지정하고 싶다면 sudo ufw allow from ###.##.##.##/## 형식으로 실제 IP 주소와 서브넷 번호를 슬래시 뒤에 입력하면 됩니다. 서버 환경이라면 sudo ufw allow http/tcp처럼 서비스 이름으로 포트를 지정하는 것도 유효하지만, 이런 식으로 연결 유형을 하나씩 열다 보면 관리가 복잡해질 수 있습니다.
가장 많이 사용되는 설정 중 하나는 SSH 연결을 위해 22번 포트를 여는 sudo ufw allow 22입니다. 일부 사용자는 sudo ufw allow ssh로 표현하기도 하는데, 이 역시 동일하게 작동합니다. 어떤 가이드에서는 두 줄을 모두 추가하라고 안내하지만, 대부분의 경우 불필요하며 오히려 불필요한 오버헤드만 늘릴 수 있습니다.
나중에 규칙을 삭제하고 싶다면 sudo ufw delete 뒤에 규칙 이름을 붙여 실행하면 됩니다. 예를 들어 sudo ufw delete allow 80/tcp는 앞서 만든 예시 규칙 하나를 제거합니다.
규칙을 여러 개 추가했다면 sudo ufw status verbose 명령어로 훨씬 상세한 테이블을 확인할 수 있습니다. 방화벽을 비활성화해야 하는 경우에는 sudo ufw disable 명령어를 사용하면 되지만, 실제로 이것이 필요한 상황은 매우 드뭅니다.
504 게이트웨이 타임아웃 오류와 규칙 순서 문제
UFW로 서버를 보호하다 보면 가끔 504 게이트웨이 타임아웃 오류가 발생할 수 있습니다. 이런 경우 몇 가지 규칙의 순서를 변경하면 해결되곤 합니다. 보안상의 이유로 ufw는 목록을 파싱할 때 항상 첫 번째 일치 항목을 찾기 때문에, allow 규칙은 deny 규칙보다 먼저 입력되어야 합니다. 규칙 쌍을 삭제한 후 sudo ufw default allow 라인부터 순서대로 다시 추가하면 문제가 해결됩니다. 성능을 위해 중복된 라인도 삭제하는 것이 좋습니다.
sudo ufw status verbose를 실행하고 DENY IN과 ALLOW IN 라인의 순서를 주의 깊게 살펴보세요. 80번이나 22번 같은 공통 포트에 대한 DENY IN 항목이 다른 해당 포트 참조보다 앞에 있다면, 연결이 통과하기도 전에 차단하고 있는 것일 수 있습니다. 순서를 재배열하면 문제가 해결됩니다. 처음부터 올바른 순서로 명령어를 입력하면 이후 문제를 예방할 수 있습니다.
참고로 root 권한 프롬프트를 사용하는 사용자는 각 명령어 앞에 sudo를 붙일 필요가 없습니다. sudo 관련 오류가 계속 발생한다면 이것이 원인일 수 있습니다. 프롬프트 끝이 #인지 $인지 확인해 보세요. tcsh 사용자 중 프롬프트가 %로만 표시된다면 whoami 명령어로 현재 사용자를 확인할 수 있습니다.
일반 사용자가 sudo ufw status verbose를 실행해도 출력이 적을 수 있는데, 이는 단순히 설정된 규칙 수가 적기 때문입니다. 아마 이전과 동일한 결과만 표시될 것입니다.
주의사항: reject 파라미터 사용 시 잠길 수 있음
ufw default 명령어는 reject 파라미터도 지원하지만, 이를 잘못 사용하면 자신의 서버에 접근 자체가 차단되거나 예상치 못한 문제가 발생할 수 있습니다. sudo ufw allow ssh 같은 규칙이 필요하다면 반드시 기본 reject 또는 deny 규칙을 적용하기 전에 먼저 추가해야 합니다.
Gufw나 Qt 기반의 kmyfirewall 같은 GUI 도구도 있지만, ufw는 명령줄에서 충분히 쉽게 설정할 수 있기 때문에 굳이 필요하지 않습니다. 직접 설정 파일을 편집하고 싶다면 해당 디렉터리로 이동한 후 sudo nano로 파일을 열어 편집하면 됩니다. 수정 전에 more나 less 명령어로 내용을 미리 살펴보는 것도 좋은 방법입니다.
개발자들은 편집 중 길을 잃지 않도록 파일 곳곳에 적절한 주석을 남겨두었습니다. 물론 필요 없다고 판단되면 주석을 제거해도 무방합니다.