ที่อยู่ทันเนลสองที่อยู่บนบอร์ดเล็ก ๆ ดูเหมือนความผิดพลาด และปฏิกิริยาคือลบหนึ่งอัน ปฏิกิริยานั้นทำลายสิ่งที่มันควรจัดระเบียบ โฮสต์ที่พาสองฮ็อปเก็บที่อยู่หนึ่งที่อยู่ต่อการเชื่อมต่อ และแต่ละที่อยู่ถูกเลือกโดยเส้นทางที่ต่างกัน คำถามที่คุ้มค่าจะถามคือเส้นทางใดเลือกตัวพาใดให้ปลายทางใด ไม่ใช่มีที่อยู่กี่ที่อยู่

สามปลายทางที่ต้องการตัวพาต่างกัน

ห่วงโซ่สองฮ็อปคือสามชั้นของปลายทางที่ซ้อนกัน และแต่ละชั้นถูกพาโดยการเชื่อมต่อที่ต่างกัน ต้องเข้าถึงเพียร์ชั้นนอกผ่านลิงก์กายภาพ ต้องเข้าถึงเพียร์ชั้นในผ่านทันเนลชั้นนอก ต้องเข้าถึงปลายทางของแอปพลิเคชันที่ถูกคลุมผ่านทันเนลชั้นใน ซึ่งการขนส่งของมันเองถูกพาโดยชั้นนอก

Destination classView that names the carrierCommand that proves itSymptom when the wrong carrier wins
Outer peer, 198.51.100.10the main table, by destinationip route get 198.51.100.10the outer handshake never completes
Inner peer, 203.0.113.7the main table once the outer tunnel is upip route get 203.0.113.7the inner handshake leaves over the physical link
Application destination, 172.30.9.1the table the inner client's traffic is selected intoip route get 172.30.9.1 from 10.8.0.2the exit address looks right and the traffic never crossed the outer hop
Parallel tunnels, one per source groupone policy per group, not the main tableip rule show beside a marked test connectionboth tunnels are up and one steals the other's traffic

เติมแถวด้วยที่อยู่จริงของผู้อ่านก่อนแตะเส้นทาง เพราะตารางมีประโยชน์ก็ต่อเมื่อมันเป็นรูปธรรม ห่วงโซ่ที่ทำงานได้ตอบสนองทั้งสี่แถวพร้อมกัน และห่วงโซ่ที่ทำงานได้ครึ่งหนึ่งมักตอบสนองหนึ่งในนั้นด้วยตัวพาที่ผิด การอ่านแถวผิดว่าเป็นความล้มเหลวนั้นเองที่เปลี่ยนปัญหาการกำหนดเส้นทางให้กลายเป็นงานแก้ไขทั้งบ่าย

ที่อยู่มีบทบาท ไม่ใช่จำนวน

ลินุกซ์อนุญาตหลายที่อยู่บนอินเทอร์เฟซเดียวและหลายทันเนลบนโฮสต์เดียว จำนวนจึงไม่ได้บอกอะไรเกี่ยวกับความถูกต้อง สิ่งที่สำคัญคือที่อยู่ใดเป็นของการเชื่อมต่อใด และเส้นทางสำหรับเพียร์ที่กำหนดเลือกการเชื่อมต่อที่คุณตั้งใจหรือไม่ สามมุมมองตอบเรื่องนี้จากสามทิศทาง และควรอ่านตามลำดับเดิมทุกครั้ง

รายการที่อยู่แสดงว่ามีอะไรและส่วนเชื่อมต่อใดเป็นเจ้าของ ตารางเส้นทางตอบคำถามเรื่องตัวพาสำหรับการรับส่งปกติไปยังปลายทาง มุมมองนโยบายตอบอีกครั้งสำหรับการรับส่งที่เลือกตามต้นทางหรือเครื่องหมาย ซึ่งเป็นการจัดวางปกติเมื่อลูกค้าสองรายแชร์โฮสต์เดียว

ip -4 addr show
ip -4 route show table all
ip rule show

การลบที่อยู่เพราะรายการดูยาวอาจเอาเส้นทางบางส่วนออก และการลบเส้นทางเพราะดูซ้ำซ้อนก็ทำเช่นเดียวกันอย่างเงียบกว่า ทั้งสองไม่สร้างข้อผิดพลาด เพียร์เพียงหยุดตอบบนเส้นทางที่คุณตั้งใจในขณะที่ยังเข้าถึงได้ทางอื่น แอปพลิเคชันที่รายงานที่อยู่ทางออกของเพียร์ชั้นในไม่ได้พิสูจน์ว่าการรับส่งข้ามทันเนลชั้นนอก เนื่องจากการเข้าถึงโดยตรงให้การสังเกตเดียวกัน ช่องว่างระหว่างการสังเกตกับหลักฐานนี้เองคือเหตุผลที่ตรวจตัวพาที่ชั้นการกำหนดเส้นทาง

ลำดับการเปิดใช้งานชนะการรอแบบตายตัว

