Post

๐Ÿ› ๏ธ Pi-Server๋งŒ๋“ค๊ธฐ ssh์—ฐ๊ฒฐํŽธ: cloudflared๊ธฐ๋ฐ˜ SSH์—ด๊ธฐ

๐Ÿ› ๏ธ Pi-Server๋งŒ๋“ค๊ธฐ ssh์—ฐ๊ฒฐํŽธ: cloudflared๊ธฐ๋ฐ˜ SSH์—ด๊ธฐ

๐Ÿง  title: Cloudflare Tunnel + Access๋กœ SSH ์—ด๊ธฐ (์‹คํŒจ ๋กœ๊ทธ ํฌํ•จ ์‹ค์ „ ํŠœํ† ๋ฆฌ์–ผ)

1๏ธโƒฃ ๋‚ด๊ฐ€ ์ด ์ž‘์—…์„ ์‹œ์ž‘ํ•œ ์ด์œ 

์ง‘์— ์žˆ๋Š” ์„œ๋ฒ„(๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด)์— ttyd๋กœ ์ ‘์† ํ•˜๋Š” ๋ฐฉ์‹์— ํ•œ๊ณ„๋ฅผ ๋А๊ผˆ๋‹คโ€ฆ ๊ตฐ ๋ถ€๋Œ€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ssh์€ ํž˜๋“ค๊บผ ๊ฐ™์œผ๋‹ˆ(์ฐธ๊ณ ๋กœ ์‹ธ์ง€๋ฐฉ ์ปด์€ cmd๋„ ์•ˆ์—ด๋ฆฐ๋‹คโ€ฆ) ttyd๋ฅผ ์‚ฌ์šฉ ํ–ˆ๋˜ ๊ฑด๋ฐ ์•„๋ฌดํŠผ ๋ฒ„๋ฒ…์ธ๋‹ค(์—„์ฒญ;;) ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ํœด๋Œ€ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ ค ํ•œ๋‹ค. Termux์—์„œ ์ž‘์—… ํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋œ ๋ฐ›์„๊บผ ๊ฐ™์•„ ๋ฏธ๋ค„์™”๋˜ ssh์—ฐ๊ฒฐ ์ถ”๊ฐ€๋ฅผ ์ด๋ฒˆ ํœด๊ฐ€์— ํ•˜๋ คํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋˜ ์—ฌ์ „ํžˆ ํฌํŠธํฌ์›Œ๋”ฉ์œผ๋กœ 22๋ฒˆ ํฌํŠธ๋ฅผ ์—ด์–ด๋‘๋Š” ๋ฐฉ์‹์ด๋‚˜ ๊ณต์ธ IP๋ฅผ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ตฌ์กฐ๋Š” ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š์•˜๋‹ค. ๊ฑฐ๊ธฐ์— ์ด๋ฏธ ์ด์ „ ์ž‘์—…์—์„œ ํ–ˆ๋˜ cloudflared ํ„ฐ๋„๋„ ์ด๋ฏธ ์žˆ๊ฒ ๋‹ค. ๊ทธ๋ƒฅ ๊ธฐ์กด์— ์žˆ๋Š” cludflared tunnel์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ํ•˜๊ธฐ๋Ÿฌ ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ Cloudflare Tunnel๊ณผ Access๋ฅผ ์‚ฌ์šฉํ•ด์„œ,

  • ์„œ๋ฒ„๋Š” ๋‚ด๋ถ€๋ง ๊ทธ๋Œ€๋กœ ๋‘๊ณ 
  • ์™ธ๋ถ€์—์„œ๋Š” ์ธ์ฆ๋œ ๋‚˜๋งŒ ์ ‘์† ๊ฐ€๋Šฅํ•˜๊ฒŒ
  • PC, ๋…ธํŠธ๋ถ, Termux ํ™˜๊ฒฝ ์–ด๋””์„œ๋“ 

์•„๋ž˜ ํ•œ ์ค„๋กœ ์ ‘์†๋˜๋Š” ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.

1
ssh m0s

2๏ธโƒฃ ์ž‘์—…ํ•œ๊ฑฐ ์ •๋ฆฌํ•œ ํŠœํ† ๋ฆฌ์–ผ

โœ… 1. ์„œ๋ฒ„์—์„œ SSH ์„œ๋น„์Šค๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋จผ์ € ๋งŒ๋“ ๋‹ค

