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

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

สองเส้นทางที่แพ็กเก็ตของเพียร์เดินได้

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

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

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

เมื่อตัวนับไม่ขยับเลย

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

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

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

การเลือกขอบเขตที่กรองได้

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

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

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

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

การทดสอบการแยกกันแทนการเชื่อใจกฎ

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

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

การแยกกันคือผลที่สังเกตได้ที่ขอบเขตซึ่งรับทราฟฟิกจริง กฎ DROP ที่ใดที่หนึ่งบนโฮสต์ไม่ใช่หลักฐาน แต่การเชื่อมต่อที่ล้มเหลวบวกกับตัวนับที่ขยับบนกฎที่เป็นสาเหตุคือหลักฐาน

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