리눅스 방화벽 설정 방법 총정리 (ufw / firewalld 사용법)
리눅스 서버를 운영하다 보면 보안 설정은 선택이 아니라 기본이 된다. 그 가운데서도 가장 먼저 챙겨야 하는 것이 바로 리눅스 방화벽 설정 작업이다. 방화벽은 외부에서 들어오는 네트워크 접근을 제어하는 역할을 하며, 필요한 포트만 열고 나머지는 차단하는 방식으로 서버를 보호한다.
예를 들어 웹 서버를 운영한다면 80, 443 포트 정도만 외부에 열어 두고, SSH 접속용 포트만 별도로 허용하는 방식으로 사용하게 된다. 반대로 방화벽 설정을 제대로 하지 않으면 원치 않는 포트가 외부에 노출되어 보안 문제가 생길 수도 있다.
리눅스에서 자주 사용하는 방화벽 관리 도구는 크게 ufw와 firewalld 두 가지가 있다. Ubuntu 계열에서는 ufw를 많이 사용하고, CentOS나 RHEL 계열에서는 firewalld를 많이 사용한다. 이번 글에서는 두 도구로 리눅스 방화벽 설정 작업을 하는 기본 사용법부터 특정 IP만 접속을 허용하는 방법, 그리고 처음 다룰 때 자주 하는 실수까지 함께 정리해 보도록 하겠다.

