2 điểm bởi GN⁺ 2025-11-29 | 1 bình luận | Chia sẻ qua WhatsApp
  • Do Imgur chặn người dùng tại Anh, các liên kết ảnh trên Reddit, diễn đàn, tài liệu và nhiều nơi khác đều hiện là “unavailable”
  • Thay vì dùng VPN riêng lẻ, đã xây dựng cấu trúc tự động vượt chặn ở cấp toàn mạng để mọi thiết bị đều có thể truy cập Imgur
  • Thiết kế kiến trúc kết hợp Pi-hole, Traefik, Gluetun, Nginx, NixOS để vượt chặn ở tầng DNS và chuyển tiếp lưu lượng qua VPN
  • Dùng TLS passthrough và chia sẻ mạng Docker để chuyển tiếp nguyên trạng lưu lượng đã mã hóa mà vẫn giảm thiểu suy hao tốc độ
  • Kết quả là mọi thiết bị đều có thể truy cập ảnh Imgur mà không cần cấu hình riêng, triển khai được cấu trúc gỡ chặn mạng trong suốt không làm giảm tốc độ

Imgur bị chặn và những bất tiện phát sinh

  • Khi Imgur chặn truy cập từ người dùng tại Anh, đã xuất hiện vấn đề không hiển thị liên kết ảnh trên nhiều trang web như Reddit, diễn đàn, tài liệu
    • Toàn bộ ảnh xem trước shader Minecraft đều biến mất, khiến không thể biết đó là shader nào
    • Trong các bài viết cũ hay tệp README, các liên kết Imgur vẫn còn nên tình trạng không thể truy cập vẫn tiếp diễn

Chọn giải pháp ở cấp mạng thay vì VPN

  • Cách giải quyết phổ biến là dùng VPN, nhưng trong môi trường Internet tốc độ cao 2.5Gbps, nếu chuyển toàn bộ lưu lượng qua VPN sẽ bị giảm tốc độ
  • Ngoài ra còn có vấn đề phức tạp trong quản lý khi phải cài và kết nối VPN trên từng thiết bị
  • Mục tiêu là một giải pháp ở cấp mạng không cần cấu hình phía client, tự động hoạt động trên mọi thiết bị

Thiết kế kiến trúc ở cấp mạng

  • Trong homelab sẵn có đã dùng Traefik (reverse proxy), Pi-hole (DNS), NixOS (cấu hình khai báo)
  • Ở bước DNS, chặn bắt các yêu cầu tới i.imgur.com rồi chuyển chúng qua container kết nối VPN (Gluetun)
    • Pi-hole trả về IP của Traefik
    • Traefik kiểm tra hostname trong SNI rồi định tuyến tới Gluetun
    • Gluetun chuyển tiếp yêu cầu qua VPN
    • Nginx bên trong Gluetun proxy tới máy chủ Imgur thực tế
    • Ảnh sau đó được trả ngược qua tunnel

Cấu hình Nginx và Gluetun

  • Vì Gluetun chỉ cung cấp kết nối VPN, nên cần Nginx đóng vai trò proxy bên trong mạng VPN
  • Nginx được cấu hình ở chế độ TCP stream để đọc header SNI và chuyển lưu lượng tới i.imgur.com:443
    • Bắt tay TLS được thực hiện end-to-end nên Nginx không nhìn thấy dữ liệu đã giải mã
  • Trong Docker Compose, chạy hai container (Gluetun, Nginx)
    • Với thiết lập network_mode: "service:gluetun", Nginx chia sẻ network stack của Gluetun
    • Mọi lưu lượng từ Nginx vì thế tự động đi qua tunnel VPN

Tích hợp với Traefik và NixOS

  • Traefik dùng TCP routing và TLS passthrough để chuyển các yêu cầu tới i.imgur.com sang Gluetun
    • Không kết thúc TLS mà chỉ kiểm tra header SNI
  • Trên NixOS, stack Docker Compose được chạy dưới dạng dịch vụ systemd
    • Dùng Agenix để lưu mã hóa thông tin xác thực VPN
    • Vẫn có thể giữ toàn bộ kho dotfiles ở chế độ công khai mà vẫn bảo vệ được thông tin bí mật

Kết quả và hiệu năng

  • Mọi thiết bị trong mạng (bao gồm điện thoại, laptop, thiết bị khách) đều có thể truy cập ảnh Imgur mà không cần cấu hình riêng
  • Pi-hole chặn bắt DNS, Traefik định tuyến, Gluetun thực hiện VPN tunneling
  • Độ trễ khi tải ảnh hầu như không đáng kể, và chỉ lưu lượng Imgur mới đi qua VPN nên tốc độ lưu lượng thông thường vẫn được giữ nguyên
  • Việc bảo trì đơn giản, hoàn thiện được cấu trúc gỡ chặn theo vùng tự động trong môi trường homelab
  • Có thể xem lại bình thường các nội dung dựa trên Imgur như shader Minecraft

