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

การทิ้งเกิดขึ้นก่อนที่สิ่งใดจะอ่านแพ็กเก็ต

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

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

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

พิสูจน์โหมดที่บังคับใช้ก่อนแตะ sysctl ใด ๆ

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

tcpdump -ni tun0 icmp and host 192.168.80.25
ip route get 192.168.80.25
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.tun0.rp_filter

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

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

แต่ละโหมดของ rp_filter ยอมรับอะไรจริง ๆ

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

ValueNameAcceptsStill rejects
0offany source at allnothing on this check
1stricta source routed back out the arrival interfacea source whose route points elsewhere
2loosea source with any route in the tablea source with no route at all

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

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

เลือกการเปลี่ยนแปลงที่เล็กที่สุดซึ่งขจัดความกำกวม

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

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

ไม่ว่าคุณจะเลือกเส้นทางใด ให้บันทึกไว้ใน sysctl drop-in ไม่ใช่ในคำสั่งที่ใช้งานอยู่ ตั้งค่าคีย์ all และ default ไว้ด้วยกัน เพื่อให้การเชื่อมต่อใหม่ไม่สามารถคืนโหมดเข้มงวดอย่างเงียบ ๆ

# /etc/sysctl.d/99-rp-filter.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
sysctl --system

โหมดหลวมยอมสละอะไร และที่ใด

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

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

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

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