본문 바로가기
서버/Server

[Server]Cloudflare와 Ngrok의 리버스 프록시 구동 방식의 차이점

by jamong1014 2022. 7. 14.
반응형

Cloudflare와 Ngrok 서비스를 이용하는 도중 문뜩 떠오르는 궁금증이어서 끄적여본다.

그 전에 아래 내용을 통해 리버스 프록시의 개념부터 알아보자

[Network]포워드 프록시(Forward Proxy)와 리버스 프록시(Reverse Proxy)

포워드 프록시(Forward Proxy) 우리가 흔히 사용하는 프록시 개념이다. 클라이언트(사용자)가 다이렉트로 직접 서버에 접근하는 것이 아닌 중간 중계기 역할을 해주는 프록시라는 서버가 먼저 요청

jamong1014.tistory.com

Ngrok 통신 원리

Ngrok 서비스는 tcp 기준 'localhost:22'로 포워딩할 경우 '0.tcp.ngrok.io:12345' 이런 식으로 포워딩이 된다.
즉 0.tcp.ngrok.io:12345 -> localhost:22 포워딩이 이루어진단 뜻이다.

Cloudflare는 기본 Http/Https가 아닌 그 외 tcp 포트들은 Zero Trust를 이용해 Self hosting을 하여 리버스 프록시를 설정해줘야 한다.

[Cloudflare]SSH, VNC, Minecraft 등을 Cloudflare을 통해 액세스 하는법

단계 설명 Cloudflare Zero Trust 등록 Zero Trust 정책 생성 서버에 클라우드 플레어 설치 (로그인까지) 참고 : https://jamong1014.tistory.com/108?category=913441 NextCloud에 Cloudflare 적용하기!! (OwnCl..

jamong1014.tistory.com

여기서 의문이 드는 생각이 Cloudflare와 ngrok은 똑같은 리버스 프록시 시스템인데 ngrok은 tcp 기반으로 ./ngrok http 80과 똑같은 방식으로 tcp 또한 열 수 있는데 Cloudflare는 Http/Https 이외에는 Self hosting을 하여서 클라이언트에서 Cloudflare 명령어를 따로 입력해줘야 한다.

cloudflared.exe access tcp --hostname sshd.foolblack.com --url 192.168.1.178:22

(192.168.1.178(내 사설 아이피)가 22번 포트 기준으로 호스트 네임의 sshd.foolblack.com으로 포워딩한다라는 뜻)

즉 Cloudflare는 80포트 Http/Https 웹 프로토콜은 기본적으로 터널링이 되어 있는 상태여서 별 다른 설정 없이 Cloudflare Nameserver만 적용해도 터널링이 이루어지는 것이고 이 외의 tcp 기반 포트 설정은 내가 직접 해줘야 된단 뜻이다.

Cloudflare와 Ngrok이 이런 차이점을 보이는 것은 구동방식의 차이점과 CDN Nameserver 적용 서비스 구조에 대한 차이점이 있어보인다.
앞서 Ngrok에서 언급했듯이 '0.tcp.ngrok.io:12345 -> localhost:22 포워딩이 이루어짐'을 보면 시작 포트는 내가 지정해주지 않았다.

Ngrok은 자동으로 12345 라는 포트를 지정해준 것이다.
반면 Cloudflare를 보면 config.yml 파일을 통해 터널을 뚫어주게 되는데...

tunnel: 01f0928b-6a11-4254-854c-4173b5b74f2e 
credentials-file: /home/janne/.cloudflared/01f0928b-6a11-4254-854c-4173b5b74f2e.json 

ingress:
- hostname: sshd.foolblack.com
  service: ssh://192.168.1.5:22
- service: http_status:404

(config.yml 내용)

여기서 보면 hostname이 sshd.foolblack.com이고 여기에 매핑되어 있는 것이 ssh://192.168.1.5:22로 연결되어있다.
여기서 내가 헷갈렸던 부분이 그냥 단순히 'ssh 접속할 때 sshd.foolblack.com 호스트 적고 포트는 22번 적고 들어가면 되는 거 아니냐??'라고 생각했지만 이렇게 생각한 이유는 http 또한 이런 방식으로 접근했기 때문이다.

Cloudflare 통신 원리

Cloudflare의 리버스 프록시 통신 원리인데 보면 알 수 있듯이 통신 기반이 웹 프로토콜을 기반으로 통신을 하는 것이다.

즉 Cloudflare의 일반 Http 통신은
http.foobllack.com(웹 브라우저로 접속)

Cloudflare Network(이미 Http 프로토콜의 터널링이 되어 있어 암묵적으로 http.foobllack.com:80으로 통신하는 걸 알고 있음)

내 서버(http.foobllack.com:80 -> localhost:80)으로 연결 성립


Cloudflare의 tcp port 22 통신
여기서 한번 헷갈렸던 때로 돌아가서 내가 생각했던 원리대로 보자면
sshd.foolblack.com(putty 클라이언트로 22번 포트로 접속)

Cloudflare Network(tcp 22번 포트는 터널링 되어 있지 않아서 여기서 이미 통신 안됨. tcp 포트가 지정되어 있지 않아 누가 통신하는 건지 모름)


다시 정상적인 원리로 보면
'cloudflared.exe access tcp --hostname sshd.foolblack.com --url 192.168.1.178:22' 라는 전용 명령어를 통해 '내가 지금 클라우드플레어를 tcp 192.168.1.178:22에서 sshd.foolblack.com로 포워딩하여 통신한다'라고 명시하는 부분

192.168.1.178:22(putty 클라이언트로 192.168.1.178의 22번 포트 접속)

Cloudflare Network(클라이언트에서 포워딩 규칙을 추가하여 192.168.1.178:22 호스트가 sshd.foolblack.com으로 터널링 할 수 있다는 걸 증명)

내 서버(sshd.foolblack.com -> localhost:22)으로 연결 성립


원리가 조금 난잡하여 이해하기 힘들 수 있지만 그냥 간단하게 ngrok은 tcp로 포워딩할 때 랜덤으로 포트를 알아서 지정해주어서 터널링이 가능하지만 Cloudflare는 애초에 CDN 서비스인 네임서버를 적용하여 웹 기반으로 작동하는 서비스이기에 기본이 80 포트인 것이고 이외에는 직접 설정해줘야 하는 것이다.

사실 Cloudflare도 tcp로 설정할 때 랜덤으로 포트를 지정해주면 이론적으로 ngrok과 같이 편리하게 tcp 통신이 가능하겠지만 CDN 서비스로 네임서버를 적용하여 작동하는 원리이기에 저런 식으로 직접 설정해주지 않는 이상 조금 힘든 부분이 있는 것 같다.

원리상 틀린 부분이 있다면 댓글 달아주길 바란다.




반응형

댓글