1 bình luận

 
GN⁺ 2025-11-29
Ý kiến Hacker News
  • Trong mạng của tôi, tôi cấu hình để chỉ router nhận biết VPN
    Tôi dùng một hộp fanless giá rẻ chạy Linux với nhiều cổng, rồi chỉ cần thiết lập một lần giao diện WireGuard bằng systemd-networkd
    Nhờ vậy có thể định tuyến chỉ một số lưu lượng qua VPN, hoặc tách riêng SSID/VLAN chỉ dành cho VPN
    Tuy nhiên định tuyến theo tên miền có thể khá rắc rối, nên nếu cần tôi định thêm vào router một proxy có thể override DNS cục bộ
    • Có thể giải quyết đơn giản bằng cách dùng tiện ích mở rộng FoxyProxy để chỉ định proxy theo mẫu URL mà không cần mở trình duyệt riêng
    • Tôi đặt một bộ tách VPN trung tâm dựa trên x-ray/singbox trên RPi, rồi gắn thêm Tailscale để có thể truy cập từ bất cứ đâu
      Nó cũng hỗ trợ định tuyến chia tách theo địa lý dựa trên quy tắc nên rất hữu ích
    • Tôi tò mò tên sản phẩm của cái hộp Linux fanless đó là gì
  • Khi thấy tiêu đề “Geo-Unblocked”, tôi tưởng bài viết sẽ nói về việc tự cấu hình các dải IP không phải của Anh, nhưng thực ra chỉ là chuyển một phần lưu lượng qua VPN
    • Nếu tự làm ISP thì về lý thuyết bạn có thể hiện diện ở bất cứ đâu mình muốn
      Bài viết liên quan ở blog này
    • Nhưng thay đổi địa chỉ WAN cũng giống như thay đổi sơ đồ IP trong mạng, nên trên thực tế có lẽ sẽ không hoạt động
  • Có lúc tôi nghĩ “chỉ để xem ảnh Imgur mà phải làm đến mức này sao?”, nhưng khi tìm hiểu tài liệu gần đây tôi nhận ra mức độ phụ thuộc vào Imgur khá cao
    Tôi đã thấy phiền vì không xem được screenshot, và bài này có lẽ sẽ là động lực cuối cùng
    • Có thể bây giờ trông hơi quá đà, nhưng chính phủ đang ngày càng muốn hạn chế quyền truy cập vào nhiều loại nội dung hơn, nên tôi nghĩ chuẩn bị trước là điều khôn ngoan
    • Imgur được dùng ở nhiều nơi hơn bạn tưởng. Ví dụ ảnh trên website của Core Devices (đội ngũ kế nhiệm Pebble) cũng nằm trên Imgur
      Việc chặn kiểu này có thể dễ dàng vượt qua, nhưng nếu Imgur biến mất thì rất nhiều website sẽ bị hỏng
    • Kiểm duyệt sẽ không dừng lại ở Imgur
      Ngay cả khi mọi người lách được kiểm duyệt mà lượng traffic mất đi không đáng kể, thì điều quan trọng là các máy chủ ở nước ngoài không cần phải khuất phục trước các quy định độc đoán
      Có vẻ EU cũng đang đi theo hướng tương tự, nên các công cụ có thể từ chối kiểm duyệt cần được phổ biến rộng rãi
    • Tôi cũng thấy việc vượt chặn khó hơn tưởng tượng, nhưng đặt Veepn bản miễn phí sang Singapore thì chậm nhưng vẫn hoạt động phần nào
  • Cách này có vẻ cũng dùng để vượt qua các hạn chế “cùng một hộ gia đình” của Netflix hay Spotify
    Nếu cấu hình cùng PiHole trên Raspberry Pi hoặc mini PC, bạn có thể tunnel lưu lượng của nhà người thân qua IP của mình
  • Trên UniFi cũng có thể triển khai dễ dàng bằng policy-based routing (PBR)
    Chỉ cần thêm file cấu hình WireGuard trong ứng dụng di động, rồi trong policy engine chỉ định để chỉ các tên miền cụ thể được định tuyến qua giao diện VPN
    • Điểm yếu là nếu IPv6 được bật thì nó sẽ đi vòng qua VPN
      Tôi đã tạm xử lý bằng cách tạo một loạt quy tắc tường lửa dài để chặn dải IPv6, nhưng các website dùng Cloudflare lại bị lỗi
      Mong UniFi sớm hỗ trợ WireGuard qua IPv6
  • Việc chặn Imgur tại Anh được duy trì bằng cookie, nên chỉ bật VPN trong chốc lát là không đủ
    Reddit còn tệ hơn, đến cả hồ sơ của người dùng từng đăng bài NSFW cũng không xem được
  • Tôi từng thắc mắc liệu có cách nào gửi chỉ một số tên miền qua VPN, còn lại vẫn dùng lưu lượng bình thường hay không
    Như vậy mọi thứ có thể được xử lý tự động mà không phải bật tắt VPN mỗi lần
    Ví dụ sẽ rất hữu ích trong các tình huống như mạng xã hội cần xác minh độ tuổi, ứng dụng bị chặn theo quốc gia (như Spotify), hoặc kiểm duyệt các trang tin tức
    • Đó được gọi là split tunneling theo tên miền
      Thông thường nó chỉ áp dụng cho các yêu cầu HTTP/S, nhưng các hãng như ZScaler mở rộng sang cả những giao thức khác
      Trong Tailscale, tính năng App Connector đảm nhiệm vai trò đó
    • Thực tế thì bài viết đó đã triển khai đúng kiểu cấu hình như vậy rồi
  • Tôi cũng thiết lập tương tự bằng tính năng PBR của router OpenWRT
    Chỉ mất khoảng 15 phút để cấu hình cho chỉ các tên miền cụ thể đi qua VPN, và nó hoạt động rất tốt
  • Tôi thường giải quyết kiểu vấn đề này bằng file PAC của proxy
    Trong môi trường như Wi‑Fi trên máy bay nơi VPN bị chặn nhưng SSH vẫn được cho phép, tôi kết hợp dynamic forwarding với file PAC để cấu hình cho hệ thống giải trí trên máy bay hoặc các trang theo dõi đi trực tiếp
    Nó hoạt động khá tốt