ทำความเข้าใจเกี่ยวกับตัวเลือกการบังคับใช้นโยบายเครือข่ายด้วย Calico

ทำความเข้าใจเกี่ยวกับตัวเลือกการบังคับใช้นโยบายเครือข่ายด้วย Calico

ปลั๊กอินเครือข่าย Calico มอบนโยบายเครือข่ายที่หลากหลายพร้อมไวยากรณ์แบบรวมเพื่อปกป้องโฮสต์ฮาร์ดแวร์ เครื่องเสมือน และพ็อด นโยบายเหล่านี้สามารถนำไปใช้ภายในเนมสเปซหรือเป็นนโยบายเครือข่ายส่วนกลางที่ใช้กับ จุดสิ้นสุดของโฮสต์ (เพื่อปกป้องแอปพลิเคชันที่ทำงานบนโฮสต์โดยตรง - โฮสต์อาจเป็นเซิร์ฟเวอร์หรือเครื่องเสมือน) หรือ จุดสิ้นสุดภาระงาน (เพื่อปกป้องแอปพลิเคชันที่ทำงานในคอนเทนเนอร์หรือเครื่องเสมือนที่โฮสต์) นโยบาย Calico อนุญาตให้คุณใช้มาตรการรักษาความปลอดภัยในจุดต่างๆ ในเส้นทางของแพ็กเก็ตโดยใช้ตัวเลือกต่างๆ เช่น preDNAT, unraracked และ ApplyOnForward การทำความเข้าใจว่าตัวเลือกเหล่านี้ทำงานอย่างไรสามารถช่วยปรับปรุงความปลอดภัยและประสิทธิภาพของระบบโดยรวมของคุณได้ บทความนี้จะอธิบายสาระสำคัญของตัวเลือกนโยบาย Calico เหล่านี้ (preDNAT, unraracked และ ApplyOnForward) ที่นำไปใช้กับตำแหน่งข้อมูลโฮสต์ โดยเน้นที่สิ่งที่เกิดขึ้นในเส้นทางการประมวลผลแพ็กเก็ต (เครือข่าย iptabels)

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

ผ้าดิบ นโยบายเครือข่ายทั่วโลก ช่วยให้คุณใช้ชุดกฎการเข้าถึงตามป้ายกำกับ (กับกลุ่มโฮสต์และปริมาณงาน/พ็อด) สิ่งนี้มีประโยชน์มากหากคุณใช้ระบบที่ต่างกันร่วมกัน เช่น เครื่องเสมือน ระบบบนฮาร์ดแวร์โดยตรง หรือโครงสร้างพื้นฐานของ Kubernetes นอกจากนี้ คุณยังสามารถปกป้องคลัสเตอร์ (โหนด) ของคุณโดยใช้ชุดนโยบายที่ประกาศ และใช้นโยบายเครือข่ายกับการรับส่งข้อมูลขาเข้า (เช่น ผ่านบริการ NodePort หรือ IP ภายนอก)

ในระดับพื้นฐาน เมื่อ Calico เชื่อมต่อพ็อดเข้ากับเครือข่าย (ดูแผนภาพด้านล่าง) มันจะเชื่อมต่อกับโฮสต์โดยใช้อินเทอร์เฟซอีเทอร์เน็ตเสมือน (veth) การรับส่งข้อมูลที่ส่งโดยพ็อดมาถึงโฮสต์จากอินเทอร์เฟซเสมือนนี้ และได้รับการประมวลผลในลักษณะเดียวกับที่มาจากอินเทอร์เฟซเครือข่ายทางกายภาพ ตามค่าเริ่มต้น Calico จะตั้งชื่ออินเทอร์เฟซเหล่านี้ว่า caliXXX เนื่องจากการรับส่งข้อมูลมาผ่านอินเทอร์เฟซเสมือน มันจึงผ่าน iptables ราวกับว่าพ็อดอยู่ห่างออกไปเพียงก้าวเดียว ดังนั้นเมื่อมีการจราจรเข้า/ออกจากพ็อด มันจะถูกส่งต่อจากมุมมองของโฮสต์

