포트 포워딩

LinuxBeginner
지금 연습하기

소개

이 실습에서는 포트 포워딩을 배웁니다.

우편물을 받는 주소가 있다고 가정해 보겠습니다. 그런데 새 방으로 이사했고, 이전 방 번호인 80 번으로 발송된 모든 우편물을 새 방 번호인 8080 번으로 자동 배송하고 싶습니다. 모든 사람에게 주소록을 수정해 달라고 요청하는 대신, 건물 관리자가 우편물을 대신 전달하도록 하는 것입니다.

포트 포워딩은 NAT(Network Address Translation, 네트워크 주소 변환) 의 한 기능입니다. 들어오는 트래픽을 다시 작성해 한 포트로 도착한 요청을 다른 대상으로 리디렉션합니다.

따라서 방화벽은 트래픽을 단순히 허용하거나 차단하는 데 그치지 않습니다. 패킷의 대상 정보를 직접 변환해 외부에 공개된 하나의 서비스 진입점이 다른 내부 대상으로 연결되도록 합니다.

시나리오:

8080 번 포트에서 웹 서버가 실행 중입니다. 하지만 일반적인 웹 브라우저는 80 번 포트에서 웹사이트를 찾습니다. 웹 서버를 변경하는 대신 방화벽에 다음과 같이 설정합니다. “누군가 80 번 포트를 두드리면 8080 번 포트로 바로 보내라.”

이 실습에서는 다음 작업을 수행합니다.

  1. 트래픽을 처리하도록 방화벽을 준비합니다 (마스커레이딩).
  2. 80 번 포트를 8080 번 포트로 포워딩하는 규칙을 만듭니다.
  3. 포트 리디렉션의 동작을 테스트하고 이해합니다.

마스커레이딩 활성화

이 단계에서는 firewalld가 포트를 포워딩하기 전에 필요한 네트워크 패킷 수정 권한을 설정합니다. 이 기능을 **마스커레이딩 (Masquerading)**이라고 합니다.

마스커레이딩은 주소 변환의 한 형태입니다. 실제 환경에서는 방화벽이나 게이트웨이가 중간에서 트래픽을 처리하고, 트래픽이 시작된 위치와 다른 주소 컨텍스트에서 온 것처럼 보이게 할 때 주로 사용합니다.

마스커레이딩을 방화벽이 중간자 역할을 수행할 수 있도록 허용하는 기능이라고 생각하면 됩니다. 방화벽은 패킷의 주소 라벨을 다시 작성해 패킷이 올바른 위치에 도착하도록 합니다.

참고: 이 실습 환경에서는 웹 터미널의 연결이 계속 유지되도록 trusted 영역을 활성 영역으로 사용합니다.

먼저 현재 활성화된 영역을 확인합니다.

sudo firewall-cmd --get-active-zones

네트워크 인터페이스 (예: eth0) 와 함께 trusted가 표시될 가능성이 높습니다.

이제 trusted 영역에서 마스커레이딩을 활성화합니다.

sudo firewall-cmd --zone=trusted --add-masquerade

활성화되었는지 확인합니다.

sudo firewall-cmd --zone=trusted --query-masquerade

출력이 yes이면 다음 단계로 진행할 준비가 된 것입니다.

포워딩 규칙 만들기

이 단계에서는 핵심 작업인 포워딩 규칙 생성을 진행합니다.

포워딩 규칙을 사용하면 애플리케이션 자체를 변경하지 않고도 외부에서 보이는 동작을 일정하게 유지할 수 있습니다. 방화벽이 클라이언트가 기대하는 위치와 실제 서비스가 수신 대기하는 위치 사이에서 변환 계층 역할을 합니다.

다음과 같이 설정합니다. “trusted 영역에서 80 번 포트를 대상으로 하는 모든 TCP 트래픽을 8080 번 포트로 포워딩하라.”

다음 명령을 실행합니다.

