16/11/2020
ในช่วงต้นเดือน เว็บให้พร ของเราถูกสั่ง Block ไป แต่บางคนก็หาทางจนเข้าได้ บางคนก็เข้าได้ปกติไม่เกิดอะไรขึ้น มาดูกันดีกว่าปกติเขา Block กันยังไง
ปกติการ Block ก็มีหลายวิธี และก็ต้อง advance ขึ้นตามสมัย สมัยก่อนเว็บไซต์ ทำงานผ่าน protocol HTTP (Port 80) แบบไม่เข้ารหัส ดังนั้น ข้อมูลที่วิ่งไปหา Server จาก Internet เราก็จะเห็นหมดว่าเปิดไป hostname อะไร URL อะไร เพราะดูจาก HTTP Header ได้เลย
เวลาเราเปิด http://weather.bangkok.go.th/radar/ ข้อมูลที่วิ่งบน Port 80 มาเป็น Text อ่านได้เลย จะเห็นว่ามองเห็นหมดว่าเราเรียกเว็บ weather.bangkok.go.th และ path หรือ URL /radar/
ดังนั้นการ block website โดยทั่วไป ถ้าอยู่ในต่างประเทศจะค่อนข้างง่าย เพราะมี Gateway ออกต่างประเทศจำกัดไม่กี่ราย และต้องอยู่ภายใต้กฎหมาย และการดูแลของกระทรวง DE ซึ่งกำหนดให้ผู้ให้บริการ เกตเวย์ระหว่างประเทศ มีหน้าที่ block website ที่ไม่เหมาะสมตามประกาศของกระทรวง โดยการใช้ Pattern Match หรือการค้นหา Text จาก ตัว HTTP Header เนี่ยแหละ เช่น Match Header ตรง ‘Host: พรนะฮับ.คอม’ ได้เลย ซึ่งส่วนใหญ่จะอยู่ต้น ๆ Packet ของ TCP Packet ที่วิ่งบน Port 80 (ปกติ Pattern Match จะทำได้จำกัด เช่น 64 byte จากตำแหน่ง x บน Packet หรือ Frame เช่น บอกว่าให้ ค้นหา คำว่า ‘Host: พรนะฮับ.คอม’ จาก byte ที่ 14 ซึ่งมันทำงานได้ในระดับความเร็วแสง เพราะมี Hardware คอยจัดการโดยเฉพาะ ไม่มีผลต่อความเร็วเลย ถ้าเจอ Header ตามนี้ก็แค่ Drop ทิ้ง ข้อมูลก็ไปไม่ถึง Server แล้ว หรือร้ายกว่านั้นก็ตอบกลับ Response ปลอม ๆ ไป (แบบที่กระทรวง DE ชอบทำ) คือ redirect ไปเว็บของกระทรวงเสียเลย เราเลยเจอหน้าตาที่คุ้นเคยสีเขียว ๆ (เดี๋ยวนี้ไม่เขียวแล้ว)
สมัยก่อน เว็บไซต์ส่วนใหญ่ยังไม่มีการเข้ารหัส (เพราะค่า Certificate มันแพงด้วยส่วนหนึ่ง) เลย block ได้ง่ายมาก
ประมาณ 3-4 ปีที่แล้ว Browser ต่าง ๆ เริ่มผลักดันการเข้ารหัสในการเปิด Websites ซึ่งมีองค์กรคอยให้บริการ Certificate ฟรี อย่าง Let’s Encrypt เว็บไซต์ต่าง ๆ เริ่มไปใช้ Protocol แบบ HTTPS (Port 443) แทน HTTP ที่มีการเข้ารหัส คราวนี้การ block เลยยากขึ้น เพราะ HTTP Header จริง ๆ เราจะไม่เห็น และอ่านไม่รู้เรื่อง
แต่ว่าด้วยความที่ Protocol HTTPS ดั้งเดิม (TLS version ต่ำกว่า 1.3) นั้นมีการใช้ SNI (Server Name Identification) แบบไม่เข้ารหัส สำหรับแบ่งแยก certficate สำหรับ hostname ที่อยู่บน IP เดียวกัน
ดังนั้นส่วนใหญ่ต่อให้ใช้ HTTPS ก็ยังมีโอกาสถูก block ได้อยู่ดี แต่ไม่สามารถ Block ราย URL หรือ Path ด้านหลังได้ ต้อง block ไปทั้งเว็บไซต์เลย แต่ไม่สามารถ Redirect ได้ละ เพราะว่า Certificate มัน Verify ไม่ผ่าน browser จะเตือนทันที
ที่นี้ทำไมบางคนเข้าได้
ก็ต้องบอกว่า Privacy ฝั่ง User มันก็พัฒนาไปอีกขั้น หลังจาก TLS 1.3 มีการใช้งาน Encrypted SNI (ESNI) หรือ Encrypted Client Hello (ECH) ทำให้มันสามารถส่ง SNI โดยเข้ารหัสได้ (โดยใช้ public key ที่ได้จาก DNS อีกที) ซึ่งแน่นอน pattern match ไม่ได้ เพราะ server ต้องรู้ private key ที่ตรงกัน และ Great Firewall of China ก็ไม่รอช้า Block ESNI เสียเลย ทำให้ browser ยังต้องใช้ SNI ปกติในการเข้า แต่ไทยน่าจะยังไม่มีการ block นะครับ บางคนเลยเข้ากันได้
บางครั้งไม่รู้จะ Block ยังไงก็เล่นท่าไม้ตายครับ Block DNS เสียเลย (บางทีก็ Block เฉพาะ ESNI Key ที่มาจาก DNS) เพราะ Port 53 มันไม่เข้ารหัส แต่การทำแบบนี้ต้องอาศัยความร่วมมือของผู้ให้บริการ Internet ในประเทศ เพราะส่วนใหญ่ก็ใช้ DNS Resolver ของ ISP ที่ใช้อยู่ ส่วนถ้าเป็น Website ในประเทศ ขอหมายศาล ไปยกเครื่องเลยง่ายกว่า 🤣
แต่สุดท้ายเราก็มีทางออกครับ เร็ว ๆ นี้ browser ต่าง ๆ เริ่ม support DNS over TLS (Port 853) หรือ DNS over HTTPS (443) พูดง่าย ๆ คือ คราวนี้เข้ารหัสมันทั้ง DNS ทั้ง HTTP ปกติ เราไปเปิดได้ครับใน Chrome/Firefox เวอร์ชันใหม่ ๆ ใช้ได้กันหมด Google DNS ก็มี DNS over TLS ให้ใช้ด้วย ถ้าไม่โดน block IP พวก Google DNS, Cloudflare DNS หรือ Open DNS ก็น่าจะไปต่อได้ครับ 555+
เปิดยังไงไปศึกษาดูครับ
https://support.opendns.com/hc/en-us/articles/360038086532-Using-DNS-over-HTTPS-DoH-with-OpenDNS