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

อินเทอร์เฟซ tun ไม่มีฮอปถัดไปรายไคลเอนต์ เคอร์เนลเห็นอินเทอร์เฟซเดียวที่มีเพื่อนหลายราย ดังนั้นการตัดสินใจว่าไคลเอนต์รายใดควรได้รับแพ็กเก็ตสำหรับ LAN ระยะไกลต้องทำภายในโปรเซส OpenVPN การตัดสินใจนั้นกำหนดค่าด้วย iroute และหากไม่มี แพ็กเก็ตก็ไม่มีที่ไป

เซิร์ฟเวอร์กำหนดเส้นทางตามไคลเอนต์ ไม่ใช่ตามอินเทอร์เฟซ

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

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

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

เขียนรายการ iroute ที่ระบุชื่อไคลเอนต์

iroute อยู่ในไฟล์กำหนดค่าที่เฉพาะเจาะจงไคลเอนต์ ไม่ใช่การกำหนดค่าหลักของเซิร์ฟเวอร์ ชี้เซิร์ฟเวอร์ไปยังไดเรกทอรีด้วยตัวเลือก client-config-dir จากนั้นสร้างไฟล์ที่ชื่อเป็นชื่อสามัญของใบรับรองไคลเอนต์และใส่คำนำหน้าไว้ข้างใน

สำหรับสาขาที่ LAN เป็น 10.20.0.0/24 และชื่อสามัญของใบรับรองเป็น branch-router ไฟล์ในเส้นทางนั้นมีบรรทัดเช่น iroute 10.20.0.0 255.255.255.0 การกำหนดค่าหลักต้องการเพียงตัวเลือกไดเรกทอรี คำนำหน้าอยู่กับไคลเอนต์

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

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

สร้างเส้นทางกลับในทั้งสองทิศทาง

การนำแพ็กเก็ตไปยัง LAN ระยะไกลเป็นงานครึ่งหนึ่ง ไคลเอนต์ต้องส่งทราฟฟิกของ LAN นั้นเข้าทันเนลด้วย ซึ่งโดยปกติทำได้โดยการดันเส้นทางไปยังไคลเอนต์ บรรทัดเช่น push "route 10.8.0.0 255.255.255.0" บอกไคลเอนต์ทุกตัวว่าต้องไปถึงเครือข่ายฝั่งเซิร์ฟเวอร์อย่างไร สำหรับสาขา เส้นทางที่เทียบเท่าจะชี้ไปยังทันเนลสำหรับทุกสิ่งที่ต้องไปถึงฝั่งเซิร์ฟเวอร์

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

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

ตรวจสอบการเข้าถึงด้วยโพรบที่ถูกต้อง

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

จากนั้นเฝ้าดูแพ็กเก็ต การดักจับบนอินเทอร์เฟซทันเนลแสดงว่าเซิร์ฟเวอร์ส่งไปทางไคลเอนต์หรือไม่ และการดักจับบนอินเทอร์เฟซ LAN แสดงว่าส่งต่อหรือไม่ หากอันแรกแสดงแพ็กเก็ตและอันที่สองไม่แสดงอะไร ปัญหาคือการส่งต่อหรือฟิลเตอร์ หากทั้งสองไม่แสดงอะไรเลย การค้นหาก็ล้มเหลวก่อนหน้านี้

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

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