사설 주소의 Jenkins Web UI 사용법 - Nginx Proxy Manager & NoIP 구성

서론

프로젝트에서 AWS 서비스 환경을 구성하는 도중,

사설 네트워크 환경(Private Subnet)에 Jenkins를 구성하도록 설계를 해놓고선, "어떻게 사설 네트워크에 존재하는 Jenkins Web UI 사용할 수 있지?" 라는 고민을 하게 되었다.

 

이를 Nginx Reverse Proxy을 사용하여 해결한 사례를 공유하고자 한다.

 

구성 환경

본인이 사용했던 환경 및 필요한 요소는 다음과 같다.

  • AWS Pubic Subnet & Private Subent 각각 최소 하나씩
    • Internet Gateway & Nat Gateway 구성을 수행
  • Public Subnet의 Bastion Host(EC2)
    • 공인 IP 보유해야함.
  • Private Subnet의 EC2(GitOps Host)
    • 공인 IP 없음
  • Domain Name 및 DNS 등록 - NOIP
  • Bastion Host의 Docker 기반 Nginx & Nginx Proxy Manager
  • GitOps Host의 Jenkins - 어떤 걸로 설치하던 상관 X

위의 요소들을 사용했다.

이런 상황이였다.

환경을 다이어그램으로 표현하면 위와 같았다.


Reverse Proxy

이를 수행할 수 있는 다양한 해결 방법이 있겠지만, 본인은 Reverse Proxy를 사용해서 이러한 문제를 해결했다.

 

Reverse Proxy에 대해 간단한게 말로 설명하면, Load Balancer의 역할과 비슷하다고 볼 수 있다(트래픽 분산 안해주는).

 

즉, 자신에게 들어오는 트래픽을 내가 관리하고 있는 뒤쪽 호스트에게 대신 전달하게 만들면 된다.

 

"대신 한다" 라는 측면이 Proxy의 핵심 키워드이니 이를 가져갔으면 좋겠고, Reverse란 용어는 내 앞으로 온 걸 뒤쪽으로 전달하는 기술이기 때문에 Reverse라는 키워드가 붙는다고 생각하면 될 것 같다.

 

반대로 생각하면 Forward Proxy란 개념 또한 존재한다.

 

아무튼, 해당 기술에 대해서 훨씬 잘 설명하신 블로거분들이 많으니깐, 이글에서 자세한 설명은 생략한다.

 

이렇게 한다는 의미


Nginx Proxy Manager

Reverse Proxy를 구현하는 방법 또한 많지만, 본인은 간단하게 구현하기에 충분했으므로 Nginx Proxy Manager를 통해 이러한 구조를 구현하였다.

 

Nginx Proxy Manager는 Nginx를 통한 Revsers Proxy 및 인증서 관리를 간단하게 해주는 아주 유용한 도구이다. 카카오 멘토님에게 감사를..

 

Reverse Proxy를 구성하는 과정과 인증서를 받아오는 과정을 굉장히 간단하게 수행해주는 Nginx의 확장 플러그인이라고 생각해도 무방할 것 같다.

 

공식적으로 docker-compose를 통해 구동되므로 다른 환경에서 돌리는 방법은 생략하도록 하겠다.

(Nginx Proxy Manager를 사용하기 위해 mariaDB를 별도로 구성해야해서 그런 것 같다.)

 

아무튼, Bastion Host에 Nginx-Proxy-Manager를 설치하면 아래와 같은 환경을 확인할 수 있다.

docker로 같이 떠있는 nginx-proxy-manager 및 mariadb

이를 구현시키는 부분은 아래의 공식 문서를 참고하길 바란다.

 

Nginx Proxy Manager

Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt

nginxproxymanager.com

이렇게 설치하고, Bastion Host의 81번 포트로 접속하면, 아래와 같은 Nginx Proxy Manager UI를 확인할 수 있다.

최초의 ID와 비밀번호는 아래와 같다.

  • admin@example.com
  • changeme

처음 접속하고 나서는 해당 ID와 비밀번호를 변경하면 된다.


Reverse Proxy Configuration

Nginx Reverse Proxy를 구동시키고 나면, Reverse Proxy를 구성하는 것 자체는 굉장히 간단하다.

 

Nginx만 사용하게 된다면 nginx.conf 파일을 직접 수정하면서 이를 구성해야하는데, Web UI를 사용하여 클릭만으로 이를 구성할 수 있게 된다!

 

정상 접속 시!

로그인 후 제공하는 페이지는 다음과 같다.

 

이 중에서 이미 구성되어 있는 Proxy Host 항목을 클릭하여서 원하는 구성을 시작하면 된다.

Proxy Host 구성 창

위의 창을 통해서 현재 Nginx Proxy Manager에서 설정할 Reverse Proxy Host를 설정할 수 있다.

 

본인은 최초에 Domain Names은 아무거나 적었었고, Bastion Host의 IP와 Forward Port만 적어서 이를 사용했다.

 

