안녕하세요. 미뇽입니다.
클라우드 환경에서 가상 머신(VM)을 생성하고 열심히 애플리케이션을 배포했는데, 외부에서 접속이 안 돼 당황했던 경험, 다들 한 번쯤 있으실 겁니다. 저 역시 최근 Oracle Cloud Ubuntu VM 인스턴스에서 서비스를 준비하다가 비슷한 상황을 겪었는데요. 확인해 보니 OS 수준의 방화벽, 바로 iptables
가 활성화되어 특정 포트로의 접근을 막고 있었습니다.
오늘은 이처럼 예기치 않게 마주칠 수 있는 리눅스 방화벽 iptables
에 새로운 포트를 추가하는 방법과, 보다 사용자 친화적인 ufw
(Uncomplicated Firewall)로 방화벽을 교체하고 설정하는 과정을 제 경험을 바탕으로 상세히 공유해 드리고자 합니다.
iptables로 신규 포트 허용하기
iptables
는 리눅스 커널에 내장된 패킷 필터링 프레임워크인 netfilter
를 제어하는 사용자 공간 애플리케이션입니다. 매우 강력하고 세밀한 제어가 가능하지만, 명령어가 다소 복잡하게 느껴질 수 있습니다.
현재 iptables 규칙 확인
먼저 현재 설정된 규칙을 확인하는 것이 중요합니다. 다음 명령어로 확인할 수 있습니다.
sudo iptables -L
-L
옵션은 현재 설정된 모든 체인(chain)의 규칙을 보여줍니다. INPUT
, FORWARD
, OUTPUT
등의 체인이 보일 것이며, 각 체인에 어떤 규칙이 적용되어 있는지 확인할 수 있습니다.
특정 포트 허용 규칙 추가 (예: 8080번 포트)
웹 서버나 애플리케이션이 8080번 포트를 사용한다고 가정하고, 이 포트로 들어오는 TCP 트래픽을 허용하는 규칙을 추가해 보겠습니다.
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
각 옵션의 의미는 다음과 같습니다.
-A INPUT
:INPUT
체인(외부에서 VM으로 들어오는 트래픽)에 새로운 규칙을 추가합니다.-p tcp
: 프로토콜을 TCP로 지정합니다.--dport 8080
: 목적지 포트를 8080번으로 지정합니다.-j ACCEPT
: 해당 조건을 만족하는 패킷을 허용(ACCEPT)합니다.
iptables 규칙 영구 저장
iptables
명령어로 추가된 규칙은 시스템을 재부팅하면 사라집니다. 규칙을 영구적으로 저장하기 위해서는 iptables-persistent
패키지를 사용해야 합니다.
먼저 패키지를 설치합니다.
sudo apt-get update
sudo apt-get install iptables-persistent
설치 과정에서 현재 IPv4 및 IPv6 규칙을 저장할지 묻는 메시지가 나타날 수 있습니다. ‘Yes’를 선택하여 저장합니다.
이미 규칙을 추가한 후 iptables-persistent
를 설치했거나, 규칙 변경 후 다시 저장하려면 다음 명령어를 사용합니다.
sudo netfilter-persistent save
# 또는
sudo systemctl start netfilter-persistent
sudo netfilter-persistent save
팁: iptables
규칙을 변경할 때는 특히 원격으로 서버에 접속해 작업하는 경우, SSH 접속 포트(기본 22번)를 막지 않도록 각별히 주의해야 합니다. 규칙을 잘못 설정하면 서버에 접속하지 못하는 불상사가 생길 수 있습니다. 중요한 변경 전에는 항상 현재 설정을 백업하거나 신중하게 검토하는 습관이 필요합니다.
더 쉽고 간편하게, ufw 방화벽으로 전환하기
iptables
가 강력하지만 다소 어렵게 느껴진다면, ufw
(Uncomplicated Firewall)가 좋은 대안이 될 수 있습니다. ufw
는 iptables
를 보다 쉽게 관리할 수 있도록 설계된 인터페이스를 제공하며, 특히 일반적인 방화벽 설정 작업을 훨씬 직관적으로 수행할 수 있게 해줍니다.
ufw 설치 확인 및 설치
Ubuntu에는 ufw
가 기본적으로 설치되어 있는 경우가 많습니다. 만약 설치되어 있지 않다면 다음 명령어로 설치할 수 있습니다.
sudo apt-get update
sudo apt-get install ufw
ufw
로 전환 전 주의사항: 기존 iptables
규칙 처리
ufw
는 내부적으로 iptables
를 사용해 규칙을 관리합니다. 따라서 ufw
를 사용하기로 결정했다면, 기존에 iptables-persistent
등을 통해 수동으로 관리되던 iptables
규칙과의 충돌을 피하는 것이 중요합니다.
가장 깔끔한 방법은 기존의 iptables
규칙을 초기화하고, iptables-persistent
서비스를 비활성화하여 ufw
가 방화벽 규칙을 완전히 제어하도록 하는 것입니다.
기존 iptables 규칙 초기화 (주의!):
sudo iptables -F # 모든 체인의 규칙을 삭제
sudo iptables -X # 비어있는 사용자 정의 체인 삭제
sudo iptables -Z # 모든 체인의 카운터 초기화
중요: 이 명령은 현재 활성화된 모든 iptables
규칙을 즉시 삭제합니다. SSH 연결이 끊어질 수 있으므로, ufw
에서 SSH를 허용한 후 진행하거나 콘솔 접근이 가능한 환경에서 신중하게 실행해야 합니다.
iptables-persistent 서비스 중지 및 비활성화:
sudo systemctl stop netfilter-persistent
sudo systemctl disable netfilter-persistent
저장된 iptables 규칙 파일 삭제 (선택 사항, 권장):
규칙 파일 위치는 시스템에 따라 다를 수 있으나, 일반적으로 /etc/iptables/rules.v4 와 /etc/iptables/rules.v6 입니다.
sudo rm /etc/iptables/rules.v4
sudo rm /etc/iptables/rules.v6
이제 ufw
를 안심하고 설정할 수 있는 환경이 마련되었습니다.
ufw 기본 설정 및 활성화
기본 정책 설정 (중요):
외부에서 들어오는 모든 연결은 기본적으로 차단하고, 내부에서 나가는 모든 연결은 허용하는 것이 일반적인 보안 정책입니다.
sudo ufw default deny incoming
sudo ufw default allow outgoing
필수 포트 허용 (SSH):
방화벽을 활성화하기 전에 반드시 SSH 접속 포트를 허용해야 합니다. 그렇지 않으면 서버에 접속할 수 없게 됩니다.
sudo ufw allow ssh # 기본 SSH 포트 22번을 허용
# 또는 포트 번호를 직접 지정
# sudo ufw allow 22/tcp
애플리케이션 포트 허용 (예: 8080번 포트):
앞서 iptables에서 예시로 들었던 8080번 포트를 ufw로 허용해 보겠습니다.
sudo ufw allow 8080/tcp
서비스 이름(예: http
, https
)으로도 포트를 지정할 수 있습니다: sudo ufw allow http
(80/tcp 허용)
ufw 활성화:
모든 준비가 완료되었으면 ufw를 활성화합니다.
sudo ufw enable
활성화 시 기존 연결이 끊어질 수 있다는 경고 메시지가 나타납니다. ‘y’를 입력하여 진행합니다.
ufw 상태 확인 및 관리
상태 확인:
sudo ufw status
# 자세한 정보 확인
sudo ufw status verbose
# 규칙 번호와 함께 확인
sudo ufw status numbered
규칙 삭제:
규칙 번호를 확인한 후 해당 번호로 삭제할 수 있습니다. (예: 1번 규칙 삭제)
sudo ufw delete 1
또는 추가했던 방식 그대로 delete
를 사용합니다.
sudo ufw delete allow 8080/tcp
ufw
비활성화:
sudo ufw disable
개인적으로는 여러 프로젝트를 관리하면서 다양한 포트를 열고 닫아야 할 때 ufw
의 간결함이 매우 편리하게 느껴졌습니다. 특히 복잡한 네트워크 설정이 필요 없는 경우, ufw
는 시간과 노력을 크게 절약해 주는 훌륭한 도구라고 생각합니다.
마무리
오늘 설명해 드린 iptables
와 ufw
사용법이 여러분의 서버 운영에 조금이나마 도움이 되었으면 좋겠습니다. 저 역시 이러한 과정을 통해 리눅스 시스템과 네트워크에 대한 이해를 더욱 깊게 할 수 있었습니다.
읽어주셔서 감사합니다. 🙂