- 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
Ý kiến Hacker News
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ộ
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
Bài viết liên quan ở blog này
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
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
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
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
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
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
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
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
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ò đó
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
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