Cloudflare Tunnel์ด๋‚˜ Access๋Š” ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ โ€œ๋Œ€์ฒดโ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋””๊นŒ์ง€๋‚˜ ์ด๋ฏธ ์ •์ƒ ๋™์ž‘ ์ค‘์ธ ์„œ๋น„์Šค ์œ„์— ์–น๋Š” ํ”„๋ก์‹œ ๋ ˆ์ด์–ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€, ์„œ๋ฒ„ ์ž์ฒด์—์„œ SSH๊ฐ€ ์™„์ „ํžˆ ์ •์ƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

1
2
3
sudo systemctl enable ssh
sudo systemctl start ssh
systemctl status ssh

์ด ์ƒํƒœ์—์„œ ๊ฐ™์€ ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ SSH ์ ‘์† ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

1
ssh m0squito@localhost

์ด ๋‹จ๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋Š”, ์ดํ›„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ โ€œSSH ์ž์ฒด ๋ฌธ์ œโ€์™€ โ€œTunnel/Access ๋ฌธ์ œโ€๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ด๋ฏธ ์‹คํŒจํ•˜๋ฉด ์ดํ›„ ์„ค์ •์€ ์ „๋ถ€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.


โš™๏ธ 2. systemd์—์„œ cloudflared๊ฐ€ config.yml์„ ์ฝ๋„๋ก ์„ค์ •ํ•œ๋‹ค

๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ด๋˜ cloudflared Tunnel์€ ์›น ์„œ๋น„์Šค์šฉ์œผ๋กœ๋งŒ ๊ตฌ์„ฑ๋ผ ์žˆ์—ˆ๊ณ , SSH ingress๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด config ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์‹คํ–‰์ด ํ•„์ˆ˜์˜€๋‹ค.

cloudflared๋Š” ์‹คํ–‰ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋™์ž‘์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—, systemd ์„œ๋น„์Šค์—์„œ ๋ช…์‹œ์ ์œผ๋กœ --config ์˜ต์…˜์„ ์ง€์ •ํ–ˆ๋‹ค.

1
sudo nano /etc/systemd/system/cloudflared.service
1
2
3
4
[Service]
ExecStart=/usr/local/bin/cloudflared --config /home/m0squito/.cloudflared/config.yml tunnel run
User=m0squito
Restart=always

์ด ์„ค์ •์˜ ํ•ต์‹ฌ์€ ๋‘ ๊ฐ€์ง€๋‹ค.

  • --url ๊ธฐ๋ฐ˜ ์‹คํ–‰์„ ์™„์ „ํžˆ ๋ฐฐ์ œ
  • ingress / Access / SSH ์„ค์ •์„ ์ „๋ถ€ config.yml ๊ธฐ์ค€์œผ๋กœ ํ†ตํ•ฉ

์ˆ˜์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐ๋ชฌ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

1
2
3
sudo systemctl daemon-reload
sudo systemctl restart cloudflared
systemctl status cloudflared

์ด ์‹œ์ ๋ถ€ํ„ฐ cloudflared๋Š” ์„ค์ • ํŒŒ์ผ์„ โ€œ์ง„์งœ๋กœโ€ ์ฝ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.


๐Ÿ“„ 3. cloudflared ์„ค์ • ํŒŒ์ผ์— SSH ingress๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค

๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ด๋˜ ~/.cloudflared/config.yml์— SSH ์ ‘์†์„ ์œ„ํ•œ ingress ๊ทœ์น™์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
tunnel: m0s-tunnel
credentials-file: /home/m0squito/.cloudflared/XXXX.json

ingress:
  - hostname: tunnel.m0squito.dev
    service: http://localhost:3000

  - hostname: ssh.m0squito.dev
    service: ssh://localhost:22

  - service: http_status:404

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š”:

  • SSH๋Š” http๊ฐ€ ์•„๋‹ˆ๋ผ ssh:// ์Šคํ‚ด์„ ์‚ฌ์šฉ
  • ํฌํŠธ ํฌ์›Œ๋”ฉ ์—†์ด ๋กœ์ปฌ 22๋ฒˆ ํฌํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
  • ingress๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ๋งค์นญ๋˜๋ฏ€๋กœ ์ˆœ์„œ ์œ ์ง€

