리눅스 방화벽 설정 방법 (ufw / firewalld 사용법)
리눅스 서버를 운영하다 보면 보안 설정은 선택이 아니라 기본이 된다. 그 가운데서도 가장 먼저 확인해야 하는 것이 바로 방화벽이다. 방화벽은 외부에서 들어오는 네트워크 접근을 제어하는 역할을 하며, 필요한 포트만 열고 나머지는 차단하는 방식으로 서버를 보호한다.
예를 들어 웹 서버를 운영한다면 80, 443 포트 정도만 외부에 열어 두고, SSH 접속용 포트만 별도로 허용하는 방식으로 사용하게 된다. 반대로 방화벽 설정을 제대로 하지 않으면 원치 않는 포트가 외부에 노출되어 보안 문제가 생길 수도 있다.
리눅스에서 자주 사용하는 방화벽 관리 도구는 크게 ufw와 firewalld 두 가지가 있다. Ubuntu 계열에서는 ufw를 많이 사용하고, CentOS나 RHEL 계열에서는 firewalld를 많이 사용한다. 이번 글에서는 두 가지 도구의 기본 사용법을 함께 정리해 보도록 하겠다.
ufw란 무엇인가
ufw는 Uncomplicated Firewall의 약자로, 이름 그대로 비교적 간단하게 사용할 수 있는 방화벽 관리 도구다. 주로 Ubuntu 환경에서 많이 사용되며, iptables를 좀 더 쉽게 다룰 수 있도록 만들어진 프론트엔드 도구라고 보면 된다.
설치 여부는 다음과 같이 확인할 수 있다.
ufw statussudo apt install ufwufw 기본 사용법
방화벽 활성화
먼저 ufw를 활성화하려면 다음 명령어를 사용한다.
sudo ufw enable
주의할 점은 SSH 접속 중이라면 먼저 SSH 포트를 허용한 다음 활성화해야 한다는 것이다. 그렇지 않으면 원격 접속이 끊길 수 있다.
예를 들어 기본 SSH 포트인 22번을 허용하려면 다음과 같이 입력한다.
sudo ufw allow 22/tcp
SSH 포트를 변경해서 사용 중이라면 해당 포트를 열어야 한다. 예를 들어 2222 포트를 사용한다면 다음과 같이 입력한다.
sudo ufw allow 2222/tcp포트 허용
웹 서버 운영 시 자주 사용하는 포트는 다음과 같다. 아래 명령어를 각각 실행 시키면 HTTP와 HTTPS 포트가 허용된다.
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 포트를 바꿨다면 서비스 이름 말고 포트로 지정해서 오픈하자.
상태 확인
현재 설정 상태는 다음과 같이 확인할 수 있다.
sudo ufw status
만약 좀 더 자세한 정보를 보고 싶다면 다음 명령어를 사용할 수 있다.
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란 무엇인가
firewalld는 CentOS, Rocky Linux, AlmaLinux, RHEL 계열에서 많이 사용하는 방화벽 관리 도구다. firewall-cmd 명령어를 통해 설정하며, zone 개념을 기반으로 보다 유연하게 방화벽을 관리할 수 있다.
설치 여부 및 상태 확인은 다음과 같다.
sudo systemctl status firewalld
만약 확인했을 때 실행 중이 아니라면 다음과 같이 시작할 수 있다.
참고로 둘 다 모두 실행해야 한다. start 명령어는 지금 바로 실행하는 명령어이고 enable의 경우 재부팅 후에도 실행되도록 처리를 해주는 명령어다. start만 실행하는 경우 재부팅 후 방화벽 서비스가 실행되지 않을 수 있다.
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에서 잠깐 언급하긴 했지만 처음 다룰 때 실수를 하는 것 가운데 하나다. 아래의 명령어를 확인보면 간단히 알수 있다. firewall에는 ssh 사용 포트로 사용자가 바꾸었건 말건간에 22번 포트를 리턴한다.
firewall-cmd --info-service=ssh결과: ports: 22/tcp
그렇다고 방법이 없는 것은 아니다. firewalld의 ssh 서비스 정의 자체를 수정해서 22/tcp 대신 2222/tcp나 23/tcp로 바꿔 주면 된다. 하지만 그렇게까지 하는 것보다 그냥 포트 방식으로 오픈을 하는 것이 수고로움도 덜하고 다른 사람들과의 협업에도 수월기에 추천하지 않는다.
허용 규칙 삭제
포트를 제거하려면 다음과 같이 입력한다.
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번이 아니라 변경한 포트를 정확히 열었는지 꼭 확인해야 한다.
마무리
리눅스 서버 운영에서 방화벽 설정은 기본적인 보안 작업 가운데 하나다. 필요하지 않은 포트를 열어 두는 것은 보안상 좋지 않기 때문에, 실제로 사용하는 서비스만 허용하고 나머지는 차단하는 습관이 중요하다.
Ubuntu 환경에서는 ufw를, CentOS나 RHEL 계열에서는 firewalld를 주로 사용하게 된다. 두 도구 모두 기본 사용법만 익혀 두면 생각보다 어렵지 않게 설정할 수 있다.
서버를 운영하고 있다면 패키지 설치나 로그 확인만큼이나 방화벽 상태도 함께 점검해 보는 것이 좋다. 특히 SSH, 웹 서비스, DB 포트처럼 외부 노출이 필요한 항목은 반드시 방화벽 설정을 확인한 뒤 운영하는 습관을 들이는 것을 추천한다. 본인 시스템에 맞춰 방화벽 상태를 한 번 점검해 보도록 하자.
Add your first comment to this post