ถ้าลูกค้าชั้นในขึ้นกับที่อยู่หรือเส้นทางที่ลูกค้าชั้นนอกจัดหา การเปิดใช้งานต้องรอทรัพยากรนั้นไม่ใช่รอเวลา การรอแบบตายตัวทำงานจนถึงวันที่ทันเนลชั้นนอกช้า แล้วมันก็ล้มเหลวเป็นระยะในแบบที่ไม่มีใครทำซ้ำได้ ลำดับที่อิงการพึ่งพาจะเอาการเดาออกและไม่เสียอะไรเลยนอกจากการอธิบายการพึ่งพาหนึ่งครั้ง ชื่ออินเทอร์เฟซก็ไม่ใช่กลไกลำดับเช่นกัน

เคอร์เนลให้ชื่อเช่น tun0 และ tun1 ตามลำดับการสร้าง และลำดับนั้นอาจเปลี่ยนระหว่างการรีบูตหรือการเชื่อมต่อใหม่ ผูกการกำหนดค่ากับตัวตนที่เครื่องมือจัดหา หรือกับชื่อที่คุณกำหนดอย่างตั้งใจ ชื่อที่คุณเลือกคือสัญญา ชื่อที่เคอร์เนลเลือกคือความบังเอิญ

เก็บการขนส่งของแต่ละลูกค้าไว้นอกเส้นทางแอปพลิเคชันของอีกราย และแม่นยำเกี่ยวกับสิ่งที่ ตัวเลือกการกำหนดเส้นทางของ OpenVPN 2.6 สัญญาไว้จริง ๆ กลไกการเปลี่ยนเส้นทางเริ่มต้นที่มีเอกสารกำกับทำให้ลูกค้ายังเข้าถึงเพียร์ระยะไกลของตัวเองผ่านเกตเวย์ที่มีอยู่แล้ว ซึ่งตัดวงจรการเรียกซ้ำหนึ่งวง มันไม่ได้เปลี่ยนลูกค้ารายหนึ่งเป็นตัวพาของอีกราย ส่วนที่เหลือของห่วงโซ่จึงยังเป็นการออกแบบของคุณ เมื่อใดที่ห่วงโซ่ต้องการนโยบายแทนเส้นทาง ให้เขียนกฎต้นทางหรือเครื่องหมายที่ชัดเจนและทดสอบกับการรับส่งที่มันควรตรงกัน

เกิดอะไรขึ้นเมื่อฮ็อปชั้นนอกตาย

ก่อนที่ห่วงโซ่จะถูกนับว่าสมบูรณ์ ตัดสินใจว่าเกิดอะไรขึ้นเมื่อฮ็อปชั้นนอกหายไป การขนส่งของลูกค้าชั้นในตายไปด้วย และก้าวต่อไปเป็นคำถามเชิงนโยบายไม่ใช่เชิงเทคนิค ล้มเหลว ลองใหม่ หรือเชื่อมต่อใหม่โดยตรงผ่านลิงก์กายภาพ ผลลัพธ์ที่สามคือสิ่งที่ควรคิด มันเปลี่ยนการออกแบบสองฮ็อปเป็นการออกแบบหนึ่งฮ็อปอย่างเงียบ ๆ ในขณะที่ผู้ใช้เชื่อว่าความคุ้มคอยังสมบูรณ์

ถ้าสองฮ็อปเป็นบังคับ ลูกค้าชั้นในต้องไม่สามารถสร้างเส้นทางตรงได้เมื่อชั้นนอกหายไป และวิธีรู้คือทำให้ฮ็อปชั้นนอกขาดแล้วดูว่าชั้นในทำอะไร แผนสำรองที่อนุมัติแล้วเป็นคำตอบที่ชอบด้วยกฎหมาย แต่ต้องเขียน ทดสอบ และสื่อสาร แผนสำรองที่ไม่มีใครบันทึกไว้แยกจากการรั่วไหลในการทบทวนเหตุการณ์ไม่ได้

DNS และตระกูลที่อยู่อีกตระกูลเป็นส่วนหนึ่งของการตัดสินใจเดียวกัน การค้นหาที่สร้างขึ้นในเครื่องปฏิบัติตามนโยบายของโฮสต์เองไม่ใช่นโยบายของลูกค้าที่ส่งต่อ ตัวแก้ปัญหาที่ทำงานกับการรับส่งที่ส่งต่อจึงอาจไม่ใช่ตัวที่โฮสต์เองใช้

ยอมรับแต่ละชั้นตามลำดับที่คุณสร้างมัน

ทดสอบตามลำดับที่ห่วงโซ่ถูกสร้าง ขั้นแรกทันเนลชั้นนอกลำพัง จากนั้นการขนส่งของลูกค้าชั้นในผ่านทันเนลชั้นนอก จากนั้นแอปพลิเคชันผ่านทันเนลชั้นใน การยอมรับแต่ละครั้งต้องเป็นการเชื่อมต่อใหม่ไม่ใช่หน้าที่เปิดอยู่แล้ว จากนั้นทำให้แต่ละชั้นขาดและกู้คืนแยกกันและสังเกตว่าชั้นถัดไปทำอะไร

ผลของแผนสำรองคือการสังเกตที่มีค่าที่สุดในที่นี้ และเป็นสิ่งที่หน้า IP สาธารณะไม่เคยแสดง บันทึกเส้นทางของเพียร์ ที่อยู่ที่พวกมันใช้ และผลลัพธ์นั้นไว้ข้างการกำหนดค่า เพราะเส้นทางที่มีความสุขไม่ใช่ส่วนที่ถูกตั้งคำถามในภายหลัง

บทความที่เกี่ยวข้อง