์ด ์„ค์ •์œผ๋กœ ssh.m0squito.dev โ†’ cloudflared โ†’ ๋กœ์ปฌ SSH ๋ฐ๋ชฌ ์ด๋ผ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์™„์„ฑ๋œ๋‹ค.


๐ŸŒ 4. Tunnel๊ณผ SSH ๋„๋ฉ”์ธ์„ DNS๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค

Cloudflare DNS ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ง์ ‘ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ , cloudflared ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ํ„ฐ๋„ ๋ผ์šฐํŒ…์„ ๋ช…์‹œ์ ์œผ๋กœ ๋“ฑ๋กํ–ˆ๋‹ค.

1
cloudflared tunnel route dns m0s-tunnel ssh.m0squito.dev

์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด:

  • ssh.m0squito.dev์— ๋Œ€ํ•œ CNAME ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ž๋™ ์ƒ์„ฑ
  • ํ•ด๋‹น ๋„๋ฉ”์ธ์€ ์˜ค์ง ํ•ด๋‹น Tunnel๋กœ๋งŒ ์—ฐ๊ฒฐ

์ฆ‰, ๊ณต์ธ IP๋‚˜ ํฌํŠธ๋Š” ๋๊นŒ์ง€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.


๐Ÿ” 5. Cloudflare Access์—์„œ SSH ์ „์šฉ Application์„ ๋งŒ๋“ ๋‹ค

Zero Trust ๋Œ€์‹œ๋ณด๋“œ์—์„œ SSH ์ „์šฉ Access Application์„ ์ƒ์„ฑํ–ˆ๋‹ค.

์„ค์ • ์š”์•ฝ:

  • ์œ ํ˜•: ์ž์ฒด ํ˜ธ์ŠคํŒ…
  • Application type: SSH
  • ๊ณต๊ฐœ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„: ssh.m0squito.dev
  • ์ •์ฑ…: Allow + ๋ณธ์ธ ์ด๋ฉ”์ผ

Application type์„ SSH๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, Access๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ HTTP๋กœ ์˜ค์ธํ•ด 302 ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋‚˜ ์ธ์ฆ ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์„ค์ •์œผ๋กœ Access๋Š” โ€œ์ด ํŠธ๋ž˜ํ”ฝ์€ ์›น์ด ์•„๋‹ˆ๋ผ SSH๋‹คโ€ ๋ผ๊ณ  ์ •ํ™•ํžˆ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค.


๐Ÿงฉ 6. ํด๋ผ์ด์–ธํŠธ SSH config์— ProxyCommand๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค

๋งค๋ฒˆ cloudflared ๋ช…๋ น์„ ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๋Œ€์‹ , ํด๋ผ์ด์–ธํŠธ ์ชฝ SSH ์„ค์ • ํŒŒ์ผ์— ProxyCommand๋ฅผ ๋“ฑ๋กํ–ˆ๋‹ค.

1
nano ~/.ssh/config
Host m0s
  HostName ssh.m0squito.dev
  User m0squito
  ProxyCommand cloudflared access ssh --hostname %h

์ด ์„ค์ •์˜ ํšจ๊ณผ๋Š”:

  • SSH ์ ‘์† ์‹œ cloudflared๊ฐ€ ์ž๋™์œผ๋กœ Access ์ธ์ฆ ์ฒ˜๋ฆฌ
  • ํ† ํฐ/๋ธŒ๋ผ์šฐ์ € ์ธ์ฆ์€ Access๊ฐ€ ๋‹ด๋‹น
  • SSH ํ‚ค๋Š” ๊ธฐ์กด ๋ฐฉ์‹ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ดํ›„์—๋Š” ์•„๋ž˜ ๋ช…๋ น ํ•˜๋‚˜๋กœ ์ ‘์†์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

1
ssh m0s

๐Ÿงฑ 3) ์ž‘์—… ํ•˜๋ฉด์„œ ์ƒ๊ฐ”๋˜ ๋ฌธ์ œ๋“ค

โŒ cloudflared๊ฐ€ config.yml์„ ์ฝ์ง€ ์•Š์Œ

  • ๋ฌธ์ œ ๋ฐœ์ƒ: ingress๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ SSH๊ฐ€ ์ „ํ˜€ ์—ด๋ฆฌ์ง€ ์•Š์•˜๋‹ค.
  • ๋ถ„์„: systemd ์„œ๋น„์Šค๊ฐ€ CLI ๋ชจ๋“œ๋กœ ์‹คํ–‰ ์ค‘์ด๋ผ ์„ค์ • ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ExecStart์— --config ์˜ต์…˜์„ ๋ช…์‹œํ•ด config.yml์„ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