PoC를 진행하는 과정에서 도메인 없이 수행했던 Reverse Proxy 부분 - 뉴진스는 최고다

위의 구성을 통해서, 도메인 명 없이 Reverse Proxy를 제공하는 구성 자체는 끝이 난다.


인증서 발급받기 & HTTPS 접속 구성

이렇게만 구성했어도 충분히 사용이 가능하지만,

  • 현재 Floating IP를 사용하지 않는 Bastion Host를 다시 시작하게 되면 공인 IP가 변경된다는 점
  • Jenkins 접속할때마다 IP를 확인해서 접속한다는 점
  • HTTPS가 아닌 HTTP 통신이기 때문에 실제로 보안적인 측면에서 우려가 된다는 점

위의 3가지 이유 때문에(사실 첫번째 이유는 관련없음), HTTPs 통신을 위한 인증서를 발급받고 이를 등록하고자 했다.

 

이를 위해서 여러가지 시도를 해보았지만, 가장 간편하게 구성할 수 있는 점은 "Let's Encrpyt" & "NoIP" 의 조합을 통해서 간단하게 위의 문제점 중 일부를 해결할 수 있었다.

 

Floating IP는 비용을 더 내고 싶지 않아서 따로 사용하진 않았다.

 

사실, 위의 Nginx Proxy Manager를 통해서 "Let's Encrpyt!"에서 발급해주는 무료 인증서를 3개월마다 갱신해주고 이를 직접 발급받아주고 등등.. 모든 관리를 해주기 때문에 너무나도 편리하다.

 

다만, Nginx Proxy Manager를 통해 인증서를 발급받기 위해선 도메인 주소가 필수적이고, 이를 구성하기 위해서 가비아에서 돈을 주고 사야하나... 같은 생각을 했었다.

 

도메인 이름을 사는건 얼마 안하지만, 이를 DNS Server에 등록하는데도 비용이 발생하고, 무엇보다 한번 쓰고 말거... 라는 생각 때문에 돈을 지불하고 싶지 않았다. 나중에는 개인 도메인을 파야지!

 

아무튼 비용없이 개인 도메인을 발급받을 수 있는 서비스 중 하나는 NoIP였고, 이를 통해서 개인 도메인 하나를 발급받는 것은 물론, DNS Server에 등록까지 해준다.

 

Free Dynamic DNS - Managed DNS - Managed Email - Domain Registration - No-IP

How to Pair The Best DDNS Provider to Your Needs Explore which DDNS provider fits your needs best. Whether you’re a remote worker, small business, enterprise, or gaming enthusiast, there is an option for you. Learn more

www.noip.com


도메인 발급 받기

필요한 절차를 표현하면,

  1. NoIP에서 도메인 하나를 제공받는다. - 다양한 도메인 선택 가능
  2. NoIp에서 해당 도메인과 Bastion Host의 Public IP를 1:1로 매핑하여 DNS Server에 등록한다.

이를 수행하면 아래와 같은 대시보드를 통해 확인이 가능하다.

NoIp Web UI

좌측의 Hostname에 발급받은 도메인 명이 들어가게 되고, IP/Target에는 사용 중인 Bastion Host의 Public IP를 구성하면 된다.

 

두 요소가 매핑된 후 상태가 Active이면 활성화된 상태이다.


Nginx Proxy Manager SSL Certificate Configuration

여기까지 왔으면, 이제 구성할 것은 거의 끝났다.

 

NoIP를 통해 DNS Server에 도메인 등록까지 마쳤으면, 이를 이용하여 다시 Proxy Host의 Domain name을 입력하고, SSL 항목에 접속해서 Let's Encrpyt의 인증서를 등록하는 버튼을 누르면 끝이다!

 

이를 통해서 해당 도메인으로 https 통신을 지원하도록 Reverse Proxy를 구성할 수 있다.

SSL 인증서가 발급된 상태. 주기적으로 인증서를 갱신할 필요도 없다.


결론

Nginx Proxy Manager와 NoIp를 통해서 간단하게 도메인 명을 발급받고, 이를 DNS Server에 등록까지 수행해서, Reverse Proxy 및 HTTPS를 위한 인증서까지 발급받은 과정을 수행했다.

 

인증서를 발급받고 크롬 브라우저에서 접속하면, 아래와 같이 경고 창을 띄워주는데, 현재 도메인에서 XSS 또는 CSRF 등의 안정성이 검증이 거쳐지지 않아서, 그런가보다 싶다. 크롬 브라우저에 등록된 정보를 탈취할 수도 있는, 검증이 안된 사이트이기 때문!

로그인 되어 있는 크롬 브라우저에서 접속 시

본인은 찜찜해서 시크릿 모드로 들어가서 작업한다.

별 문제 없이 Private Subnet에 존재하는 Jenkins UI 접속 가능

지금까지 구성한 것들에 대해 접속 흐름을 다이어그램으로 간단하게 표시하면서 이 글을 마친다.

728x90
반응형