2P by GN⁺ 6일전 | ★ favorite | 댓글 1개
  • Imgur의 영국 사용자 차단으로 인해 Reddit, 포럼, 문서 등 곳곳의 이미지 링크가 모두 “unavailable”로 표시되는 문제 발생
  • 개인 VPN 대신 네트워크 전체 수준의 자동 우회 구조를 구축해 모든 기기에서 Imgur 접근 가능하도록 구성
  • Pi-hole, Traefik, Gluetun, Nginx, NixOS를 조합해 DNS 차단을 우회하고 트래픽을 VPN을 통해 전달하는 구조 설계
  • TLS 패스스루와 Docker 네트워크 공유를 이용해 암호화된 트래픽을 그대로 전달하면서도 속도 저하 최소화
  • 결과적으로 모든 기기에서 별도 설정 없이 Imgur 이미지 접근 가능, 속도 손실 없이 투명한 네트워크 차단 해제 구조 구현

Imgur 차단과 불편 사례

  • Imgur가 영국 사용자 접근을 차단하면서, Reddit·포럼·문서 등 다양한 웹페이지의 이미지 링크가 표시되지 않는 문제 발생
    • Minecraft 셰이더 미리보기 이미지가 모두 사라져, 어떤 셰이더인지 확인할 수 없는 상황
    • 오래된 게시물이나 README 파일 등에서도 Imgur 링크가 여전히 남아 있어 접근 불가 현상 지속

VPN 대신 네트워크 단위 해결 선택

  • 일반적인 해결책은 VPN 사용이지만, 2.5Gbps 고속 인터넷 환경에서 전체 트래픽을 VPN으로 우회하면 속도 저하 발생
  • 각 기기마다 VPN을 설치하고 연결해야 하는 관리 복잡성 문제 존재
  • 모든 기기에서 자동으로 작동하는 클라이언트 설정 불필요한 네트워크 단위 솔루션을 목표로 함

네트워크 레벨 구조 설계

  • 기존 홈랩 환경에서 Traefik(리버스 프록시) , Pi-hole(DNS) , NixOS(선언적 설정) 사용 중
  • DNS 단계에서 i.imgur.com 요청을 가로채 VPN 연결 컨테이너(Gluetun) 를 통해 전달
    • Pi-hole이 Traefik IP를 반환
    • Traefik이 SNI 호스트명을 확인해 Gluetun으로 라우팅
    • Gluetun이 VPN을 통해 요청을 전달
    • Gluetun 내부의 Nginx가 실제 Imgur 서버로 프록시
    • 이미지를 터널을 통해 다시 반환

Nginx와 Gluetun 구성

  • Gluetun은 VPN 연결만 제공하므로, VPN 네트워크 내부에서 프록시 역할을 수행할 Nginx 필요
  • Nginx는 TCP 스트림 모드로 설정되어 SNI 헤더를 읽고 i.imgur.com:443으로 트래픽을 전달
    • TLS 핸드셰이크는 종단 간 수행되어 Nginx는 암호 해제된 데이터를 보지 않음
  • Docker Compose에서 두 개의 컨테이너(Gluetun, Nginx) 실행
    • network_mode: "service:gluetun" 설정으로 Nginx가 Gluetun의 네트워크 스택을 공유
    • 모든 Nginx 트래픽이 자동으로 VPN 터널을 통과

Traefik 및 NixOS 통합

  • Traefik은 TCP 라우팅과 TLS 패스스루를 사용해 i.imgur.com 요청을 Gluetun으로 전달
    • TLS를 종료하지 않고 SNI 헤더만 검사
  • NixOS에서는 systemd 서비스로 Docker Compose 스택을 실행
    • Agenix를 이용해 VPN 자격 증명을 암호화 저장
    • 전체 dotfiles 저장소를 공개로 유지하면서도 비밀 정보 보호

결과 및 성능

  • 네트워크 내 모든 기기(휴대폰, 노트북, 게스트 기기 포함)가 별도 설정 없이 Imgur 이미지 접근 가능
  • Pi-hole이 DNS를 가로채고, Traefik이 라우팅, Gluetun이 VPN 터널링 수행
  • 이미지 로딩 지연은 거의 없으며, Imgur 트래픽만 VPN을 거쳐 일반 트래픽 속도 유지
  • 유지보수가 간단하고, 홈랩 환경에서의 자동화된 지역 차단 해제 구조 완성
  • Minecraft 셰이더 등 Imgur 기반 콘텐츠를 다시 정상적으로 확인 가능