บนโหนด Kubernetes ที่ใช้งาน Calico คุณสามารถแมปอินเทอร์เฟซเสมือน (veth) กับปริมาณงานได้ดังนี้ ในตัวอย่างด้านล่าง คุณจะเห็นว่า veth#10 (calic1cbf1ca0f8) เชื่อมต่อกับ cnx-manager-* ในเนมสเปซการตรวจสอบ calico

[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
...

[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m                            ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
...

ทำความเข้าใจเกี่ยวกับตัวเลือกการบังคับใช้นโยบายเครือข่ายด้วย Calico

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

แผนภาพด้านล่างแสดงเครือข่ายที่เกี่ยวข้องกับการประมวลผลแพ็กเก็ตใน iptables (หรือระบบย่อย netfilter) เมื่อแพ็กเก็ตมาถึงผ่านอินเทอร์เฟซเครือข่าย แพ็กเก็ตจะผ่านห่วงโซ่ PREROUTING ก่อน จากนั้นจะมีการตัดสินใจเกี่ยวกับการกำหนดเส้นทาง และจากสิ่งนี้ แพ็กเก็ตจะส่งผ่าน INPUT (กำหนดเส้นทางไปยังกระบวนการโฮสต์) หรือ FORWARD (กำหนดเส้นทางไปยังพ็อดหรือโหนดอื่นบนเครือข่าย) จากกระบวนการโลคัล แพ็กเก็ตจะผ่าน OUTPUT จากนั้นต่อด้วย POSTROUTING chain ก่อนที่จะถูกส่งลงสายเคเบิล

โปรดทราบว่าพ็อดยังเป็นเอนทิตีภายนอก (เชื่อมต่อกับ veth) ในแง่ของการประมวลผล iptables สรุป:

  • การรับส่งข้อมูลที่ส่งต่อ (nat, กำหนดเส้นทางหรือไปยัง/จากพ็อด) ผ่านเครือข่าย PREROUTING - FORWARD - POSTROUTING
  • การรับส่งข้อมูลไปยังกระบวนการโฮสต์ภายในเครื่องจะผ่านห่วงโซ่ PREROUTING - INPUT
  • การรับส่งข้อมูลจากกระบวนการโฮสต์ในพื้นที่ต้องผ่านห่วงโซ่เอาต์พุต - POSTROUTING

ทำความเข้าใจเกี่ยวกับตัวเลือกการบังคับใช้นโยบายเครือข่ายด้วย Calico

Calico มีตัวเลือกนโยบายที่ช่วยให้คุณสามารถใช้นโยบายกับเครือข่ายทั้งหมดได้ ด้วยเหตุนี้ เรามาดูตัวเลือกการกำหนดค่านโยบายต่างๆ ที่มีใน Calico กัน ตัวเลขในรายการตัวเลือกด้านล่างตรงกับตัวเลขในแผนภาพด้านบน

  1. นโยบายปลายทางภาระงาน (พ็อด)
  2. นโยบายปลายทางของโฮสต์
  3. ตัวเลือก ApplyOnForward
  4. นโยบายของเพรดีแนต
  5. นโยบายที่ไม่ได้ติดตาม

เริ่มต้นด้วยการดูวิธีการใช้นโยบายกับตำแหน่งข้อมูลปริมาณงาน (พ็อด Kubernetes หรือ OpenStack VM) จากนั้นดูตัวเลือกนโยบายสำหรับตำแหน่งข้อมูลของโฮสต์

จุดสิ้นสุดภาระงาน

นโยบายจุดสิ้นสุดภาระงาน (1)

นี่คือตัวเลือกในการปกป้องพ็อด kubernetes Calico รองรับการทำงานกับ Kubernetes NetworkPolicy แต่ยังให้นโยบายเพิ่มเติม - Calico NetworkPolicy และ GlobalNetworkPolicy Calico สร้างห่วงโซ่สำหรับแต่ละพ็อด (ปริมาณงาน) และ hooks ในห่วงโซ่ INPUT และ OUTPUT สำหรับภาระงานไปยังตารางตัวกรองของห่วงโซ่ FORWARD

จุดสิ้นสุดของโฮสต์

นโยบายปลายทางของโฮสต์ (2)

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

นโยบายการนำไปใช้ล่วงหน้า (3)

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

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

นโยบายเพรดีแนต (4)

ใน Kubernetes พอร์ตเอนทิตีบริการสามารถเปิดเผยภายนอกได้โดยใช้ตัวเลือก NodePorts หรือทางเลือก (เมื่อใช้ Calico) โดยการโฆษณาโดยใช้ตัวเลือก IP ของคลัสเตอร์หรือ IP ภายนอก Kube-proxy จะปรับสมดุลการรับส่งข้อมูลขาเข้าที่เชื่อมโยงกับบริการไปยังพ็อดของบริการที่เกี่ยวข้องโดยใช้ DNAT จากนี้ คุณจะบังคับใช้นโยบายสำหรับการรับส่งข้อมูลที่มาจาก NodePorts อย่างไร เพื่อให้แน่ใจว่านโยบายเหล่านี้จะถูกนำไปใช้ก่อนที่ DNAT จะประมวลผลการรับส่งข้อมูล (ซึ่งเป็นการแมประหว่างโฮสต์:พอร์ตและบริการที่เกี่ยวข้อง) Calico จัดเตรียมพารามิเตอร์สำหรับ globalNetworkPolicy ที่เรียกว่า "preDNAT: true"

เมื่อเปิดใช้งาน pre-DNAT นโยบายเหล่านี้จะถูกนำมาใช้ใน (4) ในแผนภาพ - ในตาราง Mangle ของห่วงโซ่ PREROUTING - ทันทีก่อน DNAT ที่นี่ไม่ได้ปฏิบัติตามลำดับของนโยบายตามปกติ เนื่องจากการใช้นโยบายเหล่านี้เกิดขึ้นเร็วกว่ามากในเส้นทางการประมวลผลการรับส่งข้อมูล อย่างไรก็ตาม นโยบายของ preDNAT เคารพลำดับการสมัครระหว่างกัน

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

นโยบายที่ไม่ได้ติดตาม (5)

เครือข่ายและแอปพลิเคชันอาจมีพฤติกรรมที่แตกต่างกันมาก ในบางกรณีร้ายแรง แอปพลิเคชันอาจสร้างการเชื่อมต่อที่มีอายุการใช้งานสั้นจำนวนมาก ซึ่งอาจทำให้ conntrack (ส่วนประกอบหลักของสแตกเครือข่าย Linux) หน่วยความจำไม่เพียงพอ โดยปกติแล้ว หากต้องการรันแอปพลิเคชันประเภทนี้บน Linux คุณจะต้องกำหนดค่าหรือปิดใช้งาน conntrack ด้วยตนเอง หรือเขียนกฎ iptables เพื่อเลี่ยงผ่าน conntrack นโยบายที่ไม่ได้ติดตามใน Calico เป็นตัวเลือกที่ง่ายกว่าและมีประสิทธิภาพมากกว่า หากคุณต้องการประมวลผลการเชื่อมต่อโดยเร็วที่สุด เช่น ถ้าคุณใช้ Massive memcache หรือเป็นมาตรการป้องกันเพิ่มเติม DDOS.

อ่านนี่ โพสต์บล็อก (หรือ การแปลของเรา) สำหรับข้อมูลเพิ่มเติม รวมถึงการทดสอบประสิทธิภาพโดยใช้นโยบายที่ไม่ได้ติดตาม

เมื่อคุณตั้งค่าตัวเลือก "doNotTrack: true" ใน Calico globalNetworkPolicy ตัวเลือกดังกล่าวจะกลายเป็นนโยบาย **ไม่ได้ติดตาม** และจะถูกนำไปใช้ตั้งแต่เนิ่นๆ ในไปป์ไลน์การประมวลผลแพ็กเก็ต Linux เมื่อพิจารณาจากแผนภาพด้านบน นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้ในห่วงโซ่ PREROUTING และ OUTPUT ในตารางดิบก่อนที่จะเริ่มการติดตามการเชื่อมต่อ (conntrack) เมื่อแพ็คเก็ตได้รับอนุญาตตามนโยบายที่ไม่ได้ติดตาม จะมีการทำเครื่องหมายให้ปิดใช้งานการติดตามการเชื่อมต่อสำหรับแพ็คเก็ตนั้น มันหมายความว่า:

  • นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้เป็นรายแพ็กเก็ต ไม่มีแนวคิดเรื่องการเชื่อมต่อ (หรือการไหล) การขาดการเชื่อมต่อมีผลกระทบที่สำคัญหลายประการ:
  • หากคุณต้องการอนุญาตทั้งการรับส่งข้อมูลคำขอและการตอบกลับ คุณต้องมีกฎสำหรับทั้งขาเข้าและขาออก (เนื่องจากโดยทั่วไปแล้ว Calico จะใช้ conntrack เพื่อทำเครื่องหมายการรับส่งข้อมูลการตอบกลับว่าได้รับอนุญาต)
  • นโยบายที่ไม่ได้ติดตามใช้ไม่ได้กับภาระงาน (พ็อดของ Kubernetes) เนื่องจากในกรณีนี้ ไม่มีทางติดตามการเชื่อมต่อขาออกจากพ็อดได้
  • NAT ทำงานไม่ถูกต้องกับแพ็กเก็ตที่ไม่ได้ติดตาม (เนื่องจากเคอร์เนลเก็บการแมป NAT ไว้ใน conntrack)
  • เมื่อผ่านกฎ "อนุญาตทั้งหมด" ในนโยบายที่ไม่ได้ติดตาม แพ็กเก็ตทั้งหมดจะถูกทำเครื่องหมายว่าไม่ได้ติดตาม นี่ไม่ใช่สิ่งที่คุณต้องการเกือบทุกครั้ง ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องเลือกอย่างมากเกี่ยวกับแพ็กเก็ตที่อนุญาตโดยนโยบายที่ไม่ได้ติดตาม (และอนุญาตให้การรับส่งข้อมูลส่วนใหญ่ผ่านนโยบายการติดตามปกติ)
  • นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้ที่จุดเริ่มต้นของไปป์ไลน์การประมวลผลแพ็กเก็ต นี่เป็นสิ่งสำคัญมากที่ต้องเข้าใจเมื่อสร้างนโยบาย Calico คุณสามารถมีนโยบายพ็อดที่มี order:1 และนโยบายที่ไม่ได้ติดตามด้วย order:1000 มันจะไม่สำคัญ นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้ก่อนนโยบายสำหรับพ็อด นโยบายที่ไม่ได้ติดตามจะเคารพคำสั่งดำเนินการระหว่างกันเท่านั้น

เนื่องจากวัตถุประสงค์ประการหนึ่งของนโยบาย doNotTrack คือการบังคับใช้นโยบายตั้งแต่เนิ่นๆ ในไปป์ไลน์การประมวลผลแพ็กเก็ต Linux Calico จึงกำหนดให้จำเป็นต้องระบุตัวเลือก ApplyOnForward เมื่อใช้ doNotTrack อ้างถึงแผนภาพการประมวลผลแพ็กเก็ต โปรดทราบว่านโยบายที่ไม่ได้ติดตาม (5) จะถูกนำไปใช้ก่อนการตัดสินใจกำหนดเส้นทางใดๆ การรับส่งข้อมูลสามารถนำไปสู่กระบวนการโฮสต์หรือส่งต่อไปยังพ็อดหรือโหนดอื่นก็ได้

ผลของการ

เราพิจารณาตัวเลือกนโยบายต่างๆ (ตำแหน่งข้อมูลโฮสต์, ApplyOnForward, preDNAT และ Untracked) ใน Calico และวิธีการนำไปใช้ตามเส้นทางการประมวลผลแพ็กเก็ต การทำความเข้าใจวิธีการทำงานจะช่วยในการพัฒนานโยบายที่มีประสิทธิผลและปลอดภัย ด้วย Calico คุณสามารถใช้นโยบายเครือข่ายทั่วโลกที่ใช้กับป้ายกำกับ (กลุ่มของโหนดและพ็อด) และใช้นโยบายกับพารามิเตอร์ต่างๆ ช่วยให้ผู้เชี่ยวชาญด้านความปลอดภัยและการออกแบบเครือข่ายสามารถปกป้อง “ทุกสิ่ง” (ประเภทอุปกรณ์ปลายทาง) ได้อย่างสะดวกในคราวเดียวโดยใช้ภาษานโยบายเดียวกับนโยบาย Calico

รับทราบ: ฉันอยากจะขอบคุณ ฌอน แครมป์ตัน и อเล็กซา พอลลิตต้า เพื่อการทบทวนและข้อมูลอันทรงคุณค่า

ที่มา: will.com

เพิ่มความคิดเห็น