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

แฟล็กเปลี่ยนอะไรจริง ๆ

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

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

จับคู่แต่ละข้อผิดพลาดกับเงื่อนไขเบื้องต้นหนึ่งข้อ

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

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

ตรวจสอบข้อกำหนด ไม่ใช่อาการ

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

ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun image:tag
ip -br link show type tun

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

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

บันทึกการให้สิทธิ์ที่แคบที่สุดที่ใช้งานได้

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

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

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