
μλ νμΈμ! Nκ°μ μ°¨ ν μλ² μ΄μμμ λλ€.
μ€λμ μ κ° κ±°μ ν λ¬κ° κ²ͺμλ λμ°ν λ¬Έμ μ, λ무λλ ν무νκ³ κ°λ¨νλ κ·Έ ν΄κ²°μ± μ 곡μ νλ € ν©λλ€.
νΉμ “Cloudflared ν°λλ‘ μ°κ²°ν λ΄ μλΉμ€κ° 1~2λΆλ§λ€ λκ²Όλ€κ° λ€μ λΆμ΄μ!” νΉμ “SSH μ μμ΄ μκΎΈ λ겨μ!” νλ λΆμ΄ μλ€λ©΄, μ΄ κΈμ΄ λΉμ μ μκ°μ μκ»΄μ€ κ²μ λλ€.
π ν λ¬κ° μ λ₯Ό κ΄΄λ‘ν μ¦μ
μ λ λ§₯λ―Έλ(Mac mini)μ Dockerλ‘ κ°μ’
μλΉμ€λ₯Ό μ¬λ €λκ³ , Cloudflareμ cloudflared ν°λμ μ΄μ©ν΄ μΈλΆ λλ©μΈμ μ°κ²°ν΄ μ¬μ©νκ³ μμμ΅λλ€.
νμ§λ§ μΈμ κ°λΆν° λͺ¨λ μλΉμ€κ° 1~2λΆ κ°κ²©μΌλ‘ μ μμ΄ λκ²Όλ€ μ΄μλλ ‘μ’λΉ’ μνκ° λμμ΅λλ€.
- μΉ μλΉμ€ μ μμ΄ κ°νμ μΌλ‘ λ¨Ήν΅μ΄ λμλ€κ° μλ‘κ³ μΉ¨νλ©΄ λ€μ λ©λλ€.
cloudflaredν°λμ ν΅ν΄ μ°κ²°ν SSH μΈμ μ΄ νμ΄νμ μ μ λ©μΆλ©΄ κ·Έλλ‘ λ©μΆ°λ²λ¦½λλ€.- 컨ν
μ΄λ μ¬μμ,
autohealμ μ© λ± λ€μν μλλ₯Ό ν΄λ΄€μ§λ§ λͺ¨λ μ€ν¨νμ΅λλ€. λ¬Έμ λ₯Ό νμΈνκΈ° μν΄cloudflared컨ν μ΄λμ λ‘κ·Έλ₯Ό μ°μ΄λ΄€μ΅λλ€.
docker logs -f [λ΄ cloudflared 컨ν
μ΄λ μ΄λ¦]
λ‘κ·Έμλ 1~2λΆ κ°κ²©μΌλ‘ λ€μκ³Ό κ°μ μ§μ₯μ λ©μμ§κ° λ°λ³΅λκ³ μμμ΅λλ€.
ERR failed to accept incoming stream requests error=“failed to accept QUIC stream: timeout: no recent network activity”
ERR failed to run the datagram handler error="timeout: no recent network activity"
INF Retrying connection in up to 1s...
INF Registered tunnel connection ... protocol=quic
… (1~2λΆ λ€) …
ERR failed to accept QUIC stream: timeout: no recent network activity
“μ΅κ·Ό λ€νΈμν¬ νλμ΄ μμ΄μ” νμμμμ΄ λ¬λ€λ λ©μμ§μμ΅λλ€.
π΅οΈββοΈ μ§μ§ λ²μΈμ λ°λ‘ μμλ€: ν 곡μ κΈ°
λ‘κ·Έμ ν΅μ¬ ν€μλλ **QUIC**μμ΅λλ€.
cloudflaredλ κΈ°λ³Έμ μΌλ‘ Cloudflare μ£μ§ μλ²μ QUIC (UDP κΈ°λ°) νλ‘ν μ½λ‘ ν΅μ μ μλν©λλ€. λΉ λ₯΄κ³ ν¨μ¨μ μ΄λκΉμ.
“UDP… νμμμ…?”
νΉμλ νλ λ§μμ μ ν¬ μ§ λ©μΈ 곡μ κΈ°(ipTIME) μ€μ νμ΄μ§μ μ μνμ΅λλ€.
βοΈ (κΏν) λ΄ λ§₯λ―Έλκ° μ°κ²°λ 곡μ κΈ° IP νμΈλ²
ν°λ―Έλμμ netstat -nr | grep defaultλ₯Ό μΉλ©΄ λμ€λ Gateway IPκ° λ°λ‘ λΉμ μ 곡μ κΈ° μ£Όμμ λλ€.
곡μ κΈ° κ΄λ¦¬ νμ΄μ§μ νΈλν½ κ΄λ¦¬ > 컀λ₯μ
μ μ΄ λ©λ΄μμ μ λ λ²μΈμ λ§μ£Όνμ΅λλ€.
- TCP ESTABLISHED TIMEOUT: 86400μ΄ (24μκ°)
- UDP TIMEOUT: 30μ΄ λ°λ‘ μ΄κ²μ΄μμ΅λλ€!
cloudflaredλ UDPλ‘ μ°κ²°νλλ°, μ 곡μ κΈ°λ UDP μ°κ²°μ΄ λ¨ 30μ΄ λμ μλ¬΄λ° νλμ΄ μμΌλ©΄ “λ μ£½μλ?” νκ³ μ°κ²°μ κ°μ λ‘ λμ΄λ²λ Έλ κ²μ
λλ€.
μ΄λ‘ μΈν΄ λ€μκ³Ό κ°μ ‘μ£½μμ μ¬μ΄ν΄’μ΄ λ°λ³΅λμμ΅λλ€.
cloudflaredκ° QUIC(UDP)μΌλ‘ μ°κ²°μ μ±κ³΅ν©λλ€. (protocol=quic)- μλΉμ€μ νΈλν½μ΄ 30μ΄κ° μμ΅λλ€. (SSH μ μ λκΈ° λ±)
- 곡μ κΈ°κ° “30μ΄ μ§λ¬λ€? μμ!“μ΄λΌλ©° UDP μ°κ²°μ κ°μ μ’ λ£ν©λλ€.
cloudflaredλ λ€λ¦κ² μ°κ²°μ΄ λκΈ΄ κ²μ κ°μ§νκ³timeoutμ€λ₯λ₯Ό λΏμ΄λ λλ€.cloudflaredκ° μ¬μ°κ²°μ μλν©λλ€. (1λ²μΌλ‘ λμκ°)
π‘ “κ·ΈλΌ UDP νμμμμ 24μκ°μΌλ‘ λ리면 λμ§!” …λΌκ³ μκ°νμ ¨λ€λ©΄?
π¨ μ λ μ λ©λλ€! (ν¨μ μΉ΄λ)
μ λ μ²μμ “UDP νμμμμ 30μ΄μμ 86400μ΄λ‘ λ°κΏμΌκ² λ€!“λΌκ³ μκ°νμ΅λλ€. νμ§λ§ μ΄λ λ ν° μ¬μμ λΆλ¦ λλ€.
- TCPλ μ°κ²°μ μμ(SYN)νκ³ μ’ λ£(FIN)ν λ μλ‘ “μλ !”, “μ κ°!” νκ³ μ νΈλ₯Ό μ£Όκ³ λ°μ΅λλ€. 곡μ κΈ°λ μ΄ “μ κ°!” μ νΈλ₯Ό λ³΄κ³ μ°κ²°μ λ°λ‘ λͺ©λ‘μμ μ§μλλ€. 24μκ° νμμμμ νΉμλ μ νΈ μμ΄ μ£½μ ‘μ’λΉ μΈμ ’μ μΉμ°κΈ° μν μ΅νμ λ³΄λ£¨μΌ λΏμ λλ€.
- UDPλ κ·Έλ° μ νΈκ° μμ΅λλ€. κ·Έλ₯ λ°μ΄ν°λ₯Ό λμ§λλ€. 곡μ κΈ° μ μ₯μμλ μ΄ μ°κ²°μ΄ λλ 건μ§, μ μ μ¬λ κ±΄μ§ μ λ°©λ²μ΄ μμ΅λλ€. κ·Έλμ ‘νμμμ’μ΄ μ°κ²°μ μ²μνλ μ μΌν μλ¨μ λλ€. λ§μ½ UDP νμμμμ 24μκ°μΌλ‘ λ리면, μ κΉ μ¬μ©λ λͺ¨λ UDP μ°κ²°(DNS μ‘°ν, κ²μ μ νΈ λ±)μ΄ κ³΅μ κΈ° λ©λͺ¨λ¦¬μ 24μκ° λμ μμ΄κ² λ©λλ€. κ°μ μ© κ³΅μ κΈ°λ μ΄ λ©λͺ¨λ¦¬(μΈμ ν μ΄λΈ)κ° λ§€μ° μμμ, λͺ μκ° μμ ν μ΄λΈμ΄ κ½ μ°¨ μΈν°λ· μ μ²΄κ° λ¨Ήν΅μ΄ λλ λμ°Έμ¬κ° λ²μ΄μ§λλ€.
30μ΄λ λ€ μ΄μ κ° μμλ κ²μ λλ€.
β μ΅μ’ ν΄κ²°μ± : 곡μ κΈ°κ° μλ Cloudflaredλ₯Ό λ°κΎΈμ
μμΈμ μμμΌλ ν΄κ²°μ κ°λ¨ν©λλ€. 곡μ κΈ° μ€μ μ 건λ리λ κ²μ΄ μλλΌ, **cloudflared**κ° 30μ΄ λ£°μ νΌν΄κ°λλ‘ λ§λ€λ©΄ λ©λλ€.
“UDP(30μ΄) λ§κ³ , TCP(24μκ°)λ‘ μ°κ²°ν΄!”
cloudflaredλ μΉμ νκ²λ μ΄ μ΅μ
μ μ 곡ν©λλ€. docker-compose.yml νμΌμ νκ²½ λ³μ ν μ€λ§ μΆκ°νλ©΄ λ©λλ€.
μμ μ **docker-compose.yml** (μμ):
YAML
services: cloudflared: container_name: assemblywatch-tunnel image: cloudflare/cloudflared:latest restart: unless-stopped environment: - CLOUDFLARE_TUNNEL_TOKEN # ... (κΈ°ν μ€μ ) ...
μμ ν **docker-compose.yml** (μ΅μ’
ν΄κ²°μ±
):
YAML
services: cloudflared: container_name: assemblywatch-tunnel image: cloudflare/cloudflared:latest restart: unless-stopped environment: - CLOUDFLARE_TUNNEL_TOKEN # π [ν΄κ²°μ±
] μ΄ ν μ€μ μΆκ°ν©λλ€! - TUNNEL_TRANSPORT_PROTOCOL=http2 # ... (κΈ°ν μ€μ ) ... dns: # (μ ν μ¬ν) DNSλ Cloudflareλ‘ μ§μ ν΄μ£Όλ©΄ μ’μ΅λλ€. - "1.1.1.1" - "1.0.0.1"
TUNNEL_TRANSPORT_PROTOCOL: http2λcloudflaredμκ² “UDP(QUIC) λμ TCP κΈ°λ°μΈ HTTP/2 νλ‘ν μ½λ‘ ν°λμ λ«μ΄λΌ"κ³ λͺ λ Ήνλ νκ²½ λ³μμ λλ€. μ΄μ 컨ν μ΄λλ₯Ό λ€μ μμ±ν©λλ€.
Bash
docker-compose up -d --force-recreate cloudflared
π νμΈ μ¬μ΄: ννκ° μ°Ύμμ¨ λ‘κ·Έ
λ€μ λ‘κ·Έλ₯Ό νμΈν΄ λ΄€μ΅λλ€.
Bash
assemblywatch-tunnel | 2025-11-14T12:50:07Z INF Environmental variables map[... TUNNEL_TRANSPORT_PROTOCOL:http2] assemblywatch-tunnel | 2025-11-14T12:50:07Z INF Initial protocol http2 assemblywatch-tunnel | 2025-11-14T12:50:07Z INF Registered tunnel connection ... protocol=http2 assemblywatch-tunnel | 2025-11-14T12:50:07Z INF Registered tunnel connection ... protocol=http2
protocol=quicμ΄ protocol=http2λ‘ λ°λ κ²μ΄ 보μ΄μλμ?
μ΄μ μ ν°λμ 24μκ° νμμμμ΄ λ³΄μ₯λ TCP μμμ μμ μ μΌλ‘ μλν©λλ€. ν λ¬κ° μ λ₯Ό κ΄΄λ‘νλ λκΉ νμκ³Ό SSH λ¨Ήν΅ νμμ΄ μλ²½νκ² μ¬λΌμ‘μ΅λλ€!
λ§ΊμΌλ©°
λ―Έλμ λμ λ λ€λ₯Έ ν μλ² μ μ λΆλ€μκ²…
“λ¬Έμ κ° μκΈ°λ©΄ λ‘κ·Έλ₯Ό μμΈν λ³΄κ³ , κ·Έ λ‘κ·Έμ λμ¨ ν€μλ(νλ‘ν μ½)κ° λ΄ λ€νΈμν¬ νκ²½(곡μ κΈ°)μ λ£°κ³Ό μΆ©λνμ§ μλμ§ κΌ νμΈν΄ 보μΈμ!”
μ λ§ κ°λ¨ν νκ²½ λ³μ νλμμ§λ§, μ΄κ±Έ μ°ΎκΈ° μν΄ ν λ¬μ λμμλ€μ. μ΄ κΈμ΄ μ¬λ¬λΆμ μ½μ§μ λ¨ 5λΆ λ§μ λλ΄μ£ΌκΈΈ λ°λλλ€.
λͺ¨λ μ¦κ±°μ΄ ν μλ² μ΄μ λμΈμ! π₯³