Lesson 14 of 20
터널 — 포트를 하나도 열지 않고 밖에 내놓는다
cloudflared 는 서버가 밖으로 거는 전화다
13강의 문제는 밖에서 안으로 들어오는 게 막힌다는 것이었습니다. 그런데 안에서 밖으로 나가는 건 잘 되죠. 웹 서핑이 되니까요.
터널은 그 성질을 뒤집어 씁니다. 서버가 먼저 클라우드플레어로 전화를 걸어 두고, 그 선을 끊지 않습니다. 손님이 오면 클라우드플레어가 그 선을 타고 요청을 내려보내요.
포트포워딩과 무엇이 다른가
포트포워딩
밖 → 안. 포트를 연다.
공인 IP 가 필요합니다. CGNAT 이면 불가능.
IP 가 노출되고, 봇이 곧바로 두드립니다.
공인 IP 가 필요합니다. CGNAT 이면 불가능.
IP 가 노출되고, 봇이 곧바로 두드립니다.
cloudflared 터널
안 → 밖. 포트를 하나도 안 엽니다.
공인 IP 가 필요 없습니다. CGNAT 이어도 됩니다.
IP 가 노출되지 않습니다.
공인 IP 가 필요 없습니다. CGNAT 이어도 됩니다.
IP 가 노출되지 않습니다.
세우는 순서
$ cloudflared tunnel login # 브라우저가 열려 도메인을 고른다
$ cloudflared tunnel create mytunnel # UUID 와 자격증명 json 이 생긴다
$ cloudflared tunnel route dns mytunnel app.example.com
# CNAME 레코드가 자동으로 만들어진다
$ sudo cloudflared service install # systemd 로 등록해 늘 살아 있게 한다
설정 파일 — 어느 이름을 어느 앱에
tunnel: <UUID>
credentials-file: /etc/cloudflared/<UUID>.json
no-autoupdate: true
ingress:
- hostname: app.example.com
service: http://localhost:3019
- hostname: lab.example.com
service: http://192.168.219.48:8765
originRequest:
noTLSVerify: true
connectTimeout: 30s
- service: http_status:404 # 맨 끝에 반드시 하나
ingress 는 위에서부터 차례로 봅니다. 먼저 맞는 줄이 이깁니다.
맨 마지막 줄에는 hostname 없는 기본값이 반드시 있어야 하고요 — 없으면 시작하지 않습니다.
순서를 바꿔 보세요 — 와일드카드를 위로 올리면 app 이 가려집니다.
Python
Runs in your browser
🤔 Check yourself
cloudflared 터널이 NAT 을 통과하는 원리는?
Answer 나가는 연결은 NAT 이 막지 않습니다. 그 선을 끊지 않고 두었다가 손님의 요청을 그 선으로 내려보내는 것 — 그래서 열 포트가 하나도 없습니다.
🤔 Check yourself
ingress 목록의 맨 마지막 줄에 반드시 있어야 하는 것은?Answer 어느 규칙에도 안 맞는 요청을 받을 곳이 필요합니다. 보통
service: http_status:404 를 둡니다. 없으면 cloudflared 가 아예 뜨지 않습니다.