리눅스 방화벽 설정 명령어 한눈에 보기
바쁜 사람을 위해 자주 쓰는 명령어부터 표로 정리했다. 자세한 설명은 아래에서 하나씩 다룬다.
| 작업 | ufw (Ubuntu 계열) | firewalld (RHEL 계열) |
|---|---|---|
| 상태 확인 | sudo ufw status | sudo firewall-cmd --state |
| 방화벽 켜기 | sudo ufw enable | sudo systemctl enable --now firewalld |
| 포트 허용 | sudo ufw allow 443/tcp | sudo firewall-cmd --permanent --add-port=443/tcp |
| 서비스 이름으로 허용 | sudo ufw allow https | sudo firewall-cmd --permanent --add-service=https |
| 규칙 삭제 | sudo ufw delete allow 443/tcp | sudo firewall-cmd --permanent --remove-port=443/tcp |
| 설정 반영 | 즉시 적용 (reload 불필요) | sudo firewall-cmd --reload |
| 전체 규칙 보기 | sudo ufw status verbose | sudo firewall-cmd --list-all |
ufw란 무엇인가 (Ubuntu 기본 방화벽)
ufw는 Uncomplicated Firewall의 약자로, 이름 그대로 비교적 간단하게 사용할 수 있는 방화벽 관리 도구다. 주로 Ubuntu 환경에서 많이 사용되며, iptables를 좀 더 쉽게 다룰 수 있도록 만들어진 프론트엔드 도구라고 보면 된다. 전체 옵션은 Ubuntu 공식 UFW 문서에서 확인할 수 있다.
설치 여부와 현재 상태는 다음과 같이 확인할 수 있다. 처음 설치한 Ubuntu라면 보통 inactive로 나온다.
ufw status만약 명령어를 찾을 수 없다고 나온다면 apt로 설치하면 된다.
sudo apt install ufwufw 리눅스 방화벽 설정 방법
기본 정책 설정
ufw는 기본적으로 들어오는 연결은 차단하고 나가는 연결은 허용하는 정책을 쓴다. 필요한 포트만 골라서 여는 리눅스 방화벽 설정 작업의 출발점이 바로 이 정책이다. 혹시 이전에 다른 사람이 정책을 바꿔 두었을 수도 있으니, 활성화하기 전에 기본 정책을 명시적으로 지정해 두면 마음이 편하다.
sudo ufw default deny incomingsudo ufw default allow outgoing방화벽 활성화
먼저 ufw를 활성화하려면 다음 명령어를 사용한다.
sudo ufw enable
주의할 점은 SSH 접속 중이라면 먼저 SSH 포트를 허용한 다음 활성화해야 한다는 것이다. 그렇지 않으면 원격 접속이 끊길 수 있다.
예를 들어 기본 SSH 포트인 22번을 허용하려면 다음과 같이 입력한다.
sudo ufw allow 22/tcp
SSH 포트를 변경해서 사용 중이라면 해당 포트를 열어야 한다. 포트 변경 방법은 리눅스 SSH 포트 변경 방법 글에 정리해 두었다. 예를 들어 2222 포트를 사용한다면 다음과 같이 입력한다.
sudo ufw allow 2222/tcp포트 허용
웹 서버 운영 시 자주 사용하는 포트는 다음과 같다. 아래 명령어를 각각 실행하면 HTTP와 HTTPS 포트가 허용된다. Nginx로 웹 서버를 올릴 계획이라면 Nginx 리버스 프록시와 Let’s Encrypt SSL 적용 전에 이 두 포트부터 열어 두자.
sudo ufw allow 80/tcpsudo ufw allow 443/tcp특정 서비스 이름으로 허용
방화벽 오픈 시 서비스 이름으로도 허용할 수 있다.
sudo ufw allow ssh
이미 눈치챈 사람도 있겠지만 위에 선언했던 80 port와 443 포트에 대해서도 아래와 같이 실행이 가능하다.
sudo ufw allow httpsudo ufw allow https
확실히 이 방식이 작업하는 사람 입장에서는 비교적 이해하기 쉽고 편하다. 다만 ufw allow ssh의 경우 현재 sshd가 듣는 포트를 자동 추적해서 여는 게 아니라, 보통 ssh 서비스로 정의된 포트(대개 22/tcp)를 연다. ssh 포트를 바꿨다면 서비스 이름 말고 포트로 지정해서 오픈하자.
특정 IP에서만 접속 허용
SSH나 DB 포트처럼 아무나 접속할 필요가 없는 포트는 아예 접속할 IP를 정해 두는 것이 훨씬 안전하다. 예를 들어 사무실 IP(203.0.113.10)에서만 SSH 접속을 허용하려면 다음과 같이 입력한다.
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
대역 단위로 열고 싶다면 203.0.113.0/24처럼 CIDR 표기를 쓰면 된다. 그리고 이렇게 IP 제한을 걸었다면 앞서 열어 둔 22/tcp 전체 허용 규칙은 삭제해야 의미가 있다. 둘 다 남아 있으면 결국 모든 IP에 열려 있는 것과 같다.
접속 IP를 고정하기 어렵다면 limit 옵션도 쓸 만하다. 같은 IP에서 30초 안에 6번 이상 접속을 시도하면 차단해 주기 때문에 무차별 대입 공격을 어느 정도 막아 준다.
sudo ufw limit 22/tcp상태 확인
현재 설정 상태는 다음과 같이 확인할 수 있다.
sudo ufw status
규칙마다 번호를 붙여서 보고 싶다면 다음 명령어를 사용한다. 기본 정책까지 함께 보고 싶다면 numbered 대신 verbose를 붙이면 된다.
sudo ufw status numbered
이렇게 하면 룰 번호까지 확인할 수 있어 삭제할 때 편하다.
허용 규칙 삭제
예를 들어 80번 포트 허용 규칙을 삭제하려면 다음과 같이 입력한다.
sudo ufw delete allow 80/tcp
추가로 status numbered 명령어로 알아낸 룰 번호로 삭제를 할 수도 있다.
sudo ufw delete 1규칙 새로고침
ufw에는 reload 명령어가 있다. 아래에서 다룰 firewalld는 allow / deny 처리 후 새로고침이 필수이지만 ufw는 설정하는 즉시 적용된다. 그래서 규칙을 추가할 때마다 reload를 실행할 필요는 없고, 설정 파일을 직접 고쳤거나 규칙을 전체적으로 다시 불러오고 싶을 때 아래 명령어를 사용한다.
sudo ufw reloadfirewalld란 무엇인가 (RHEL·Rocky Linux 기본 방화벽)
firewalld는 CentOS, Rocky Linux, AlmaLinux, RHEL 계열에서 많이 사용하는 방화벽 관리 도구다. firewall-cmd 명령어를 통해 설정하며, zone 개념을 기반으로 보다 유연하게 방화벽을 관리할 수 있다. zone과 rich rule 문법은 firewalld 공식 문서에 자세히 나와 있다.
설치 여부 및 상태 확인은 다음과 같다.
sudo systemctl status firewalld
만약 확인했을 때 실행 중이 아니라면 다음과 같이 시작할 수 있다.
참고로 둘 다 모두 실행해야 한다. start 명령어는 지금 바로 실행하는 명령어이고 enable의 경우 재부팅 후에도 실행되도록 처리를 해주는 명령어다. start만 실행하는 경우 재부팅 후 방화벽 서비스가 실행되지 않을 수 있다. systemctl 명령어가 낯설다면 리눅스 서비스 관리(systemctl) 글을 먼저 보고 오자.
sudo systemctl start firewalldsudo systemctl enable firewalld
혹시 방화벽 서비스의 자동실행을 잠시 막고 싶다면 아래의 명령어로 해제가 가능하다.
sudo systemctl disable firewalldfirewalld 리눅스 방화벽 설정 방법
현재 상태 확인
아래 명령어로 확인이 가능하며 정상 실행 중이라면 running이 출력된다.
sudo firewall-cmd --state현재 허용된 설정 확인
이 명령어를 사용하면 현재 zone에 허용된 서비스와 포트를 확인할 수 있다.
sudo firewall-cmd --list-all포트 허용
그러면 이제 포트를 허용하는 방법에 대해 알아보자. 예를 들어 80번 포트를 허용하려면 다음과 같이 입력한다. 순서대로 http, https, 2222 포트를 여는 방식이다. 필자의 SSH 포트 변경 글을 본 사람이 있을 수 있어 추가 예시는 2222 포트로 잡았다.
sudo firewall-cmd --permanent --add-port=80/tcpsudo firewall-cmd --permanent --add-port=443/tcpsudo firewall-cmd --permanent --add-port=2222/tcp설정 적용
–permanent 옵션을 사용했다면 적용을 위해 반드시 reload가 필요하다. 해당 옵션 적용 후 아래와 같이 reload를 해줘야 정상으로 적용이 된다. 만약 설정을 했는데도 포트가 여전히 막혀 있거나 열려 있다면 reload를 했는지부터 확인해 보자. 그리고 적용한 후에는 –list-all 명령어로 현재 허용된 설정을 명시적으로 확인하는 습관을 꼭 들이도록 하자.
sudo firewall-cmd --reload서비스 단위 허용
포트 번호 대신 서비스 이름으로 허용할 수도 있다. 각각 순서대로 http, https, ssh 포트에 대해 허용을 해주는 명령어다.
sudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --permanent --add-service=ssh
마지막은 reload로 마무리를 하면 된다.
sudo firewall-cmd --reload
다만 위와 같이 처리를 했을 때 보통 ssh는 ufw 명령어와 같은 방식으로 22번 포트를 열게 되어 있다. 위에 ufw에서 잠깐 언급하긴 했지만 처음 다룰 때 실수를 하는 것 가운데 하나다. 아래 명령어로 확인해 보면 간단히 알 수 있다. firewalld의 ssh 서비스는 사용자가 sshd 포트를 바꾸었든 말든 22번 포트를 가리킨다.
firewall-cmd --info-service=ssh결과: ports: 22/tcp
그렇다고 방법이 없는 것은 아니다. firewalld의 ssh 서비스 정의 자체를 수정해서 22/tcp 대신 2222/tcp나 23/tcp로 바꿔 주면 된다. 하지만 그렇게까지 하는 것보다 그냥 포트 방식으로 오픈을 하는 것이 수고로움도 덜하고 다른 사람들과 협업하기에도 수월하기 때문에 서비스 정의 수정은 추천하지 않는다.
특정 IP에서만 접속 허용 (rich rule)
firewalld에서는 rich rule로 같은 설정을 할 수 있다. 문법이 조금 길지만 구조는 단순하다. 어떤 출발지(source)에서 어떤 포트로 들어오는 연결을 허용(accept)할지 적어 주면 된다.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="22" protocol="tcp" accept'sudo firewall-cmd --reload
이 경우에도 ssh 서비스나 22번 포트가 zone에 따로 열려 있다면 IP 제한 효과가 없다. 새 규칙으로 접속이 되는 것을 확인한 다음 --remove-service=ssh로 기존 허용을 정리해 주자. 확인 전에 지우면 지금 접속이 끊길 수 있으니 순서를 꼭 지키자.
허용 규칙 삭제
포트를 제거하려면 다음과 같이 입력한다.
sudo firewall-cmd --permanent --remove-port=80/tcp
삭제 후 동일하게 reload로 마무리한다.
sudo firewall-cmd --reloadufw와 firewalld 중 무엇을 써야 할까
정답은 사용하는 배포판에 따라 달라진다.
- Ubuntu 계열이라면 보통 ufw
- CentOS / Rocky / AlmaLinux / RHEL 계열이라면 보통 firewalld
둘 다 방화벽을 관리하는 도구이지만, 사용 방식이 다르기 때문에 한 서버에서는 일반적으로 하나의 방식만 사용하는 것이 좋다.
덧붙이자면 보통 ufw는 iptables / nftables를 쉽게 다루기 위한 단순한 프론트엔드라고 볼 수 있다. 설정이 비교적 간단해서 Ubuntu 계열에서 많이 쓰는 편이다. 그리고 firewalld는 zone 개념을 가지고 있고, 좀 더 동적인 관리에 강하다. 대개 RHEL 계열에서 기본 방화벽 관리 도구로 많이 사용되고 있다.
따라서 ufw를 RHEL 계열에서 설치 자체는 가능할 수 있지만 패키지 의존성이나 기본 운영 방식이 배포판 표준과 다를 수 있어서 굳이 그렇게 할 이유는 별로 없다. 그리고 반대로 firewalld를 Ubuntu 계열에서 이것도 설치해서 사용할 수는 있다. 실제로 Ubuntu에서도 firewalld를 쓰는 경우가 아예 없는 것은 아니다. 다만 아무래도 Ubuntu 계열의 기본 흐름은 ufw 쪽이라 관리 일관성이 떨어질 수 있다. 특정 사유가 없다면 되도록이면 각 시스템별로 맞춰서 사용을 하도록 하자. 보통 실무에서는 해당 배포판의 기본 방화벽 도구를 사용한다고 보면 된다.
잠깐만 생각해 보면 알겠지만 이유는 단순하다.
- 다른 관리자도 이해하기 쉬움
- 문서와 예제가 많음
- 운영 표준에 맞음
- 유지보수가 편함
즉, 실무에서는 가능 여부보다 운영 편의성과 표준이 중요하다. 굳이 기존에 잘 사용되고 있던 것을 본인이 익숙지 않다고 다른 것으로 바꾼다거나 하는 과욕은 부리지 말자. 그리고 혹여 방화벽 관리 도구를 여러 개 쓰면 좋지 않나라는 생각을 하는 사람이 있을지도 모르겠다.
ufw, firewalld 둘 다 서로 같은 방화벽 계층을 건드리기 때문에 두 개를 동시에 관리 도구로 섞어 쓰면 규칙 충돌이나 포트 처리 시 헷갈리는 상황이 생길 수 있다. 하나만 사용하자.
리눅스 방화벽 설정 시 주의할 점
보통 리눅스 방화벽 설정 작업에서 가장 중요한 것은 SSH 포트를 먼저 허용하는 것이다. 원격 서버에서 작업 중이라면 이 부분을 놓쳤을 때 접속이 끊길 수 있다.
즉, 순서는 보통 다음과 같이 가져가는 것이 안전하다.
- SSH 포트 허용
- 필요한 서비스 포트 허용
- 방화벽 활성화 또는 reload
- 접속 테스트
특히 SSH 포트를 변경해 사용 중이라면 기존 22번이 아니라 변경한 포트를 정확히 열었는지 꼭 확인해야 한다. 그래도 접속이 안 된다면 SSH 접속이 안될 때 확인해야 할 것들을 순서대로 점검해 보자.
클라우드 서버라면 보안 그룹도 확인
AWS EC2, Lightsail, 오라클 클라우드 같은 클라우드 서버는 OS 방화벽과 별개로 콘솔에서 관리하는 방화벽(보안 그룹, 네트워킹 규칙)이 한 겹 더 있다. 서버 안에서 ufw나 firewalld로 포트를 열어도 바깥 방화벽에서 막혀 있으면 접속이 안 되고, 반대도 마찬가지다.
포트를 열었는데 접속이 안 된다면 먼저 서비스가 실제로 그 포트를 듣고 있는지 ss -tlnp로 확인하고(리눅스 네트워크 확인 명령어 참고), 그다음 클라우드 콘솔의 방화벽 규칙까지 함께 확인해 보자.
Docker를 쓴다면 ufw 규칙이 우회될 수 있다
Docker 포트를 로컬에만 묶는 방법과 기본 사용법은 Docker 설치와 기본 명령어에 정리해 두었다.
의외로 많이 겪는 문제다. Docker는 컨테이너 포트를 열 때 iptables 규칙을 직접 추가하기 때문에, -p 8080:80처럼 띄운 컨테이너 포트는 ufw에서 허용하지 않았어도 외부에 그대로 열릴 수 있다. 외부에 노출할 필요가 없는 컨테이너라면 -p 127.0.0.1:8080:80처럼 로컬 주소에만 바인딩해 두는 것이 안전하다.
방화벽으로 필요한 포트만 열었다면, SSH처럼 열어 둔 포트로 들어오는 무차별 대입 공격은 fail2ban으로 함께 막는 것이 좋다. 자세한 방법은 fail2ban 설정으로 SSH 공격 막기에 있다.
리눅스 방화벽 설정 자주 묻는 질문
ufw enable 후 SSH 접속이 끊겼다면?
SSH 포트를 허용하지 않은 채 방화벽을 켠 경우다. 클라우드 서버라면 웹 콘솔(브라우저 SSH, 시리얼 콘솔)로 접속해서 sudo ufw allow 22/tcp로 포트를 열거나 sudo ufw disable로 잠시 방화벽을 끈 다음 다시 설정하면 된다.
firewalld에서 연 포트가 재부팅 후 사라졌다면?
--permanent 옵션 없이 추가한 규칙은 런타임에만 적용되어 재부팅이나 reload를 하면 사라진다. 규칙을 다시 --permanent로 추가하고 reload하거나, 지금 동작 중인 설정을 그대로 저장하고 싶다면 sudo firewall-cmd --runtime-to-permanent를 실행하자.
ufw와 firewalld를 같이 켜 둬도 될까?
추천하지 않는다. 앞에서 이야기한 것처럼 같은 방화벽 계층을 건드리기 때문에 규칙이 꼬이기 쉽다. 하나를 정했다면 다른 하나는 sudo systemctl disable --now로 꺼 두자.
방화벽을 포함해 새 서버에서 해야 할 기본 설정 전체는 리눅스 서버 초기 세팅 체크리스트에 순서대로 모아 두었다.
마무리
리눅스 방화벽 설정 작업은 서버 운영에서 가장 기본적인 보안 작업 가운데 하나다. 필요하지 않은 포트를 열어 두는 것은 보안상 좋지 않기 때문에, 실제로 사용하는 서비스만 허용하고 나머지는 차단하는 습관이 중요하다.
Ubuntu 환경에서는 ufw를, CentOS나 RHEL 계열에서는 firewalld를 주로 사용하게 된다. 두 도구 모두 기본 정책, 포트 허용, 규칙 확인 세 가지만 익혀 두면 생각보다 어렵지 않게 설정할 수 있다. 여기에 SSH처럼 민감한 포트는 특정 IP만 허용하는 습관까지 더하면 훨씬 안전해진다.
서버를 운영하고 있다면 패키지 설치나 로그 확인만큼이나 방화벽 상태도 함께 점검해 보는 것이 좋다. 특히 SSH, 웹 서비스, DB 포트처럼 외부 노출이 필요한 항목은 반드시 방화벽 설정을 확인한 뒤 운영하는 습관을 들이는 것을 추천한다. 본인 시스템에 맞춰 방화벽 상태를 한 번 점검해 보도록 하자.
첫 댓글을 남겨보세요