2 คะแนน โดย GN⁺ 2025-11-29 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เมื่อ 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 ความคิดเห็น

 
GN⁺ 2025-11-29
ความเห็นบน Hacker News
  • ในเครือข่ายของฉันตั้งให้มีแค่ เราเตอร์ ตัวเดียวที่รับรู้ VPN
    ใช้กล่อง fanless ราคาถูกที่ลง Linux ไว้ มีหลายพอร์ต แล้วตั้งค่าอินเทอร์เฟซ WireGuard ด้วย systemd-networkd แค่ครั้งเดียว
    แบบนี้ก็สามารถ route เฉพาะทราฟฟิกบางอย่างผ่าน VPN หรือแยก SSID/VLAN สำหรับ VPN โดยเฉพาะก็ได้
    แต่ การ routing ตามโดเมน อาจยุ่งยากอยู่บ้าง เลยคิดว่าถ้าจำเป็นจะเพิ่มพร็อกซีบนเราเตอร์ที่ทำ local DNS override ได้
    • ไม่ต้องเปิดเบราว์เซอร์แยกต่างหากก็ได้ แค่ใช้ส่วนขยาย FoxyProxy กำหนดพร็อกซีตามแพตเทิร์น URL ก็แก้ได้ง่าย
    • ฉันใช้ RPi วางตัว central VPN splitter ที่อิง x-ray/singbox แล้วต่อ Tailscale เข้าไป ทำให้เข้าถึงได้จากทุกที่
      และยังรองรับ geographic split routing แบบอิงกฎด้วย เลยมีประโยชน์มาก
    • อยากรู้ชื่อรุ่นของกล่อง Linux แบบ fanless นั้น
  • ตอนเห็นชื่อ “Geo-Unblocked” นึกว่าจะเป็นเรื่องการจัด IP block เองให้ไม่ใช่ของสหราชอาณาจักร แต่จริง ๆ แค่เป็นการส่งทราฟฟิกบางส่วนผ่าน VPN เท่านั้น
    • ถ้าทำ หน้าที่เป็น ISP เอง ก็จะอยู่ที่ไหนก็ได้ตามต้องการ
      มีบทความที่เกี่ยวข้องอยู่ในบล็อกนี้
    • แต่การเปลี่ยน WAN address ก็คล้ายกับการเปลี่ยน IP schema ภายในเครือข่าย เลยคิดว่าในทางปฏิบัติคงใช้งานไม่ได้
  • บางทีก็รู้สึกว่า “ต้องทำถึงขนาดนี้แค่เพื่อดูรูปใน Imgur เลยเหรอ?” แต่พอไปค้นข้อมูลช่วงหลังถึงได้รู้ว่า การพึ่งพา Imgur สูงกว่าที่คิดมาก
    ที่ผ่านมาหงุดหงิดเพราะสกรีนช็อตไม่ขึ้น และคิดว่าโพสต์นี้น่าจะเป็นแรงผลักสุดท้ายแล้ว
    • ตอนนี้อาจรู้สึกว่าเยอะเกินไป แต่พอเห็นว่ารัฐบาลเริ่มขยับไปทางจำกัดการเข้าถึงคอนเทนต์มากขึ้นเรื่อย ๆ ฉันคิดว่า เตรียมตัวล่วงหน้า ไว้เป็นเรื่องฉลาด
    • Imgur ถูกใช้ในหลายที่มากกว่าที่คิด ตัวอย่างเช่นรูปบนเว็บไซต์ของ Core Devices (ทีมสานต่อ Pebble) ก็อยู่บน Imgur
      การบล็อกแบบนี้หลบได้ไม่ยาก แต่ถ้า Imgur หายไปจริง ๆ หลายเว็บก็คงพัง
    • การเซ็นเซอร์คงไม่ได้หยุดแค่ Imgur
      หากผู้คนยัง bypass การเซ็นเซอร์ได้และทราฟฟิกที่เสียไปไม่ได้มากนัก ก็สำคัญตรงที่เซิร์ฟเวอร์ต่างประเทศไม่จำเป็นต้องยอมก้มหัวให้กฎระเบียบแบบอำนาจนิยม
      ดูเหมือนว่า EU ก็กำลังไปในทิศทางคล้ายกัน ดังนั้นเครื่องมือที่ใช้ปฏิเสธการเซ็นเซอร์ควรถูกเผยแพร่ให้กว้างขวาง
    • ฉันเองก็พบว่าการ bypass ยากกว่าที่คิด แต่พอตั้ง Veepn เวอร์ชันฟรี ไปที่สิงคโปร์ก็ยังพอใช้ได้ แม้จะช้าก็ตาม
  • วิธีนี้น่าจะใช้ เลี่ยงข้อจำกัด ‘บ้านเดียวกัน’ ของ Netflix หรือ Spotify ได้ด้วย
    ถ้าตั้งไว้บน Raspberry Pi หรือ mini PC คู่กับ PiHole ก็สามารถ tunnel ทราฟฟิกจากบ้านของครอบครัวให้ออกผ่าน IP ของเราได้
  • บน UniFi ก็ทำได้ง่ายด้วย policy-based routing (PBR)
    แค่เพิ่มไฟล์ตั้งค่า WireGuard ในแอปมือถือ แล้วไปกำหนดใน policy engine ให้ route เฉพาะบางโดเมนผ่านอินเทอร์เฟซ VPN
    • ข้อเสียคือถ้าเปิด IPv6 อยู่ มันจะ bypass VPN ไปเลย
      ฉันเลยแก้ขัดด้วยการสร้างกฎไฟร์วอลล์ยาว ๆ เพื่อบล็อกช่วง IPv6 แต่กลับมีปัญหากับเว็บไซต์ที่ใช้ Cloudflare
      หวังว่า UniFi จะรองรับ IPv6 WireGuard
  • การบล็อก Imgur ในสหราชอาณาจักร คงสถานะไว้ด้วยคุกกี้ ดังนั้นแค่เปิด VPN ชั่วครู่ก็ยังแก้ไม่ได้
    Reddit ยิ่งหนักกว่า เพราะแม้แต่โปรไฟล์ของผู้ใช้ที่เคยโพสต์ NSFW ก็ยังเปิดดูไม่ได้
  • เคยสงสัยว่ามีวิธีส่งเฉพาะบางโดเมนผ่าน VPN แล้วปล่อยที่เหลือเป็นทราฟฟิกปกติไหม
    แบบนี้จะได้จัดการอัตโนมัติโดยไม่ต้องคอยเปิดปิด VPN ทุกครั้ง
    เช่นกรณี โซเชียลมีเดียที่ต้องยืนยันอายุ, แอปที่ถูกบล็อกตามประเทศ (เช่น Spotify) หรือ การเซ็นเซอร์เว็บไซต์ข่าว ก็น่าจะมีประโยชน์มาก
    • แบบนั้นเรียกว่า domain-based split tunneling
      โดยทั่วไปใช้กับคำขอ HTTP/S เท่านั้น แต่ผู้ให้บริการอย่าง ZScaler ก็ขยายไปใช้กับโปรโตคอลอื่นด้วย
      ใน Tailscale มีฟีเจอร์ App Connector ที่ทำหน้าที่นั้น
    • ในทางปฏิบัติก็คือเขาตั้งค่าแบบนั้นไว้ในบทความนั้นแล้ว
  • ฉันก็ตั้งคล้ายกันโดยใช้ PBR ของเราเตอร์ OpenWRT
    ใช้เวลาราว 15 นาทีก็ตั้งให้เฉพาะบางโดเมนวิ่งผ่าน VPN ได้ และมันทำงานดีมาก
  • สำหรับปัญหาแบบนี้ ฉันมักแก้ด้วย ไฟล์พร็อกซี PAC
    ในสภาพแวดล้อมอย่าง Wi‑Fi บนเครื่องบินที่ VPN ถูกบล็อก แต่ยังอนุญาต SSH อยู่ ฉันจะใช้ dynamic forwarding ร่วมกับไฟล์ PAC เพื่อให้ระบบความบันเทิงบนเครื่องหรือเว็บติดตามต่าง ๆ เชื่อมต่อโดยตรง
    ใช้งานได้ดีทีเดียว