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

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

แฟล็กปิดอะไรเมื่อเชื่อมต่อ

ไคลเอนต์ OpenVPN ที่ดึงข้อมูลมักได้รับชุดจากเซิร์ฟเวอร์หลังการยืนยันตัวตน: เส้นทาง การเปลี่ยนเส้นทางเกตเวย์เริ่มต้น เซิร์ฟเวอร์ DNS และคำสั่งปรับแต่งเล็กน้อย เมื่อ route-nopull มีผล ไคลเอนต์ยังคงยอมรับเซสชัน ยังตรวจสอบใบรับรอง ยังเจรจาเรื่องไซเฟอร์และ keepalive และยังยกอินเทอร์เฟซขึ้น สิ่งที่มันทิ้งคือการนำบรรทัด route ที่ถูกผลักมาและบรรทัด dhcp-option ที่ถูกผลักมาไปใช้ รวมถึง DNS ด้วย

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

ทำไมอุโมงค์ที่ยังมีชีวิตจึงยังกำหนดเส้นทางอะไรไม่ได้

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

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

ip addr show tun0
ip route show dev tun0
ip route get 10.20.5.10

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

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

เลือกระหว่างแฟล็กกับตัวกรองคำนำหน้า

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

SettingWhat the client keepsReasonable when
no optionevery pushed route and DHCP entrythe server's view of the network is correct
route-nopullthe session, none of the pushed routing or DNSyou will write the full local policy yourself
pull-filtereverything except lines matching your prefixesthe push is nearly right and one or two lines are wrong

pull-filter เป็นตัวจับคู่คำนำหน้าที่มีสามคำกริยา จึงยอมรับตระกูลของบรรทัดได้ เพิกเฉยอย่างเงียบ ๆ หรือปฏิเสธการเชื่อมต่อทั้งหมดเมื่อมีคำนำหน้าปรากฏ พฤติกรรมสุดท้ายคือสิ่งที่ควรรู้: กฎการปฏิเสธเปลี่ยนความขัดแย้งเชิงนโยบายให้เป็นแฮนด์เชกที่ล้มเหลวแทนที่จะเป็นการละเว้นอย่างเงียบ คู่มือ OpenVPN 2.6 แสดงรายการคำนำหน้าที่รับได้และความหมายที่แน่นอนของแต่ละคำกริยา

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

เพิ่มเส้นทางและตัวแปลงชื่อด้วยมือ

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

route-nopull
route 10.20.0.0 255.255.0.0
dhcp-option DNS 10.20.0.53

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

resolvectl dns tun0 10.20.0.53
resolvectl domain tun0 ~corp.example.com

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

ตรวจสอบผลลัพธ์: ที่อยู่ ชื่อ และเส้นทางภายนอก

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

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

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

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