ทำงานมามีปัญหาหนึ่งกวนใจมานาน คือเวลา work from home แล้วพบว่าลืม push code จากเครื่องที่ออฟฟิศมา หลายๆ ทีถ้าจะเอาให้ได้งานก็จะเขียนใหม่ไปเลยแล้วไป reset ที่ทำงาน ซึ่งก็ไม่ productive เท่าไร
ทีนี้พอมี home server แล้วรู้สึกว่ามันดีมากๆ ที่เราสามารถ ssh กลับบ้านได้จากที่ทำงาน โดยเฉพาะเวลาที่ IoT หรือ Network ภายในบ้านมีปัญหาเราก็จะ troubleshoot ได้ทันทีโดยไม่ต้องพยายามบอกทางโทรศัพท์ เลยคิดว่าอยากจะ ssh กลับไปเครื่องที่ออฟฟิศบ้าง
ทีนี้จะทำยังไง?
สมัยก่อนย้ายตึก บริษัทมี Fix IP และมี dev server ภายใน ก็เคยคิดว่าจะ Jump ผ่านเครื่อง dev server แต่ก็ยังไม่เคยลองทำสักที ปัญหาหนึ่งคือ IP เครื่องเราไม่ fix และเราไม่อยากบอกรหัสให้คนอื่นเข้าไปอ่าน IP ออกมา
พอหลังจากบริษัทย้ายมา WeWork แล้วไม่น่าจะใช้วิธีนี้ได้อีก เพราะบริษัทไม่ได้ถือ Public IP ที่ออฟฟิศอีกแล้ว
ก็เลยคิดว่าต้องใช้ VPN จากบนเครื่อง วิธีง่ายที่สุดคือทำ OpenVPN server แล้วให้ทุกเครื่องต่อแบบ always on แต่ไม่ค่อยชอบ OpenVPN สักเท่าไร เลยอยากลองหาอะไรแปลกๆ ดู
Mesh VPN
ไอเดียของ VPN ที่เราอยากได้คือ VPN ที่ไม่มี server กลาง
VPN ทั่วไปจะเป็นแบบในภาพนี้
ก็คือจะมี VPN server เครื่องหนึ่ง จากนั้นทุกคนต่อเข้า Server นี้ ถ้าเครื่องนี้ตายก็คือจบ เป็น Single point of failure
ถ้าการใช้งานใน scale แบบในภาพ อาจจะเป็นไปได้ว่า Site 1, 2, 3 มี Public IP และสามารถต่อหากันตรงได้อยู่แล้ว แล้วทำไมจะต้องวิ่งผ่าน Server กลางด้วย? ส่วน Road warrior อาจจะมีสาขาที่ทำงานประจำอยู่แล้ว ก็ให้ต่อผ่าน server ของสาขาที่ประจำอยู่ด้วยโดยตรงก็ได้
บน Mesh VPN สมมุติว่าเราให้ Site 1, 2, 3 เชื่อมต่อ VPN หากันเองทั้งหมด และเชื่อมต่อหา server กลางด้วย ส่วน Road warrior ให้เชื่อมต่อกับสาขาตัวเองเท่านั้น และ Server กลาง
เมื่อทำ Topology นี้แล้วเราสามารถเชื่อมต่อหากันได้หมด เช่น Road warrior ที่ต่อกับ Site 1 สามารถคุยกับ Site 3 ได้
ที่พิเศษหน่อยคือ Mesh VPN จะอนุญาตให้เรา route package ผ่านเครื่องอื่นๆ ยังไงก็ได้ เช่น สมมุติว่า Internet ที่ Site 2 หลุดแต่ Road warrior ต่อเน็ตผ่านมือถือและยังสามารถเข้าถึง Site 2 server ได้อยู่
จากภาพนี้ ถ้า Site 1 ต้องการติดต่อ Site 2 ระบบก็ยังสามารถทำงานได้ตามปกติ โดย Route packet ผ่าน VPN server > Road warrior > Site 2
ที่เป็นแบบนี้เพราะ IPv6 ที่เห็นนั้นคือ SHA512 ของ Public Key ของเราแล้วตัดเหลือ 16 bytes แรก ทำให้เวลาให้ IP ใครไปเหมือนให้ key fingerprint ไปในตัว
ทั้งนี้ Public Key ที่ Valid สำหรับการใช้งานใน CJDNS จะขึ้นด้วย fc เสมอ (โปรแกรมจะ brute force ออกมาให้เวลาเปิดครั้งแรก) เนื่องจากบล็อค fc00::/7 เป็นช่วง Unique local address
เพื่อให้ใช้งานง่าย เราอาจจะเอา IP นี้ไปไว้ใน DNS (ใช้ Public DNS ทั่วๆ ไปก็ได้ที่รองรับ IPv6) จะได้ไม่ต้องจำ และคนข้างนอกที่ไม่ได้เชื่อมต่อเครือข่ายเรา ถึงจะทราบ IP แต่ก็ต่อไม่ได้อยู่ดี
เนื่องจากจะเป็นปัญหาไก่กับไข่ว่าเราจะไปหา IP ของ Root Server มาจากไหน server ในชุดนี้เลยกำหนดเป็น fix IP ทั้งหมด ซึ่งเราสามารถ Download รายชื่อได้ที่ https://www.iana.org/domains/root/servers ปัจจุบันมีอยู่ 13 IP ตั้งชื่อว่า a-m ซึ่งแต่ละ IP ก็จะมี server จำนวนมากรับอยู่ด้านหลัง
ในอดีตยังไม่มีเทคโนโลยีป้องกัน DNS เท่าไรนัก แต่หลังจากความพยายามหลายครั้งแล้วเราก็มีมาตรฐาน DNS over TLS และ DNS over HTTPS ออกมา
DNS over TLS แปลว่า เอา DNS protocol วิ่งอยู่บน TLS ซึ่งเป็นระบบเข้ารหัสเช่นเดียวกับที่ HTTPS ใช้อยู่ (HTTPS ก็คือ HTTP protocol วิ่งอยู่บน TLS)
DNS over HTTPS แปลว่าเอา DNS protocol แปลงเป็น web request แล้วยิงไปหา server HTTPS (ที่อยู่บน TLS อีกที)
ฟังดูแล้ว DNS over TLS จะดูดีกว่าเพราะจำนวนชั้นน้อยกว่า แต่การกระจายโหลดบน HTTPS เป็นปัญหาที่ถูกศึกษามานานหลายปีมาก (เพราะเว็บไซต์ก็อยู่บน HTTPS ทั้งนั้น) ทำให้ผู้ให้บริการบางเจ้ายังคิดว่า DNS over HTTPS นั้นให้บริการง่ายกว่า
ปัจจุบันผู้ให้บริการทั้ง Google Public DNS, Cloudflare DNS, OpenDNS, Adguard ก็มีบริการ DNS over TLS หรือ HTTPS กันหมดแล้ว ย้ำเพื่อความชัดเจนว่าเปลี่ยน DNS ในระบบเป็นผู้ให้บริการเหล่านี้ไม่ได้แปลว่าเข้ารหัส DNS แล้ว ต้องใช้โปรแกรม client เฉพาะทางเท่านั้น
คนที่สามที่เราต้องการป้องกันคือผู้ให้บริการ DNS สำหรับเว็บไซต์นั้นๆ เช่นบล็อคนี้ผม Host บน server ผมเองก็จริง แต่ DNS Server ใช้ของ Google Cloud DNS แปลว่าเวลามีคนเข้าบล็อคนี้ Google จะรับรู้ด้วย
จุดที่น่าสนใจคือ Recursive Resolver จะมีการส่ง IP ของเราบางส่วนไปยังผู้ให้บริการ DNS ด้วย (EDNS Client Subnet) คือถึงแม้ว่าคนที่เข้าเว็บนี้จะใช้ OpenDNS เข้า แล้ว Server Google Cloud DNS เห็นว่า OpenDNS ติดต่อเข้ามาก็จริง แต่ OpenDNS จะให้ IP เราบางส่วนไปด้วย (อาจจะปิดหลักสุดท้ายให้ เช่น 171.232.31.xxx)
เหตุผลที่ต้องทำแบบนี้เพราะบางครั้ง IP ของ server ที่เราจะเข้านั้นขึ้นอยู่กับ IP ของเราด้วย เช่น ถ้าเราเข้าจากประเทศไทยอาจจะเอา server ภายในประเทศให้ ถ้าเข้าจากอเมริกาก็จะได้ IP ที่อเมริกา ไปจนถึงบางครั้งเป็นระดับ ISP เลยทีเดียว ซึ่งถ้าหากไม่ส่งไปแล้วเค้าจะอ้างอิงตาม IP ของ Recursive Resolver แทนซึ่งอาจจะอยู่ห่างไกลกับผู้ใช้งานมากเลย (เช่น Google Public DNS อาจจะให้ server สิงคโปร์มา)
จากรายการด้านบนที่ให้ จะมีแค่ Cloudflare DNS และ AdGuard ที่ไม่ส่งข้อมูลนี้ ก็เป็นผลดีต่อ Privacy แต่ข้อเสียคืออาจจะทำให้เข้าเว็บได้ช้าลงเพราะเค้าจะให้ server ที่อยู่ใกล้ขึ้น
หลังจากเราทราบ IP ของเว็บแล้ว เราก็จะติดต่อไปยังเว็บนั้นๆ ซึ่งแน่นอนว่าเราต้องบอก IP ไปให้ ISP ของเราทราบเพื่อเชื่อมต่อ (เหมือนจะโทรหาเพื่อนแต่ไม่กดเบอร์ก็ไม่ได้นะ…)
ตรงนี้แน่นอน ISP จะทราบ IP ที่เราจะเชื่อมต่อด้วย ไม่มีทางเลี่ยงได้
วิธีที่จะป้องกันได้ก็คือการใช้ VPN หรือ Proxy ซึ่งจะทำให้ ISP เราเห็น IP เป็น IP ของ VPN เพียงอย่างเดียว แต่ปัญหาที่ตามมาก็คือผู้ให้บริการ VPN ก็จะเห็น IP ของเว็บที่เราจะเชื่อมต่อด้วย
Tor จะจัดกลุ่มพิเศษหน่อยถึงแม้จะเป็น Free VPN เช่นกัน
Tor เป็นผลงานของกองทัพเรือสหรัฐ แต่ปัจจุบันถูกพัฒนาโดยนักพัฒนา open source ผมเข้าใจว่ากองทัพสหรัฐใช้ส่งข้อมูลของสายลับ และเพื่อให้แนบเนียนเลยต้องเปิดให้คนทั่วไปใช้ด้วยเพื่อไม่ให้คนที่ใช้ Tor ถูกจับตามองเป็นพิเศษ
ิวิธีการทำงานของ Tor เปรียบเสมือน Proxy ต่อกันเป็นทอดๆ คือเมื่อเราจะติดต่อกับ Jane (ในภาพ) เราจะสุ่มเลือก Tor node มาจำนวนหนึ่ง (สมมุติว่าคือ A, B, C) และ Exit node อีกหนึ่งเครื่อง (สมมุติว่าเป็น E)
จากนั้นเราเข้ารหัสข้อมูลเป็นชั้นๆ ดังภาพแล้วส่งทั้งหมดให้ A, A จะถอดรหัสแล้วทราบว่าต้องส่งให้ B พอ B ถอดรหัสจะรู้ว่าส่งให้ C ไปเรื่อยๆ จนกระทั่งถึง E ก็จะทราบ IP ของเว็บไซต์ปลายทางที่ต้องส่งให้
วิธีนี้ทำให้ A, B, C ที่เป็น Relay node ระหว่างทางไม่สามารถทราบเส้นทางหรือเนื้อหาได้ ทราบเพียงแค่ว่าใครส่งมาให้ และใครเป็นคนถัดไป ส่วน E จะมองเห็นเนื้อหาด้วยเพราะต้องส่งข้อมูลนี้ออกจากเครือข่าย Tor
เว็บไซต์ปลายทางเมื่อได้รับข้อมูลจาก E ก็จะทราบ IP ต้นทางเพียงว่ามาจาก E เท่านั้น ดังนั้นการรัน Exit node จะมีความเสี่ยงเพราะถ้าหากเป็นข้อมูลที่ประสงค์ร้ายแล้วเว็บไซต์ก็ต้องดำเนินการกับ Exit node เท่านั้น
สำหรับผู้ใช้งาน Tor นั้น ในทางเทคนิคแล้ว Tor ค่อนข้างมีความปลอดภัยสูง เพราะไม่มีใครสามารถทราบต้นทางได้ว่าข้อความมาจากใคร (แม้แต่ E ก็ไม่ทราบ) มีเพียงเฉพาะคนที่เราเชื่อมต่อตรงไปเท่านั้น (คือ A) ที่ทราบ แต่ก็จะไม่ทราบเนื้อหาและปลายทาง
ข้อเสียของ Tor คือเนื่องจากเชื่อมต่อหลายทอด และผู้ให้บริการเป็นอาสาสมัครก็จะไม่ได้มีความเร็วสูงเท่าไรนักจึงไม่เหมาะกับการใช้ในชีวิตประจำวันเท่าไร (นอกจากต้องการความเป็นส่วนตัวสูงมากและยอมรับความเร็วที่ลดลงมากได้) และมีโอกาสที่ Exit node จะดักฟังข้อมูลของเราอยู่
นอกไปจากนี้ ยังมีความเป็นไปได้ว่ามีหน่วยงานของรัฐรัน node อยู่เป็นจำนวนมากจนอาจทำให้ทั้ง A, B, C, E เป็นเจ้าหน้าที่รัฐทั้งหมด กรณีนี้ก็ทำให้สามารถทราบต้นทางของข้อมูลได้ (และเชื่อว่ามีการใช้เทคนิคนี้นำไปสู่การจับกุมแล้ว)