การส่งต่อพอร์ตบนฮอตสปอต Android: สามจุดเข้า
โทรศัพท์ เส้นทางของผู้ให้บริการ และทางออก VPN เผยขอบเขตที่ต่างกัน ระบุว่าเครื่องใดเป็นเจ้าของซ็อกเก็ตที่รอรับก่อนเปิดพอร์ตใด ๆ
คุณเปิดฮอตสปอต เชื่อมต่อ VPN เปิดพอร์ตในแอป และอุปกรณ์อีกเครื่องก็ยังเชื่อมต่อไม่ได้ ชิ้นส่วนที่ขาดหายแทบไม่เคยเป็นตัวพอร์ตเอง คำถามคือเครื่องใดเป็นเจ้าของซ็อกเก็ตที่รอรับ และอุปกรณ์อีกเครื่องควรไปถึงที่อยู่ใด ผมไล่เรื่องนี้จากโทรศัพท์ออกไปข้างนอก เพราะหน้าจอที่คุณอยู่บอกคุณว่าคุณกำลังทดสอบจุดเข้าใดในสามจุดจริง ๆ
เริ่มจากที่ที่บริการทำงานจริง
เปิดแอปที่ควรรับการเชื่อมต่อและอ่านหน้าสถานะของมัน ถ้ามันบอกว่ากำลังรอรับ ให้จดที่อยู่ที่มันผูกไว้ เพราะรายละเอียดเดียวนี้ตัดสินกรณีส่วนใหญ่ด้านล่าง แอปที่ผูกกับ 127.0.0.1 เข้าถึงได้จากโทรศัพท์เองเท่านั้น และไม่มีไคลเอนต์ฮอตสปอต การแมปของผู้ให้บริการ หรือทางออก VPN ใดจะเปลี่ยนสิ่งนั้น
จากนั้นยืนยันว่าอุปกรณ์ใดรันบริการนี้ ถ้าเป็นโทรศัพท์ ซ็อกเก็ตก็เป็นของแอปนั้น หรือเป็นแล็ปท็อปที่อยู่หลังฮอตสปอต ตัวรอรับและไฟร์วอลล์ของมันก็เป็นของแล็ปท็อป และโทรศัพท์เพียงส่งต่อแพ็กเก็ต สิ่งเหล่านี้เป็นการออกแบบต่างกันที่มีเจ้าของต่างกัน และการผสมกันคือสาเหตุที่พอร์ตที่เปิดในที่หนึ่งไม่ทำอะไรในอีกที่หนึ่ง
ในบิลด์ที่ดีบักได้ adb shell สามารถแสดงรายการซ็อกเก็ตผ่าน /proc/net/tcp แต่สำหรับคนส่วนใหญ่สถานะของแอปเองคือแหล่งข้อมูลที่ซื่อตรง มันยังหลีกเลี่ยงกับดักของการทดสอบซ็อกเก็ตที่แอปเปิดบนที่อยู่ที่คุณไม่ได้คาดไว้
จุดเข้าแรก: อุปกรณ์อีกเครื่องบนฮอตสปอต
นี่คือกรณีท้องถิ่นและทำได้ถูกต้องง่ายที่สุด อุปกรณ์อีกเครื่องไปถึงโทรศัพท์ที่ที่อยู่ซึ่งมันมองว่าเป็นเกตเวย์ของตน ที่พอร์ตที่แอปรอรับ และไม่มีสิ่งใดนอกฮอตสปอตต้องเข้ามาเกี่ยวข้อง ไม่ต้องใช้การแมปของผู้ให้บริการ และไม่ต้องมีคุณสมบัติใดของผู้ให้บริการ เพราะทราฟฟิกไม่เคยออกจากเซกเมนต์ท้องถิ่น
สองสิ่งทำให้มันพัง แอปผูกกับลูปแบ็ก หรือนโยบายไคลเอนต์บนโทรศัพท์ไม่อนุญาตการเชื่อมต่อท้องถิ่น หากแอปมีการยืนยันตัวตน ให้ทดสอบด้วยโปรโตคอลของแอปเองแทนการเชื่อมต่อ TCP เปล่า ๆ เพราะตัวรอรับที่ตอบรับแล้วปฏิเสธจะดูเหมือนพอร์ตที่ปิดจากระยะไกล
หากบริการรันบนแล็ปท็อปที่เชื่อมกับโทรศัพท์ ที่อยู่ฮอตสปอตของโทรศัพท์ไม่ใช่ปลายทางเลย คุณต้องมีที่อยู่ของแล็ปท็อปบนอินเทอร์เฟซฮอตสปอตและตัวรอรับบนแล็ปท็อป และโทรศัพท์ไม่ได้เป็นเจ้าของสิ่งใดนอกจากการส่งต่อ
จุดเข้าที่สอง: เส้นทางของผู้ให้บริการ
การไปถึงโทรศัพท์จากเครือข่ายมือถือเป็นอีกปัญหาหนึ่ง และส่วนใหญ่มันไม่ทำงานกับ IPv4 ผู้ให้บริการวางเครื่องไว้หลังการแปลที่อยู่แบบใช้ร่วมกัน ซึ่งเป็นเหตุผลที่ RFC 6598 กันช่วงที่อยู่ใช้ร่วมไว้สำหรับการจัดวางเช่นนั้นโดยเฉพาะ การเชื่อมต่อขาเข้าที่ไม่ได้ร้องขอไม่มีแมปให้เข้ามา และไม่มีการกำหนดค่าใดในเครื่องสร้างมันขึ้นมา เพราะตัวแปลที่อยู่ไม่ใช่อุปกรณ์ของคุณ
การเข้าถึงแบบ root ก็ไม่เปลี่ยนสิ่งนั้น มันให้คุณควบคุมสแตกของโทรศัพท์ ไม่ใช่ตัวแปลของผู้ให้บริการ และสูตรที่สัญญาตรงกันข้ามมักสมมติที่อยู่สาธารณะที่ผู้ให้บริการไม่เคยกำหนดให้ ในที่ที่ผู้ให้บริการเสนอคำนำหน้า IPv6 สาธารณะ เส้นทางขาเข้าอาจมีอยู่ แต่ตัวรอรับและไฟร์วอลล์ของโทรศัพท์ยังต้องได้รับการอนุญาตอย่างตั้งใจก่อนจะมีสิ่งใดตอบสนอง
จุดเข้าที่สาม: ทางออก VPN
ที่อยู่ที่เว็บไซต์รายงานขณะที่อุโมงค์ทำงานคือที่อยู่ของทางออกสำหรับทราฟฟิกขาออกที่ถูกครอบคลุม นั่นไม่ใช่สิ่งเดียวกับที่อยู่ที่รับการเชื่อมต่อขาเข้าในนามของคุณ การใช้มันสำหรับขาเข้าต้องมีคุณสมบัติที่ผู้ให้บริการเสนอจริง เช่นพอร์ตที่ส่งต่อหรือการแมปขาเข้าที่ผูกกับบัญชีของคุณ พร้อมเส้นทางที่ใช้งานได้จากทางออกถึงไคลเอนต์
กฎอนุญาตในเครื่องไม่สามารถสร้างการแมปนั้นได้ สิ่งที่มันทำได้คือเปลี่ยนว่าเส้นทางใดที่การตอบกลับของแอปใช้ ซึ่งสำคัญเมื่อแอปถูกยกเว้นจากอุโมงค์ คำขอและการตอบกลับอาจไปจบในบริบทเครือข่ายที่ต่างกัน และการเชื่อมต่อล้มเหลวในลักษณะที่ดูเหมือนปัญหาไฟร์วอลล์
ทดสอบเส้นทางเดียวตั้งแต่ต้นจนจบ แล้วจึงระบุเจ้าของ
เขียนทูเพิลก่อนทดสอบ แหล่งที่ตั้งใจ ที่อยู่ปลายทาง การขนส่ง พอร์ต และเครื่องที่เป็นเจ้าของซ็อกเก็ตที่รอรับ หากองค์ประกอบใดเป็นการเดา การทดสอบจะไม่บอกอะไรที่เป็นประโยชน์ และสุดท้ายคุณจะเปลี่ยนชั้นที่สองเพื่ออธิบายชั้นแรก
จากนั้นทดสอบเส้นทางที่ได้รับอนุญาตเส้นทางเดียวนั้นโดยการยืนยันตัวตนของแอปยังคงสมบูรณ์ หลีกเลี่ยงการเผยแพร่ตัวรอรับที่กว้างหรือปิดการควบคุมที่ไม่เกี่ยวข้องเพียงเพื่อให้การตรวจที่อยู่สาธารณะที่กำกวมตอบสนอง เพราะการเปลี่ยนแปลงทั้งสองอยู่ยาวกว่าการทดสอบ และไม่พิสูจน์ว่าการออกแบบทำงาน
ระบบย่อยเทเธอริงของ Android ส่งต่อทราฟฟิกขาลงตามเส้นทางของตัวเอง แยกจากการดักจับ VPN ของแอปทั่วไป ดังนั้นเบราว์เซอร์ที่ทำงานบนแล็ปท็อปที่เชื่อมอยู่ไม่ได้บอกอะไรเกี่ยวกับการเข้าถึงขาเข้าสู่บริการบนโทรศัพท์ ก่อนจะเรียกว่าทำงานได้:
- ซ็อกเก็ตที่รอรับอยู่บนที่อยู่ที่คู่ที่ตั้งใจเข้าถึงได้ ไม่ใช่ลูปแบ็ก
- คู่นั้นใช้ที่อยู่ที่เป็นของจุดเข้านั้น ไม่ใช่ที่อยู่ทางออกจากหน้าสถานะ
- การแมปใด ๆ ฝั่งผู้ให้บริการหรือผู้ให้บริการเป็นคุณสมบัติที่รองรับ ไม่ใช่กฎที่คุณเพิ่มในเครื่อง
- คำขอและการตอบกลับผ่านบริบทเครือข่ายเดียวกัน และการยืนยันตัวตนของแอปยังผ่าน