โ›” DNS์—์„œ A ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•จ

  • ๋ฌธ์ œ ๋ฐœ์ƒ: Cloudflare DNS์—์„œ A ๋ ˆ์ฝ”๋“œ์— IP๋ฅผ ๋„ฃ์œผ๋ ค ํ–ˆ๋‹ค.
  • ๋ถ„์„: Tunnel ๊ตฌ์กฐ์—์„œ๋Š” IP ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ์ด ์•„๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: cloudflared tunnel route dns๋กœ CNAME์„ ์ƒ์„ฑํ–ˆ๋‹ค.

โ›” ์ผ๋ฐ˜ SSH๋กœ ๋ฐ”๋กœ ์ ‘์† ์‹œ๋„

  • ๋ฌธ์ œ ๋ฐœ์ƒ: ssh user@ssh.domain์œผ๋กœ ์ ‘์† ์‹œ ๋ฌดํ•œ ๋กœ๋”ฉ ๋˜๋Š” UNKNOWN port ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ๋ถ„์„: Access ์ธ์ฆ์„ ํ†ต๊ณผํ•˜์ง€ ์•Š์€ ํŠธ๋ž˜ํ”ฝ์ด์—ˆ๋‹ค.
  • ํ•ด๊ฒฐ: Access๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์€ SSH๋Š” ์ •์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ์ž„์„ ํ™•์ธํ–ˆ๋‹ค.

โ›” Access ์•ฑ์„ SSH ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์Œ

  • ๋ฌธ์ œ ๋ฐœ์ƒ: Access Application์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์ ‘์†์ด ๋˜์ง€ ์•Š์•˜๋‹ค.
  • ๋ถ„์„: Application type์ด SSH๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค.
  • ํ•ด๊ฒฐ: SSH ํƒ€์ž…์œผ๋กœ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ณ  ๊ณต๊ฐœ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ •ํ™•ํžˆ ์ง€์ •ํ–ˆ๋‹ค.

โ›” cloudflared access ssh๋งŒ ์‹คํ–‰ํ•˜๊ณ  ๋๋ƒ„

  • ๋ฌธ์ œ ๋ฐœ์ƒ: ์ด๋ฉ”์ผ ์ธ์ฆ์€ ๋˜๋Š”๋ฐ ์…ธ์ด ์—ด๋ฆฌ์ง€ ์•Š์•˜๋‹ค.
  • ๋ถ„์„: ํ•ด๋‹น ๋ช…๋ น์€ ์ธ์ฆ ์„ธ์…˜๋งŒ ์ƒ์„ฑํ•œ๋‹ค.
  • ํ•ด๊ฒฐ: SSH config์—์„œ ProxyCommand๋กœ ์—ฐ๊ฒฐํ–ˆ๋‹ค.

๐Ÿ“ 4) ์ž‘์—… ํ›„๊ธฐ ๋ฐ ๋‹ค์Œ ์ž‘์—… ์˜ˆ์ •

์ด๋ฒˆ ์ž‘์—…์€ ์›๋ž˜ ์ „์—ญ ํ•œ ์ดํ›„์— ๋‚ด ๊ธฐ๊ธฐ๋“ค ์‚ฌ์ด์˜ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ํ•˜๋ ค ํ–ˆ๋˜๊ฑด๋ฐโ€ฆ ๋ญ ์ง€๊ธˆ ํ•ด ๋ฒ„๋ ธ์œผ๋‹ˆ ๊ทธ๋ƒฅ ์ง€๊ธˆ๋ถ€ํ„ฐ ์ž๋™ํ™” ํ•ด ๋ณด๋ ค ํ•œ๋‹ค. ์ตœ๊ทผ์— ๋˜ Tasker๋ผ๋Š” ์•ฑ๋„ ์ฐพ์•„์„œ Termux๋ž‘ ์—ฐ๊ณ„ํ•ด ๋‹ค์–‘ํ•œ ๊ฑธ ์‹คํ—˜ํ•ด ๋ณผ ์ƒ๊ฐ์ด๋‹ค.

This post is licensed under CC BY 4.0 by the author.