OpenVPN บน Android ไม่เพิ่มเส้นทางหากไม่มีที่อยู่ของทันเนล
ไคลเอนต์ OpenVPN บน Android เพิ่มเส้นทางไม่ได้จนกว่าโทรศัพท์จะมีที่อยู่ของทันเนล ตรวจสอบว่าใครเป็นผู้กำหนด ตัวกรอง pull ใดทิ้งมันไป และเมื่อใดคุณต้องพิมพ์เอง
โปรไฟล์ OpenVPN บน Android ของคุณเพิ่มเส้นทางไม่ได้เพราะโทรศัพท์ไม่มีที่อยู่บนอินเทอร์เฟซเสมือน จึงไม่มีอะไรให้เส้นทางชี้ไป เส้นทางตอบเพียงว่าแพ็กเก็ตควรไปที่ใด ที่อยู่ของทันเนลตอบว่าโทรศัพท์เป็นใครภายในทันเนล และไคลเอนต์ต้องจัดหาให้ก่อนที่อินเทอร์เฟซจะเกิดขึ้นได้ ให้ทำการตรวจทั้งสี่ข้อด้านล่างตามลำดับและหยุดที่ความล้มเหลวแรก เพราะการแก้ไขเส้นทางก่อนที่ที่อยู่จะมีอยู่จะซ่อนปัญหาจริงไว้
อ่านความล้มเหลวตามลำดับที่ไคลเอนต์ทำงาน
VpnService.Builder ของ Android แยกสองแนวคิดออกจากกัน: addAddress() ใส่ที่อยู่บนอินเทอร์เฟซที่แอปกำลังสร้าง addRoute() เพิ่มคำนำหน้าเป้าหมาย และ establish() ปฏิเสธที่จะสร้างอินเทอร์เฟซจนกว่าจะมีที่อยู่เพิ่มอย่างน้อยหนึ่งรายการ ไคลเอนต์ OpenVPN จับคู่โปรไฟล์และตัวเลือกที่เซิร์ฟเวอร์ส่งมาเข้ากับการเรียกเหล่านั้นโดยตรง การเชื่อมต่อที่ไม่เคยแยกวิเคราะห์ที่อยู่จึงสร้างอินเทอร์เฟซไม่ได้เลย
นั่นคือเหตุผลที่บรรทัดบันทึกที่คุณอ่านอาจกล่าวถึงเส้นทาง ทั้งที่สาเหตุอยู่ก่อนหน้าหนึ่งขั้น ไคลเอนต์ไปถึงขั้นตอนเส้นทางหลังจากอินเทอร์เฟซมีอยู่แล้วเท่านั้น หากไม่มีที่อยู่ การเรียกเส้นทางจะล้มเหลวทันทีหรือไม่ทำงานเลย เมื่อบันทึกบอกว่าเพิ่มเส้นทางไม่ได้ ให้เริ่มจากที่อยู่ ไม่ใช่จากไวยากรณ์ของเส้นทาง
การตรวจ 1: เซิร์ฟเวอร์ใส่ที่อยู่ในคำตอบหรือไม่
สำหรับบริการ OpenVPN แบบกำหนดเส้นทาง ที่อยู่มาจากพูลของเซิร์ฟเวอร์หรือจากการกำหนดให้ไคลเอนต์แต่ละราย และโทโพโลยีเป็นตัวกำหนดรูปร่าง บนเซิร์ฟเวอร์ OpenVPN 2.4 หรือใหม่กว่า บริการที่ใช้โทโพโลยีซับเน็ตมีลักษณะดังนี้
topology subnet
server 10.8.0.0 255.255.255.0
client-config-dir ccd
ด้วยรูปร่างนั้นเซิร์ฟเวอร์จะส่งบางอย่างเช่น ifconfig 10.8.0.6 255.255.255.0 การติดตั้ง topology net30 แบบเก่ากว่าจะส่งที่อยู่ของ-peer แทน เช่น ifconfig 10.8.0.6 10.8.0.5 ดังนั้นโปรไฟล์ที่ย้ายระหว่างสองแบบอาจดูถูกต้องแต่พาเน็ตมาสก์ผิดมาด้วย
ค้นหาในบันทึกการเชื่อมต่อของไคลเอนต์สำหรับชุดตัวเลือกที่ถูกส่งมา หากไม่มีบรรทัด ifconfig เลย เซิร์ฟเวอร์ไม่เคยส่งที่อยู่หรือไคลเอนต์ปฏิเสธตัวเลือกนั้น บนเซิร์ฟเวอร์ที่ใช้ client-config-dir ไฟล์ที่ตั้งชื่อตาม common name ของใบรับรองต้องมีอยู่และบรรจุการกำหนดนั้น
# ccd/phone-anna
ifconfig-push 10.8.0.6 255.255.255.0
การตรวจ 2: ไคลเอนต์เก็บที่อยู่ที่ได้รับไว้หรือไม่
ตัวกรองที่กว้างเกินไปเป็นสาเหตุทั่วไปอันดับสอง pull-filter มีอยู่ใน OpenVPN 2.4 และใหม่กว่า และเมื่อตัวกรองหลายตัวตรงกับตัวเลือกเดียวกัน ตัวสุดท้ายที่ตรงจะเป็นผู้ชนะ catch-all ที่อยู่ท้ายสุดจึงลบที่อยู่ทิ้งโดยไม่เกิดข้อผิดพลาด
# removes every pushed option, including the address
pull-filter ignore "ifconfig"
pull-filter ignore "route"
จำกัดตัวกรองให้แคบลงถึงตัวเลือกที่คุณต้องการกำจัดจริง ๆ และปล่อยที่อยู่ไว้ตามเดิม
# keeps the pushed address, drops one unwanted LAN route
pull-filter ignore "route 10.60.0.0"
คำแนะนำให้ปิด pull ทั้งหมดมักมาจากคนที่ต้องการกำจัดเส้นทางเพียงเส้นเดียว route-nopull เป็นสวิตช์ที่แคบกว่า โดยเก็บ ifconfig และตัวเลือกอื่นที่ถูกส่งมาไว้ ขณะที่ปฏิเสธเส้นทางที่ถูกส่งและตัวเลือกแบบ DHCP ใช้เมื่อคุณต้องการอย่างนั้นจริง ๆ และตอบคำถามเรื่องที่อยู่แยกต่างหาก
การตรวจ 3: ที่อยู่นี้คุณเป็นคนพิมพ์เองหรือไม่
การกำหนดที่อยู่ด้วยมือชอบด้วยเหตุผลเฉพาะเมื่อผู้ให้บริการมอบค่าให้คุณ หากคุณพิมพ์เอง ค่านั้นต้องมาจากซับเน็ตของไคลเอนต์ VPN ไม่ซ้ำกับเซสชันที่ใช้งานอยู่ และตรงกับโทโพโลยีที่เซิร์ฟเวอร์ใช้งาน การคัดลอกที่อยู่ของบริดจ์เดสก์ท็อปหรือโฮสต์บน LAN ระยะไกลล้มเหลวทั้งสองข้อ โทรศัพท์จะอ้างที่อยู่ที่มีอยู่แล้วที่อื่น และเกตเวย์จะไม่มีเส้นทางย้อนกลับมาหามัน
คำนำหน้า LAN ระยะไกลในเส้นทางคือปลายทาง ไม่ใช่ตัวตนของโทรศัพท์ เส้นทางสำหรับ 10.60.0.0/24 บอกว่าให้ไปถึงเครือข่ายนั้นผ่านทันเนล ไม่ได้บอกว่าโทรศัพท์ควรถือที่อยู่ 10.60.0.x ใด และโทรศัพท์ไม่ควรถือที่อยู่ใดในนั้นเลย การกำหนดแบบคงที่อยู่ฝั่งเซิร์ฟเวอร์ ซึ่งไม่สามารถชนกับพูลแบบไดนามิกได้
สองเซสชันบนตัวตนเดียวเปิดเผยการชนกันแบบเดียวกัน หากใบรับรองเดียวกันเชื่อมต่อสองครั้งและเซิร์ฟเวอร์ส่งที่อยู่คงที่หนึ่งรายการให้ทั้งคู่ เซสชันที่สองจะทำซ้ำเซสชันแรก และทางแก้คือแยกตัวตนหรือแยกการกำหนด ไม่ใช่การแก้ไขฝั่งไคลเอนต์
การตรวจ 4: มีอย่างอื่นยึดช่องทันเนลอยู่หรือไม่
Android อนุญาตบริการ VPN ที่ใช้งานอยู่ได้ครั้งละหนึ่งบริการ แอป VPN อื่น หรือรายการ VPN แบบเปิดตลอดเวลาที่เปิดค้างไว้สำหรับโปรไฟล์ที่เลิกใช้แล้ว อาจยึดช่องนั้นก่อนที่ไคลเอนต์ OpenVPN ของคุณจะเรียก establish() จากนั้นอินเทอร์เฟซจะไม่ปรากฏเลยแม้โปรไฟล์จะถูกต้อง ดังนั้นให้ตัดการเชื่อมต่อ VPN อีกตัว ปิดการตั้งค่าเปิดตลอดเวลา แล้วเชื่อมต่อใหม่ก่อนแตะต้องโปรไฟล์
บริการที่ยืนกรานให้ทำบริดจ์อีเทอร์เน็ตเป็นอีกทางตัน แอป Android ที่ไม่มี root สร้างทันเนล IP ได้ ไม่ใช่ส่วนอีเทอร์เน็ตที่ทำบริดจ์ ดังนั้นไม่ว่าคุณจะพิมพ์ที่อยู่ใดก็ไม่ทำให้เซิร์ฟเวอร์ dev tap ทำงานได้ ผู้ให้บริการต้องเสนอ บริการแบบกำหนดเส้นทาง เมื่อรายงานปัญหา ให้ระบุชื่อและเวอร์ชันของไคลเอนต์ ชุดตัวเลือกที่ถูกส่ง โทโพโลยี และขั้นตอนที่แน่นอนซึ่งที่อยู่ควรปรากฏ
หากการตรวจทั้งสี่ผ่านและที่อยู่มีอยู่ ไม่ซ้ำ และถูกมาสก์อย่างถูกต้อง คำถามเรื่องเส้นทางจะกลายเป็นเรื่องปกติ: คำนำหน้าใดที่เซิร์ฟเวอร์อนุญาต และไคลเอนต์ควรจำกัดมันอย่างไร จดบันทึกที่อยู่ของทันเนล เน็ตมาสก์ และโทโพโลยีไว้ก่อนเปลี่ยนสิ่งอื่น เพราะค่าทั้งสามนี้คือสิ่งที่ผู้ให้บริการต้องนำไปเทียบกับมุมมองฝั่งเซิร์ฟเวอร์