sudo firewall-cmd --zone=trusted --add-forward-port=port=80:proto=tcp:toport=8080

옵션을 나누어 살펴보겠습니다.

  • port=80: 원래 대상 포트입니다 (이전 방 번호).
  • proto=tcp: 사용하는 프로토콜입니다 (웹 트래픽은 TCP 를 사용합니다).
  • toport=8080: 새 대상 포트입니다 (새 방 번호).

규칙이 올바르게 추가되었는지 확인합니다.

sudo firewall-cmd --zone=trusted --list-forward-ports

출력에 해당 규칙이 표시되어야 합니다.

포워딩 테스트

초기 설정에서 8080 번 포트의 간단한 웹 서버를 시작해 두었습니다. 이 단계에서는 해당 포트에 직접 접속해 웹 서버가 정상적으로 동작하는지 확인합니다.

curl http://127.0.0.1:8080

다음과 같은 출력이 표시되어야 합니다. "Hello from Port 8080! Port Forwarding is working."

이제 자신의 IP 주소를 사용해 80 번 포트에 접속하여 포트 포워딩을 테스트합니다.

먼저 IP 주소를 확인합니다.

MY_IP=$(hostname -I | awk '{print $1}')
echo "My IP is: $MY_IP"

이 IP 주소를 사용해 80 번 포트에 연결합니다.

curl http://$MY_IP:80

테스트 참고 사항: 이 실습을 포함한 많은 Linux 환경에서는 Connection refused 오류가 표시될 수 있습니다. 이는 NAT Loopback이라는 알려진 제한 때문입니다. 커널은 NAT 규칙에 따라 자신의 외부 IP 주소로 연결하려는 동작을 차단하는 경우가 많습니다.

이 제한은 설정이 올바른지와 로컬 테스트 결과를 구분해야 한다는 점에서 중요합니다. 같은 컴퓨터에서 테스트하면 결과가 오해를 일으킬 수 있지만, 규칙 자체는 유효할 수 있습니다.

실제 환경에서는 다른 컴퓨터에서 접속한 방문자가 정상적으로 리디렉션됩니다. 이전 단계에서 list-forward-ports 명령을 실행했을 때 규칙이 표시되었다는 사실이 성공을 확인하는 실제 증거입니다.

규칙 삭제

작업이 끝난 뒤에는 설정을 정리하는 것이 좋습니다. 이 단계에서는 트래픽이 다시 정상적으로 동작하도록 포워딩 규칙을 삭제합니다.

방화벽 관리에서 정리 작업은 중요합니다. 오래된 규칙이 남아 있으면 원래 테스트를 잊은 뒤에도 애플리케이션의 외부 노출 상태가 조용히 변경될 수 있습니다.

규칙을 삭제하려면 규칙을 추가할 때 사용한 것과 정확히 같은 세부 정보를 --remove-forward-port와 함께 지정합니다.

sudo firewall-cmd --zone=trusted --remove-forward-port=port=80:proto=tcp:toport=8080

규칙이 삭제되었는지 확인합니다.

sudo firewall-cmd --zone=trusted --list-forward-ports

출력이 비어 있어야 합니다.

요약

이 실습에서는 포트 포워딩을 사용해 네트워크 트래픽을 리디렉션하는 방법을 배웠습니다. 다음 작업을 수행했습니다.

  1. 방화벽이 패킷을 다시 작성할 수 있도록 마스커레이딩을 활성화했습니다.
  2. 80 번 포트에서 8080 번 포트로 트래픽을 포워딩하는 규칙을 만들었습니다.
  3. NAT Loopback과 로컬 테스트가 때때로 까다로운 이유를 배웠습니다.
  4. 원래 상태로 복원하기 위해 규칙을 삭제했습니다.

포트 포워딩은 데이터베이스나 사용자 지정 애플리케이션과 같은 내부 서비스를 표준 공개 포트로 노출할 때 자주 사용하는 강력한 기술입니다.