웹 통신을 할 때 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 포트로 요청을 보내도 성공적으로 응답이 온다!
'개발 일지' 카테고리의 다른 글
JPA 양방향 연관관계 무한 참조 현상 (0) | 2023.06.20 |
---|---|
RestController에서 url 리다이렉트 (0) | 2023.06.17 |
CodeDeploy 자동 배포시 EC2 인스턴스의 환경변수 사용하기 (0) | 2023.06.17 |
Git Actions에서 하위 폴더에 있는 gradle 프로젝트를 빌드 루트 디렉토리로 지정하는 방법 (0) | 2023.06.15 |
카카오 로그인 및 메시지 api를 이용한 메시지 전송 (0) | 2023.06.13 |