- เมื่อ Imgur บล็อกผู้ใช้ในสหราชอาณาจักร ทำให้ลิงก์รูปภาพใน Reddit, ฟอรัม และเอกสารต่างๆ แสดงเป็น "unavailable" ทั้งหมด
- แทนการใช้ VPN ส่วนบุคคล ผู้เขียนได้สร้างโครงสร้างการเลี่ยงบล็อกอัตโนมัติระดับเครือข่ายเพื่อให้ทุกอุปกรณ์สามารถเข้าถึง Imgur ได้
- ออกแบบสถาปัตยกรรมโดยใช้ Pi-hole, Traefik, Gluetun, Nginx, NixOS เพื่อข้ามการบล็อก DNS และส่งทราฟฟิกผ่าน VPN
- ใช้ TLS pass-through และการแชร์เครือข่าย Docker เพื่อส่งทราฟฟิกที่เข้ารหัสโดยตรงขณะยังคงลดการช้าความเร็วให้ต่ำสุด
- ผลลัพธ์คือทุกอุปกรณ์เข้าถึงภาพบน Imgur ได้โดยไม่ต้องตั้งค่าเพิ่มเติม และได้โครงสร้างปลดบล็อกเครือข่ายที่โปร่งใสโดยไม่สูญเสียความเร็ว
ปัญหาจากการบล็อก Imgur และผลกระทบที่เกิดขึ้น
- เมื่อ Imgur บล็อกการเข้าถึงสำหรับผู้ใช้ในสหราชอาณาจักร ทำให้เกิดปัญหาลิงก์รูปภาพบนเว็บหลากหลายรูปแบบเช่น Reddit, ฟอรัม, เอกสาร ฯลฯ ไม่แสดงผล
- รูปตัวอย่างของ Minecraft shader หายไปทั้งหมด จนตรวจสอบไม่ได้นว่าเป็น shader ใด
- ในโพสต์เก่า หรือไฟล์ README ลิงก์ของ Imgur ยังคงปรากฏอยู่ ทำให้การเข้าถึงไม่ได้ยังคงเกิดขึ้นต่อเนื่อง
เลือกโซลูชันระดับเครือข่ายแทน VPN
- แนวทางทั่วไปคือการใช้ VPN แต่ ในสภาพแวดล้อมอินเทอร์เน็ตความเร็วสูง 2.5Gbps การขับเคลื่อนทราฟฟิกทั้งหมดผ่าน VPN เพื่อเลี่ยงบล็อกทำให้ความเร็วลดลง
- เกิดปัญหาความซับซ้อนด้านการจัดการ เพราะต้องติดตั้งและเชื่อมต่อ VPN ในแต่ละอุปกรณ์
- มีเป้าหมายที่จะได้โซลูชันระดับเครือข่ายที่ทำงานอัตโนมัติบนทุกอุปกรณ์ โดยไม่ต้องตั้งค่าที่ไคลเอนต์
ออกแบบสถาปัตยกรรมระดับเครือข่าย
- ในสภาพแวดล้อมโฮมแลปเดิม มีการใช้ Traefik (reverse proxy) , Pi-hole (DNS) และ NixOS (declarative config) อยู่แล้ว
- ที่ขั้นตอน DNS ดักคำขอ
i.imgur.com แล้วส่งผ่านคอนเทนเนอร์เชื่อมต่อ VPN (Gluetun)
- Pi-hole ส่งคืน IP ของ Traefik
- Traefik ตรวจสอบชื่อโฮสต์ SNI และ route ไปยัง Gluetun
- Gluetun ส่งคำขอผ่าน VPN
- ภายใน Gluetun มี Nginx ทำหน้าที่ reverse proxy ไปยังเซิร์ฟเวอร์จริงของ Imgur
- ส่งภาพกลับผ่าน tunnel
การตั้งค่า Nginx และ Gluetun
- เพราะ Gluetun มีแต่การเชื่อมต่อ VPN เท่านั้น จึงจำเป็นต้องมี Nginx ทำงานเป็น proxy ภายในเครือข่าย VPN
- ตั้งค่า Nginx เป็น โหมด TCP stream เพื่ออ่าน SNI header และส่งต่อทราฟฟิกไปยัง
i.imgur.com:443
- การจับมือ TLS (TLS handshake) ดำเนินการแบบ end-to-end ทำให้ Nginx ไม่ได้เห็นข้อมูลที่ถอดรหัสแล้ว
- รันสองคอนเทนเนอร์ (Gluetun, Nginx) ใน Docker Compose
- ตั้งค่า
network_mode: "service:gluetun" เพื่อให้ Nginx ใช้ร่วม stack เครือข่ายกับ Gluetun
- ทราฟฟิกทั้งหมดของ Nginx จะผ่าน VPN tunnel โดยอัตโนมัติ
การรวม Traefik และ NixOS
- Traefik ใช้ TCP routing และ TLS pass-through เพื่อส่งต่อคำขอ
i.imgur.com ไปยัง Gluetun
- ไม่ทำ TLS termination ตรวจสอบเฉพาะ SNI header
- รันสแต็ก Docker Compose ด้วย บริการ systemd ใน NixOS
- ใช้ Agenix เก็บข้อมูลรับรอง VPN แบบเข้ารหัส
- เก็บที่เก็บ dotfiles ทั้งหมดไว้แบบ public ได้ ขณะเดียวกันยังปกป้องข้อมูลลับ
ผลลัพธ์และประสิทธิภาพ
- อุปกรณ์ทั้งหมดในเครือข่าย (รวมมือถือ โน้ตบุ๊ก และอุปกรณ์ผู้เยี่ยมชม) เข้าถึงภาพบน Imgur ได้โดยไม่ต้องตั้งค่าแยก
- Pi-hole ดัก DNS, Traefik ทำ routing, Gluetun ทำการ VPN tunneling อย่างต่อเนื่อง
- การหน่วงเวลาขณะโหลดรูปภาพแทบไม่พบ และทราฟฟิกของ Imgur ที่ผ่าน VPN ยังคงคงความเร็วเหมือนทราฟฟิกปกติ
- การดูแลรักษาง่ายและได้โครงสร้าง ปลดบล็อกภูมิภาคแบบอัตโนมัติ สำหรับโฮมแลปสำเร็จลุล่วง
- เนื้อหาที่อ้างอิง Imgur เช่น Minecraft shader สามารถตรวจสอบได้ตามปกติอีกครั้ง
1 ความคิดเห็น
ความเห็นบน Hacker News
ใช้กล่อง fanless ราคาถูกที่ลง Linux ไว้ มีหลายพอร์ต แล้วตั้งค่าอินเทอร์เฟซ WireGuard ด้วย systemd-networkd แค่ครั้งเดียว
แบบนี้ก็สามารถ route เฉพาะทราฟฟิกบางอย่างผ่าน VPN หรือแยก SSID/VLAN สำหรับ VPN โดยเฉพาะก็ได้
แต่ การ routing ตามโดเมน อาจยุ่งยากอยู่บ้าง เลยคิดว่าถ้าจำเป็นจะเพิ่มพร็อกซีบนเราเตอร์ที่ทำ local DNS override ได้
และยังรองรับ geographic split routing แบบอิงกฎด้วย เลยมีประโยชน์มาก
มีบทความที่เกี่ยวข้องอยู่ในบล็อกนี้
ที่ผ่านมาหงุดหงิดเพราะสกรีนช็อตไม่ขึ้น และคิดว่าโพสต์นี้น่าจะเป็นแรงผลักสุดท้ายแล้ว
การบล็อกแบบนี้หลบได้ไม่ยาก แต่ถ้า Imgur หายไปจริง ๆ หลายเว็บก็คงพัง
หากผู้คนยัง bypass การเซ็นเซอร์ได้และทราฟฟิกที่เสียไปไม่ได้มากนัก ก็สำคัญตรงที่เซิร์ฟเวอร์ต่างประเทศไม่จำเป็นต้องยอมก้มหัวให้กฎระเบียบแบบอำนาจนิยม
ดูเหมือนว่า EU ก็กำลังไปในทิศทางคล้ายกัน ดังนั้นเครื่องมือที่ใช้ปฏิเสธการเซ็นเซอร์ควรถูกเผยแพร่ให้กว้างขวาง
ถ้าตั้งไว้บน Raspberry Pi หรือ mini PC คู่กับ PiHole ก็สามารถ tunnel ทราฟฟิกจากบ้านของครอบครัวให้ออกผ่าน IP ของเราได้
แค่เพิ่มไฟล์ตั้งค่า WireGuard ในแอปมือถือ แล้วไปกำหนดใน policy engine ให้ route เฉพาะบางโดเมนผ่านอินเทอร์เฟซ VPN
ฉันเลยแก้ขัดด้วยการสร้างกฎไฟร์วอลล์ยาว ๆ เพื่อบล็อกช่วง IPv6 แต่กลับมีปัญหากับเว็บไซต์ที่ใช้ Cloudflare
หวังว่า UniFi จะรองรับ IPv6 WireGuard
Reddit ยิ่งหนักกว่า เพราะแม้แต่โปรไฟล์ของผู้ใช้ที่เคยโพสต์ NSFW ก็ยังเปิดดูไม่ได้
แบบนี้จะได้จัดการอัตโนมัติโดยไม่ต้องคอยเปิดปิด VPN ทุกครั้ง
เช่นกรณี โซเชียลมีเดียที่ต้องยืนยันอายุ, แอปที่ถูกบล็อกตามประเทศ (เช่น Spotify) หรือ การเซ็นเซอร์เว็บไซต์ข่าว ก็น่าจะมีประโยชน์มาก
โดยทั่วไปใช้กับคำขอ HTTP/S เท่านั้น แต่ผู้ให้บริการอย่าง ZScaler ก็ขยายไปใช้กับโปรโตคอลอื่นด้วย
ใน Tailscale มีฟีเจอร์ App Connector ที่ทำหน้าที่นั้น
ใช้เวลาราว 15 นาทีก็ตั้งให้เฉพาะบางโดเมนวิ่งผ่าน VPN ได้ และมันทำงานดีมาก
ในสภาพแวดล้อมอย่าง Wi‑Fi บนเครื่องบินที่ VPN ถูกบล็อก แต่ยังอนุญาต SSH อยู่ ฉันจะใช้ dynamic forwarding ร่วมกับไฟล์ PAC เพื่อให้ระบบความบันเทิงบนเครื่องหรือเว็บติดตามต่าง ๆ เชื่อมต่อโดยตรง
ใช้งานได้ดีทีเดียว