[Diary] AWS EC2에서 겪은 포트포워딩 문제: 리눅스 네트워크 인터페이스 eth0와 enX0
본문 바로가기

Development/Diary

[Diary] AWS EC2에서 겪은 포트포워딩 문제: 리눅스 네트워크 인터페이스 eth0와 enX0

AWS EC2 인스턴스를 사용하여 웹 애플리케이션을 배포할 때, 퍼블릭 IPv4 DNS 주소를 통해 애플리케이션에 접속할 수 있습니다. 하지만 사용자는 종종 주소 끝에 애플리케이션이 동작하는 포트 번호를 추가해야 합니다. 

이 문제를 해결하기 위해 포트포워딩을 설정하여 포트를 입력하지 않으면 자동으로 웹 서버 포트로 리디렉션 하도록 하려 했으나, 네트워크 인터페이스 이름을 잘 못 설정하여 동작하지 않았습니다.

 

이 글에서는 AWS EC2에서 포트포워딩 설정 중 발생한 문제와 그 해결 과정을 공유하고자 합니다.

문제 상황 재현: EC2에 접속하여 포트포워딩 진행

포트 번호를 입력하지 않아도 자동으로 접속되기 위해, 80포트로 오는 요청을 8080 포트로 전달하게 하는 포트포워딩 명령어를 다음과 같이 입력하였다.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

 

이 명령어는 eth0 네트워크 인터페이스로 들어오는 패킷에 대해 모든 TCP 트래픽 중 포트 80으로 들어오는 것을 포트 8080으로 리디렉션 한다.

참고:
포트 80은 HTTP (HyperText Transfer Protocol) 요청을 처리하기 위한 기본 포트이다. 웹 브라우저에서 URL을 입력할 때 포트를 명시하지 않으면 기본적으로 포트 80을 사용하여 HTTP 요청을 보낸다.
대부분의 웹 서버(예: Apache, Nginx)는 기본적으로 포트 80을 통해 들어오는 HTTP 요청을 처리하도록 설정된다.

포트 8080은 주로 개발 및 테스트 환경에서 HTTP 요청을 처리하기 위해 사용되는 포트이다. 포트 80이 이미 사용 중이거나 접근이 제한된 경우, 포트 8080을 대체 포트로 사용한다.
Tomcat, Jetty와 같은 애플리케이션 서버는 기본적으로 포트 8080을 사용하여 HTTP 요청을 처리하도록 설정될 수 있다.
위 상황은 Spring boot로 웹 애플리케이션을 배포하였으므로, 8080 포트로 리디렉션 하고 있다.
sudo iptables -t nat -L -n -v

위 명령어를 사용해 iptables의 nat 테이블을 확인할 수 있다.

포트포워딩이 잘 적용된 것을 확인할 수 있다.

하지만 포트 번호를 지우고 접속하면 위처럼 연결이 되지 않았다.

문제 원인 분석: 네트워크 인터페이스 

이미지 출처: Understanding Network Interface Cards ❘ Voltrium Systems

네트워크 인터페이스두 가지 네트워크 장비 또는 프로토콜 계층이 연결되는 지점이다.

이는 네트워크 상의 다른 기기들과 데이터를 주고받을 수 있도록 하며, 유선(이더넷 카드) 또는 무선(Wi-Fi 어댑터)으로 구현될 수 있다.

전통적인 네트워크 인터페이스 이름 (eth0)

전통적으로 리눅스 시스템에서는 네트워크 인터페이스 이름이 eth0, eth1 등과 같은 형식을 사용했다. 이는 기본적으로 네트워크 인터페이스의 순서에 따라 할당되었다. 이 방식은 직관적이지만, 네트워크 인터페이스의 이름이 부팅 시점이나 하드웨어 변경에 따라 달라질 수 있다. 예를 들어 서버에 새로운 네트워크 카드가 추가되면 기존의 eth0가 eth1으로 바뀌거나, 반대로 새로운 카드가 eth0으로 할당될 수 있다. 이로 인해 기존의 네트워크 설정이 엉망이 될 수 있다.

Predictable Network Interface Names: enX0 

systemd의 도입과 함께 리눅스 커뮤니티는 네트워크 인터페이스에 예측 가능한(Predicatable) 이름을 부여하는 규칙을 적용하기 시작했다. 이는 네트워크 인터페이스가 하드웨어 구성에 따라 고유하고 일관되게 이름이 지정되도록 한다.

enX0와 같은 예측 가능한 네트워크 인터페이스 이름은 물리적 위치나 하드웨어 구성에 따라 고유하게 결정된다. 예를 들어, enp3s0는 PCI 버스 3의 슬롯 0에 있는 인터페이스를 의미한다. 이러한 예측 가능한 이름 덕분에 이름의 일관성을 지키고, 네트워크 장치가 정확히 어디에 연결되어 있는지를 쉽게 알 수 있게 해 주었다.

systemd는 Linux 운영 체제에서 시스템 및 서비스 관리 도구이다. 이는 Linux의 초기화 시스템으로, 시스템 부팅 시 서비스를 관리하고, 프로세스를 시작하거나 중지하는 등 시스템 상태를 제어하는 역할을 한다.

문제 해결하기: 네트워크 인터페이스 이름 변경

Ubuntu 22.04 LTS 및 그 이후의 버전에서는 systemd의 예측 가능한 네트워크 인터페이스 이름 지정 방식이 기본으로 사용된다. 따라서 일반적으로 eth0 대신 enX0와 같은 이름이 사용된다.

 

아래 명령어로 EC2 인스턴스가 사용하는 네트워크 인터페이스를 확인해 보았다.​

ip addr

위 밑줄과 같이 enX0를 사용하고 있는 것을 확인할 수 있었다.

 

먼저 아래 명령어를 사용하여 기존 규칙을 지우고

sudo iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

enX0 네트워크 인터페이스로 수정하여 아래 명령어를 입력한다.

sudo iptables -t nat -A PREROUTING -i enX0 -p tcp --dport 80 -j REDIRECT --to-port 8080

포트포워딩이 잘 동작한다.

마치며

처음 입력한 명령어는 EC2 배포 강의 교재를 참고한 명령어인데, 강의 교재에서 사용한 ubuntu 버전은 18.04를 사용하고 있었다. 이 때문에 eth0 네트워크 인터페이스를 사용하니, 버전 차이로 인해 동작하지 않았던 것.

항상 버전을 확인하고 호환성을 체크해야겠다고 느꼈다.

참조