Hacker News 의견
  • 내 네트워크에서는 라우터 하나만 VPN을 인식하게 설정했음
    리눅스가 깔린 저가형 팬리스 박스에 여러 포트를 두고, systemd-networkd로 WireGuard 인터페이스를 한 번만 설정해둠
    덕분에 특정 트래픽만 VPN으로 라우팅하거나, VPN 전용 SSID/VLAN을 따로 둘 수도 있음
    다만 도메인 기반 라우팅은 까다로울 수 있어서, 필요하다면 로컬 DNS 오버라이드가 가능한 프록시를 라우터에 추가할 생각임
    • 별도 브라우저를 띄우지 않고 FoxyProxy 확장으로 URL 패턴별 프록시를 지정하면 간단히 해결 가능함
    • 나는 RPi에 x-ray/singbox 기반의 중앙 VPN 스플리터를 두고, 여기에 Tailscale을 붙여서 어디서든 접근 가능하게 했음
      규칙 기반의 지리적 분할 라우팅도 지원되어 유용함
    • 그 팬리스 리눅스 박스의 제품명이 궁금함
  • 제목 “Geo-Unblocked”를 보고 영국이 아닌 IP 블록을 직접 구성하는 내용일 줄 알았는데, 단순히 일부 트래픽만 VPN으로 돌리는 이야기였음
    • 직접 ISP 역할을 하면 원하는 곳 어디든 있을 수 있음
      참고로 관련 글은 이 블로그에 있음
    • 하지만 WAN 주소를 바꾸는 건 네트워크 내 IP 스키마를 바꾸는 것과 비슷해서 실제로는 작동하지 않을 것 같음
  • “가끔 Imgur 이미지를 보기 위해 이 정도까지 해야 하나?” 싶지만, 최근 자료를 조사하면서 Imgur 의존도가 꽤 높다는 걸 깨달았음
    스크린샷이 안 보여서 불편했는데, 이 글이 마지막 동기가 될 듯함
    • 지금은 과하다고 느껴질 수 있지만, 정부가 점점 더 많은 콘텐츠 접근을 제한하려는 움직임이 있어서 미리 대비하는 게 현명하다고 봄
    • Imgur가 생각보다 많은 곳에 쓰이고 있음. 예를 들어 Core Devices(Pebble 후속팀) 웹사이트의 이미지도 Imgur에 있음
      이런 차단은 쉽게 우회 가능하지만, 만약 Imgur가 사라지면 많은 사이트가 깨질 것임
    • 검열이 Imgur에서 멈추지 않을 것임
      사람들이 검열을 우회해도 트래픽 손실이 크지 않다면, 해외 서버들은 권위주의적 규제에 굴하지 않아도 된다는 점이 중요함
      EU도 비슷한 방향으로 가는 듯하니, 검열을 거부할 수 있는 도구가 널리 퍼져야 함
    • 나도 우회가 생각보다 어려웠는데, Veepn 무료 버전을 싱가포르로 설정하니 느리지만 어느 정도 작동했음
  • 이런 방식은 Netflix나 Spotify의 ‘같은 가정’ 제한을 우회하는 데도 쓸 수 있을 듯함
    라즈베리파이나 미니 PC에 PiHole과 함께 설정해두면, 가족 집의 트래픽을 내 IP로 터널링할 수 있음
  • UniFi에서도 정책 기반 라우팅(PBR) 으로 손쉽게 구현 가능함
    모바일 앱에서 WireGuard 설정 파일을 추가하고, 정책 엔진에서 특정 도메인만 VPN 인터페이스로 라우팅하도록 지정하면 됨
    • 단점은 IPv6가 활성화되어 있으면 VPN을 우회해버린다는 점임
      나는 IPv6 범위를 차단하는 방화벽 규칙을 길게 만들어 임시로 해결했지만, Cloudflare 기반 사이트에서 막혔음
      UniFi가 IPv6 WireGuard를 지원하길 바람
  • Imgur의 영국 지역 차단은 쿠키로 지속되기 때문에, 잠깐 VPN을 켜는 것만으로는 해결되지 않음
    Reddit은 더 심해서, NSFW 게시물을 올린 적 있는 사용자의 프로필조차 볼 수 없음
  • 특정 도메인만 VPN으로 보내고 나머지는 일반 트래픽으로 유지하는 방법이 있을까 궁금했음
    이렇게 하면 매번 VPN을 켜고 끄는 번거로움 없이 자동으로 처리할 수 있음
    예를 들어 연령 인증이 필요한 SNS, 국가별로 차단되는 앱(Spotify 등) , 뉴스 사이트 검열 같은 상황에서 유용할 것임
    • 그건 도메인 기반 스플릿 터널링이라 부름
      일반적으로 HTTP/S 요청에만 적용되지만, ZScaler 같은 벤더는 다른 프로토콜에도 확장함
      Tailscale에서는 App Connector 기능이 그 역할을 함
    • 사실상 그 글에서 이미 그런 구성을 구현한 셈임
  • 나도 비슷하게 OpenWRT 라우터의 PBR 기능으로 설정했음
    15분 정도면 특정 도메인만 VPN으로 보내도록 구성 가능하고, 아주 잘 작동함
  • 나는 이런 문제를 프록시 PAC 파일로 해결하는 편임
    비행기 Wi-Fi처럼 VPN이 막힌 환경에서도 SSH는 허용되기에, 동적 포워딩과 PAC 파일을 조합해 기내 엔터테인먼트나 추적 사이트는 직접 연결하도록 설정했음
    꽤 잘 작동함