Cloudflare와 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와 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의 일반 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 서비스로 네임서버를 적용하여 작동하는 원리이기에 저런 식으로 직접 설정해주지 않는 이상 조금 힘든 부분이 있는 것 같다.
원리상 틀린 부분이 있다면 댓글 달아주길 바란다.
'서버 > Server' 카테고리의 다른 글
[Server] Nginx 서버를 통한 리버스 프록시 및 로드밸런싱 구축 (0) | 2023.04.06 |
---|---|
[Server]Ngrok으로 아무런 설정 없이 외부에서 간단한 파일 공유 (0) | 2022.07.17 |
[Server]IaaS vs PaaS vs SaaS 클라우드 서비스 모델 개요 (0) | 2022.05.29 |
[Server]OwnCloud 'data 폴더' 바꾸기 (Ubuntu/Debian) (2) | 2022.02.22 |
[Server]Windows에서 XAMPP를 이용한 서버 구축 (0) | 2022.01.18 |
댓글