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

ทั้งสองบทบาทเป็นอิสระจากกัน และทั้งสองตระกูลที่อยู่ก็เช่นกัน

การตอบบนที่อยู่ของตัวเองไม่ได้พิสูจน์อะไร

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

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

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

ตรวจแต่ละตระกูลที่อยู่แยกกัน

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

sysctl net.ipv4.ip_forward
sysctl -a --pattern 'net.ipv6.conf.(all|default).forwarding'
nft list ruleset | head -n 40

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

การส่งต่อเป็นหนึ่งในสี่ข้อกำหนด

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

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

ทดสอบจากไคลเอนต์ ไม่ใช่จากเกตเวย์

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

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

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

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