C.W.K.
Stream
Lesson 04 of 05 · published

Gotcha — IPv6, UPnP, 'localhost 만' 거짓말

~15 min · ipv6, upnp, reverse-proxy

Level 0Greenhorn
0 XP0/53 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

안전해 보였던 binding 을 노출된 걸로 바꾸는 세 foot-gun. 각각 silent: 일어나도 알림 없어.

Gotcha 1 — IPv6 쌍둥이

127.0.0.1 (IPv4 loopback) 으로 bind 했어. 안전, 맞지? 아마 — 근데 IPv6 stack 은 자기 loopback (::1) 과 자기 "모든 interface" (::) 가 있어. 일부 서버는 양쪽 stack 다 listen 이 기본. IPv6 binding 이 :: 인데 IPv4 는 127.0.0.1 이면 알아채지 못한 public IPv6 leak 있는 거.

Gotcha 2 — 라우터의 UPnP

Universal Plug and Play 가 LAN 디바이스가 라우터한테 inbound 포트 자동 forward 부탁할 수 있게 해. 대부분 컨슈머 라우터 기본 켜짐. 잘못 동작하는 앱, 토렌트 클라이언트, 게임이 조용히 public 포트 열 수 있어.

Gotcha 3 — "192.168.x.x bind" 거짓말

서비스한테 "192.168.1.42 만 bind 해" 가 0.0.0.0 보다 안전하게 느껴져. 그렇긴 한데 — 약간만:

  • 나중에 public Wi-Fi 에 같은 DHCP IP 받으면 서비스가 여전히 응답 — 그 Wi-Fi 의 다른 사람한테.
  • LAN 에 untrusted 디바이스 (손님, IoT, 룸메이트) 있으면 서비스 도달 가능.
  • IP 바뀌면 (DHCP 갱신) 서비스가 listen 멈추고 "broken" 앱 디버깅 시작.

Gotcha 4 — 네 대신 0.0.0.0 으로 bind 하는 reverse proxy

앱이 127.0.0.1 로 bind 하게 설정. 그다음 nginx / Caddy 를 앞에 둠. nginx 가 뭐 bind 하는지 확인했어? 기본 0.0.0.0:80, 0.0.0.0:443 — 앱의 제한된 binding 이 앞의 proxy 로 우회. Reverse proxy 도 명시적 binding 필요.

Code

IPv4 와 IPv6 listening 소켓 둘 다 체크·bash
sudo lsof -iTCP -sTCP:LISTEN -P -n | grep -E "PORT|:8888"
# *:8888 와 [::]:8888 둘 다 찾아 — 그게 위험 신호

External links

Exercise

오늘 두 체크: (1) 라우터 admin 로그인해서 UPnP 꺼졌는지 확인; 안 됐으면 꺼. (2) 127.0.0.1-only 라고 생각한 서비스마다 sudo lsof -iTCP -sTCP:LISTEN -P -n | grep PORT 돌려서 *:PORT 와 [::]:PORT 둘 다 안 나타나는지 확인. 나타나면 IPv6 bind 명시적으로 설정.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.