ฉันใช้นักเทียบท่ากับ macvlan ซึ่งแต่ละคอนเทนเนอร์ของฉันมีการเชื่อมต่อ L2 พร้อมที่อยู่ MAC และ IP ของตัวเอง ฉันต้องรับประกันด้วยว่าคอนเทนเนอร์เข้าถึงโฮสต์และในทางกลับกัน ฉันสามารถทำสิ่งนั้นได้ในขณะนี้โดยใช้ netplan และสคริปต์เพื่อลบบางเส้นทาง แต่ต้องการให้คุณช่วยเข้าใจว่าฉันสามารถทำได้โดยใช้ netplan
การกำหนดค่าของฉันคือสิ่งนี้:
ชุดสคริปต์เพื่อสร้างอินเทอร์เฟซ macvlan (ยังไม่รองรับบน netplan)
#! /ถัง/ทุบตี
#! ลิงค์ ip เพิ่มลิงค์ macvlan vlan10 ประเภทสะพานโหมด macvlan
อินเทอร์เฟซ vlan10 ถูกสร้างขึ้นด้วยการกำหนดค่า netplan
01-netcfg.yaml
เครือข่าย:
รุ่น: 2
เรนเดอร์: เครือข่าย
อีเธอร์เน็ต:
eno1:
dhcp4: ใช่
dhcp6: ใช่
ที่อยู่:
- aaaa:bbbb:cccc:1::11/64
vlans:
vlan10:
รหัส: 10
ลิงค์: eno1
dhcp4: ไม่
dhcp6: ไม่
ที่อยู่:
- 192.168.10.11/24
- aaaa:bbbb:cccc:10::11/64
สิ่งนี้ทำให้มั่นใจได้ว่าอินเทอร์เฟซ VLAN ที่สร้างขึ้นสำหรับนักเทียบท่านั้นถูกสร้างขึ้นและพร้อมใช้งาน
20-docker.yaml
เครือข่าย:
รุ่น: 2
เรนเดอร์: เครือข่าย
อีเธอร์เน็ต:
แมควาเลน:
dhcp4: ไม่
dhcp6: ไม่
ที่อยู่:
- 192.168.10.5/24
- aaaa:bbbb:cccc:10::5/64
ฉันยอมรับว่านี่อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการตั้งค่าโซลูชันที่ฉันต้องการ แต่วิธีนี้ใช้ได้ผล และด้วยวิธีนี้ฉันจึงหลีกเลี่ยงการสร้างสคริปต์เพื่อเรียกใช้เมื่อรีบูตโดยใช้ cron
ส่วนเส้นทาง
ตอนนี้ฉันได้สร้างอินเทอร์เฟซแล้ว เมื่อสร้างชุดเส้นทางขึ้นมาโดยอัตโนมัติ แม้ว่าฉันจะไม่ได้กำหนดก็ตาม เกตเวย์4 และ เกตเวย์6 คำสั่งและกำหนด netplat เพื่อละเว้นเส้นทางเริ่มต้นของ DHCP เส้นทางนี้สำหรับ IPv4 และ IPv6 จะถูกสร้างขึ้นโดยอัตโนมัติเพื่อหลีกเลี่ยงการเข้าถึงคอนเทนเนอร์ในเครือข่าย vlan10 เนื่องจากข้อจำกัดของไดรเวอร์เครือข่ายนักเทียบท่าโดยการออกแบบ
เส้นทาง IPv4 สำหรับอินเทอร์เฟซใหม่
192.168.10.0/24 dev vlan10 proto kernel scope link src 192.168.10.11
192.168.10.0/24 macvlan proto kernel ขอบเขตลิงค์ src 192.168.10.5
192.168.10.0/24 ผ่าน 192.168.10.5 macvlan proto static metric 100
192.168.10.0/24 ผ่าน 192.168.10.11 dev vlan10 proto static metric 150
เส้นทาง IPv6 สำหรับอินเทอร์เฟซใหม่
aaaa:bbbb:cccc:10::/64 dev vlan10 proto kernel metric 256 pref สื่อ
aaaa:bbbb:cccc:10::/64 dev macvlan proto kernel metric 256 pref สื่อ
เพื่อให้โซลูชันของฉันใช้งานได้ ฉันจำเป็นต้องลบด้วยตนเอง (หรือใช้สคริปต์ boot bash) เพื่อลบเส้นทางเคอร์เนลด้านบนสำหรับอุปกรณ์ vlan10 ใน IPv4 และ IPv6 เมื่อทำงานนั้น ฉันสามารถคืนค่าการสื่อสารระหว่างโฮสต์กับคอนเทนเนอร์ได้
มีวิธีปรับปรุงโซลูชันนี้และหลีกเลี่ยงการสร้างเส้นทางเหล่านั้น หรือมีคำสั่งให้เพิกเฉยต่อเส้นทางเฉพาะที่ฉันไม่ต้องการบนอินเทอร์เฟซนั้นเพื่อรับประกันว่าจะใช้โซลูชันของฉันใน netplan ได้หรือไม่
ขอขอบคุณสำหรับความเชี่ยวชาญและความพร้อมให้บริการของคุณ ขอขอบคุณ
** 20/10/2021 - แก้ไขหลังจากแสดงความคิดเห็นและทดสอบเพิ่มเติม**
หลังจากการทบทวน ทดสอบ และเรียนรู้เพิ่มเติม ฉันได้ดำเนินการเปลี่ยนแปลงต่อไปนี้ซึ่งได้แก้ปัญหาของฉันและอนุญาตให้โฮสต์ของฉันเข้าถึงคอนเทนเนอร์ภายใน แมคแวล
อินเตอร์เฟซ.
01-netcfg.yaml
เครือข่าย:
รุ่น: 2
เรนเดอร์: เครือข่าย
อีเธอร์เน็ต:
eno1:
dhcp4: ใช่
dhcp6: ใช่
ที่อยู่:
- aaaa:bbbb:cccc:dddd:192:168:1:11/64
vlans:
vlan10:
รหัส: 10
ลิงค์: eno1
dhcp4: ไม่
dhcp6: ไม่
ที่อยู่:
- 192.168.10.11/32
- aaaa:bbbb:cccc:10::11/128
ลิงค์ท้องถิ่น: []
เปลี่ยนซับเน็ตมาสก์ IPv4 และ IPv8 เป็น /32 และ /128 ตามลำดับ สิ่งนี้ได้สร้างกฎที่เหมาะสมและทำให้โฮสต์ของฉันกู้คืนการสื่อสารกับเครือข่ายคอนเทนเนอร์นักเทียบท่าของฉัน รวมถึง `link-local: []´ เพื่อหลีกเลี่ยงอินเทอร์เฟซนี้เพื่อสร้างลิงค์ IP ในเครื่องที่อาจรบกวน
20-docker.yaml
เครือข่าย:
รุ่น: 2
เรนเดอร์: เครือข่าย
อีเธอร์เน็ต:
แมควาเลน:
dhcp4: ไม่
dhcp6: ไม่
ที่อยู่:
- 192.168.10.5/24
- aaaa:bbbb:cccc:10::5/64
ด้วยการกำหนดค่านี้ ฉันสามารถคืนค่าการสื่อสารระหว่างโฮสต์และคอนเทนเนอร์สำหรับ IPv4 และ IPv6 และหลีกเลี่ยงสคริปต์ภายนอกเพื่อลบเส้นทางหรือประกาศเฉพาะ เส้นทาง:
และ นโยบายการกำหนดเส้นทาง:
คำสั่งใน netplan
หวังว่านี่จะช่วยผู้อื่นด้วยปัญหาที่คล้ายกัน ขอบคุณ