เครื่องเสมือน Vagrant หายไปเมื่อ VPN เชื่อมต่อ: เส้นทางที่แตกเป็นของใคร
เครื่องที่ตอบสนองเมื่อนาทีก่อนหายไปในจังหวะที่เชื่อมต่อ ตัดสินว่าเส้นทางที่แตกเป็นของใครก่อนแก้ไขอะไร
เครื่องตอบสนองเมื่อนาทีก่อน VPN เชื่อมต่อ และตอนนี้ที่อยู่เดิมหมดเวลา มีความผิดพลาดสามอย่างที่ทำให้เกิดอาการนี้ และมันอยู่ในเครื่องคนละเครื่อง โฮสต์อาจสูญเสียเส้นทางไปยังเครือข่ายส่วนตัว ช่วง NAT ของเครื่องเสมือนอาจชนกับช่วงที่อุโมงค์ประกาศอยู่ตอนนี้ หรืออุโมงค์แบบเต็มอาจเข้าครอบครองทุกเส้นทางบนโฮสต์ ค้นหาว่าเกิดอะไรก่อนเปลี่ยนการตั้งค่าใด ๆ เพราะแต่ละการแก้ไขอยู่คนละที่
ดูที่เส้นทาง ไม่ใช่ที่เครื่อง
ดูการตัดสินใจกำหนดเส้นทางของโฮสต์สำหรับที่อยู่เครื่องเสมือนขณะอุโมงค์ทำงาน เส้นทางที่ยังชี้ไปที่อะแดปเตอร์เฉพาะโฮสต์ไม่ใช่ปัญหา เส้นทางที่ชี้ไปที่อะแดปเตอร์ VPN ตอนนี้คือปัญหา และไคลเอนต์เป็นผู้เปลี่ยน ไม่ใช่คุณ การที่อะแดปเตอร์ยังคงที่อยู่เดิมบอกว่าอินเทอร์เฟซรอดชีวิต ซึ่งเป็นข้อเท็จจริงคนละอย่างกับการที่เส้นทางรอดชีวิต
เซสชัน SSH ที่ขาดในจังหวะเชื่อมต่อพอดีเป็นพฤติกรรมที่คาดไว้ ไคลเอนต์นำอะแดปเตอร์กลับมาใช้และติดตั้งเส้นทาง การเชื่อมต่อจึงตายไปไม่กี่วินาที ความผิดพลาดคือการเชื่อมต่อที่ไม่กลับมาอีก ไม่ใช่ที่กะพริบครั้งเดียว
บันทึกตารางก่อนอุโมงค์และอีกครั้งหลัง จากนั้นเปรียบเทียบผลลัพธ์ทั้งสอง ส่วนต่างคือการวินิจฉัย และเป็นหลักฐานที่เจ้าของเครือข่ายจะขอ
ip -4 route get 192.168.56.10
ip -brief addr show
ip route show table main | head -20อ่านตารางของโฮสต์ก่อนและหลัง
บนลินุกซ์ ลำดับความสำคัญระหว่างเส้นทางที่ทับซ้อนกันมาจากความยาวพรีฟิกซ์และเมตริก เส้นทาง VPN ที่เจาะจงกว่าจึงชนะแม้จะผิด บนวินโดวส์ เมตริกของอินเทอร์เฟซตัดสินกรณีเสมอ และอะแดปเตอร์อุโมงค์มักมาด้วยเมตริกต่ำกว่าอะแดปเตอร์เสมือน ทั้งสองกรณีอาการที่เห็นเหมือนกัน คือแพ็กเก็ตออกทางอะแดปเตอร์อุโมงค์แล้วหายไป
พิมพ์อะแดปเตอร์และเมตริกข้างเส้นทางของพรีฟิกซ์เครื่องเสมือน คู่ผลลัพธ์นั้นตอบคำถามเรื่องเจ้าของได้ในครั้งเดียว
Get-NetAdapter | Select-Object Name, InterfaceIndex, InterfaceMetric
Get-NetRoute -DestinationPrefix 192.168.56.0/24
route print -4 | Select-String '192.168.56'ถ้าเส้นทางเปลี่ยนแต่เมตริกอะแดปเตอร์ไม่เปลี่ยน ไคลเอนต์ติดตั้งเส้นทางคู่แข่ง ถ้าเมตริกเปลี่ยน ไคลเอนต์จัดลำดับอะแดปเตอร์ใหม่ ทั้งสองอย่างแก้ได้ และแก้คนละที่
เมื่อช่วง NAT ของเครื่องเสมือนคือการชนกัน
VirtualBox NAT ใช้ 10.0.2.0/24 โดยค่าเริ่มต้น และอุโมงค์ที่ดันช่วงเดียวกันทำให้เครื่องเสมือนส่งข้อมูลนั้นไปที่เกตเวย์ NAT ของตัวเองแทนปลายทางจริง แพ็กเก็ตไม่ออกจากโฮสต์เลย จึงไม่มีบันทึกไฟร์วอลล์ฝั่งตรงข้ามแสดงมัน Docker Machine มีความขัดแย้งประเภทเดียวกันในแผนเฉพาะโฮสต์ และการเปลี่ยนแผนนั้นอาจต้องสร้างเครื่องใหม่พร้อมใบรับรอง
เลือกสิ่งที่แทนด้วยการไล่สิ่งที่อุโมงค์ประกาศอยู่แล้ว จากนั้นสิ่งที่เครือข่ายสำนักงานใช้ จากนั้นสิ่งที่อะแดปเตอร์เสมือนทุกตัวบนโฮสต์นี้อ้างสิทธิ์ การทับซ้อนคือสิ่งที่ทำให้การกำหนดเส้นทางพัง และความคล้ายไม่เกี่ยว ขอบเขตหนึ่งอาจอยู่ข้างในอีกขอบเขตทั้งหมดโดยหน้าตาไม่เหมือนกันเลยเมื่อมองครั้งแรก
ตั้งช่วงใหม่ตอนสร้างเครื่อง หรือเปลี่ยนแล้วโหลดใหม่ จากนั้นทดสอบการเชื่อมต่อที่ล้มเหลวอีกครั้งจากเครื่องเสมือน ตารางของเครื่องเสมือนเองคือมุมมองที่สำคัญ
VBoxManage modifyvm devbox --natnet1 10.77.0.0/24
vagrant reload devbox --provision
vagrant ssh devbox -c 'ip route get 10.20.0.15'คืนเส้นทางโดยไม่ต้องสู้กับไคลเอนต์
ทุกแพลตฟอร์มมีวิธีนำพรีฟิกซ์เฉพาะโฮสต์กลับมาไว้ข้างหน้า บน macOS เส้นทางแบบคงที่ไปยังอินเทอร์เฟซเฉพาะโฮสต์ใช้ได้ถึงการเชื่อมต่อครั้งถัดไป บนวินโดวส์ เมตริกอินเทอร์เฟซที่ต่ำกว่าบนอะแดปเตอร์เสมือนทำให้ยังได้ลำดับความสำคัญ บนลินุกซ์ การดำเนินการแทนที่ครอบคลุมพรีฟิกซ์เดียว ทั้งสามเป็นวิธีเลี่ยง เพราะไคลเอนต์ที่ยืนยันเส้นทางของตนอีกครั้งจะยกเลิกมัน
เขียนการตรวจสอบเป็นสคริปต์แทนการเชื่อมต่อใหม่แบบไม่ดูอะไรตอนบูต สคริปต์เล็กที่พิมพ์เส้นทางของพรีฟิกซ์เครื่องเสมือนหลังทุกการเชื่อมต่อเปลี่ยนปริศนาให้เป็นบรรทัดในบันทึก
ถ้าโปรไฟล์เป็นอุโมงค์เต็ม ให้ขอเจ้าของเครือข่ายเรื่องอุโมงค์แบบแยกหรือข้อยกเว้นที่บันทึกไว้ การเพิ่มเส้นทางที่เลี่ยงนโยบายความปลอดภัยอย่างเงียบ ๆ ไม่ใช่การแก้ไข แต่เป็นปัญหาที่สองที่มาทีหลังพร้อมผู้ตรวจสอบ
ตรวจสอบการแก้ไขทั้งสองด้าน
ตรวจสอบสามเส้นทางหลังการเปลี่ยนแปลง คือโฮสต์ไปยังเครื่องเสมือน เครื่องเสมือนไปยังโฮสต์องค์กร และเครื่องเสมือนไปยังอินเทอร์เน็ต การแก้ไขที่คืนหนึ่งและพังอีกหนึ่งคือการเปลี่ยนการตั้งค่าที่ปลอมเป็นงานซ่อม บันทึกผลลัพธ์เดียวกับที่เก็บไว้ก่อนเปลี่ยนเพื่อให้การเปรียบเทียบเท่ากัน
บันทึกอินเทอร์เฟซ เมตริก และเส้นทางที่เปลี่ยน พร้อมเวลา เพื่อให้ครั้งถัดไปเป็นการค้นหาไม่ใช่การสร้างใหม่ บันทึกนั้นมีค่ามากกว่ากระทู้ตั๋วยาว
ip -4 route get 192.168.56.10
traceroute -n -m 4 10.20.0.15
curl -sS -o /dev/null -w '%{http_code}\n' https://example.comเมื่อโฮสต์ถึงเครื่องเสมือนอีกครั้งและเครื่องเสมือนถึง LAN คุณได้คืนเส้นทางที่เริ่มไว้ เมื่อทำงานได้เพียงอย่างเดียว ความผิดพลาดที่เหลืออยู่ในพื้นที่ของเจ้าของอีกฝ่าย และส่วนต่างบอกว่าพื้นที่ใด