본문 바로가기
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 을 노출된 것으로 바꿔놓는, 제 발등 찍는 함정 셋. 셋 다 조용해. 벌어져도 알려주는 게 없어.

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 안의 디바이스가 라우터한테 "이 포트 좀 열어줘" 하고 자동으로 부탁할 수 있어. 대부분 컨슈머 라우터 기본 켜짐. 잘못 동작하는 앱, 토렌트 클라이언트, 게임이 조용히 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 을 멈추고, 넌 "앱이 고장났다" 며 디버깅을 시작하지.

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 이야. 앱을 좁게 묶어놨는데 앞에 선 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

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

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