개발 일지 / / 2023. 6. 17. 19:15

아마존 리눅스 EC2 인스턴스에서 포트포워딩하는 법

웹 통신을 할 때 url에 포트를 입력하지 않는다면

http 프로토콜의 경우는 80포트로 통신하며

https 프로토콜의 경우는 443포트로 통신하게 된다.

 

아파치 톰캣(아파치 + 톰캣) 서버의 기본 포트는 8080이다.

그러므로 아파치 톰캣 서버 위에 웹 앱을 구동한다면

사용자가 서버와 통신하기 위해선 8080 포트를 입력해야 한다.

 

하지만 많은 웹 서비스를 보면 포트를 입력하지 않아도 된다.

서버의 포트를 80 또는 443 포트로 지정하면 되지만

기본 포트는 사용중인 프로그램이 있을 수도 있기에 충돌이 일어날 위험이 있다.

 

외부에서 접속한 아이피, 포트를

내부의 아이피, 포트와 연결시켜주는 기술인

포트포워딩(포트 매핑)을 이용하면

사용자는 포트를 입력하지않아도

8080 포트 혹은 다른 포트를 사용하는 서버와 통신할 수 있다.

 

또한 리버스 프록시를 사용하는 방법도 있다.

이건 서버에 ssl을 적용하고 리다이렉트도 필요해서

웹 서버를 추가로 띄우고 사용해보게 되었는데

성능 이슈는 잘 모르겠지만

복잡한 설정이 없어 사용하기에 굉장히 편리했다.

다른 글에서 간단하게 소개할 생각이다.

 

아무튼 웹 서버도 운영체제에서 실행되는 하나의 프로세스이기 때문에

통신 요청은 운영체제를 거쳐 웹서버에 도달한다.

 

그렇기 때문에 운영체제가 중간에서 다른 곳으로 요청을 넘겨줄 수 있는데

요청을 넘겨주는 것 뿐만이 아니라

원하지 않는 요청을 무효시켜 트래픽을 차단시킬 수도 있다.(필터링)

 

AWS 서비스에서 포트포워딩 혹은 비슷한 기능을

사용할 수 있는 방법을 알아보다 세 가지를 찾게 되었는데

 

첫번째는 로드밸런서를 이용한 방법이다.

AWS에는 여러 종류의 로드밸런서가 있는데(ALB, NLB, CLB, GLB가 있다.)

서버의 부하의 분산시켜주고

ssl(https)도 적용할 수 있다고 한다.

다만 AWS의 과금 정책상 무료 사용량을 초과하면 비용이 발생한다..

 

그래서 두번째 방법을 사용했는데

iptables(리눅스 커널의 방화벽)을 이용해서

EC2로 들어오는 통신 요청을 EC2 내부에서

다른 포트를 사용하는 프로세스(서버)로 넘겨준다.

다른 서비스를 사용하지 않아도 되고 무료다..!

요즘은 업그레이드된 nftables를 사용한다고 한다.

 

세번째는 리버스 프록시인데 이 방법은 좀 더 나중에 알게되었다.

 

iptables는 사용자가 제어할 수 있는 오픈소스 방화벽이라고 한다.

다시말해 네트워크 통신에 관한 것들을 사용자가 제어할 수 있다.

포트포워딩뿐만 아니라

패킷, 응용 계층 필터링,

상태 기반 연결 추적(무상태 연결도 가능),

로깅도 가능하다고 하는데 자세히는 모르겠다.

당장 필요한 포트포워딩만 사용하겠다.

 

사용중인 EC2 인스턴스의 운영체제는 아마존 리눅스 2023인데

iptables를 설치해야 했다.

yum install iptables
yum install iptables-services

명령어를 사용하면 iptables가 설치된다.

하지만 설치 직후 두가지 문제를 만났다.

 

첫번째는 iptables를 설치해도

바로 실행되는 것이 아니기 때문에

수동으로 실행 시켜야하고

부팅시(인스턴스 시작시) 자동으로 실행 되도록 설정해야 했다.

systemctl enable iptables # 자동 실행 설정
systemctl start iptables # 서비스 시작

iptables가 시작되면 80 포트의 요청을 8080으로 redirect 해주도록 한다.

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 # 80 -> 8080 포트포워딩
sudo service iptables save # 저장

여기까지 하면 될 줄 알았다..

하지만 80 포트로 요청을 보내도 묵묵부답이다.

 

iptables를 설치 했을때 기본적으로 몇몇 규칙이 정의되어 있어서

요청이 차단되었던 것이 이유였다.

 

EC2의 경우 보안 그룹 규칙도 같이 적용되기에

iptables의 규칙을 모두 삭제했다.

혹시 아직 안했다면 보안 그룹의 인바운드 규칙에서 80 포트를 열어줘야 한다.

이제 80 포트로 요청을 보내도 성공적으로 응답이 온다!

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유