ฉันมีการตั้งค่าเครือข่ายดังต่อไปนี้
ฉันใช้โฮสต์ที่มี 2 vms vm แต่ละอันกำลังรันเดเบียนด้วย cri-o รันคอนเทนเนอร์บางตัว คอนเทนเนอร์แต่ละรายการมีที่อยู่ IP บนซับเน็ต 10.200.0.0/24 แขกคนหนึ่งใช้ ips บนซับเน็ต 10.200.0.0.0/16 และคนอื่นๆ ใช้ ips บนซับเน็ต 10.200.1.0/16
โฮสต์มีส่วนต่อประสานบริดจ์ br0
. โฮสต์ eth0
อินเทอร์เฟซเชื่อมโยงกับ br0
และ vms NIC ก็เป็นส่วนหนึ่งของบริดจ์นั้นเช่นกัน ดังนั้นพวกเขาจึงถูกกำหนด ips บนเครือข่ายย่อย lan ของฉัน (192.168.1.0/24)
โฮสต์มีค่า sysctl ต่อไปนี้ ดังนั้น iptables จึงไม่ควรส่งผลกระทบต่อทราฟฟิกของบริดจ์
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
ฉันต้องการให้คอนเทนเนอร์สามารถเชื่อมต่อกันได้ (10.200.0.4 ถึง/จาก 10.200.1.2)สิ่งนี้ใช้ได้ผลหากฉันตั้งค่าเส้นทางแบบกำหนดเองสำหรับแขกแต่ละคน:
# แขกรับเชิญ 01
เส้นทาง ip เพิ่ม 10.200.1.0/24 ผ่าน 192.168.1.243
#บนแขก02
เส้นทาง ip เพิ่ม 10.200.0.0/24 ผ่าน 192.168.1.242
จากนั้นฉันสามารถ ping คอนเทนเนอร์อื่น ๆ จากแต่ละคอนเทนเนอร์ได้ แต่ฉันไม่ต้องการตั้งค่าเส้นทางคงที่สำหรับแขกแต่ละคน เนื่องจากฉันจะต้องทำอย่างนั้นสำหรับแขกแต่ละคนทุกครั้งที่มีการเปลี่ยนแปลง
ถ้าฉันลบเส้นทางเหล่านี้ และเพิ่มเส้นทางคงที่ไปยังโฮสต์ของฉัน ฉันสามารถ ping คอนเทนเนอร์ทั้งหมดจากโฮสต์นั้น:
เส้นทาง ip เพิ่ม 10.200.0.0/24 ผ่าน 192.168.1.242
เส้นทาง ip เพิ่ม 10.200.1.0/24 ผ่าน 192.168.1.243
# ตารางเส้นทางของผู้เข้าร่วมยังคงเป็นค่าเริ่มต้นด้วยเส้นทางเริ่มต้นผ่าน br0/eth0
# สำหรับ 192.168.1.243
เริ่มต้นผ่าน 192.168.1.1 dev enp1s0
10.200.1.0/24 dev cni0 ลิงก์ขอบเขตเคอร์เนลโปรโต src 10.200.1.1
192.168.1.0/24 dev enp1s0 โปรโตเคอร์เนลขอบเขตลิงก์ src 192.168.1.243
แต่สิ่งสำคัญคือคอนเทนเนอร์ไม่สามารถเข้าถึงได้ ฉันคาดว่าการรับส่งข้อมูลจะเปลี่ยนจากคอนเทนเนอร์เป็น br0 ถึง eth0 ซึ่งจะส่งต่อการรับส่งข้อมูลนั้นกลับไปที่ br0 ถึง .242 หรือ .243 ตามที่กำหนดค่าด้วย เพิ่มเส้นทาง ip
.
ฉันเห็นได้ด้วย tcpdump ว่าทราฟฟิกเข้าถึง br0 และ eth0 บนโฮสต์ แต่ไม่ได้ส่งต่อกลับไปที่ br0 กำลังกลับไปที่เราเตอร์ของฉันซึ่งไม่รู้วิธีกำหนดเส้นทาง 10.200.0.0/16 หากฉันเพิ่มเส้นทางแบบสแตติกไปยังเราเตอร์ 10.200.0.0/16 ผ่าน 192.168.103
สิ่งนี้ใช้งานได้จริงเนื่องจากโฮสต์ของฉัน (.103) รู้วิธีส่งต่อทราฟฟิกนี้ไปยัง br0 และไปที่ .242 หรือ .243 ตามการตั้งค่าเส้นทางคงที่ด้วยตนเอง
ดังนั้น ดูเหมือนว่าการจราจรจะถูกกำหนดเส้นทางอย่างถูกต้องเมื่อมาจากภายนอก eth0/br0 แต่ไม่ใช่เมื่อมาจากภายในของแขก ฉันเข้าใจว่าการเชื่อมโยงใช้งานได้บน L2 ดังนั้นการรับส่งข้อมูลจึงจำเป็นต้องกำหนดเส้นทางบน L3 ที่ใดที่หนึ่ง แต่ทำไมการส่งต่อจึงถูกต้องเมื่อเริ่มต้นจากภายนอกผู้เยี่ยมชม แต่ไม่ใช่เมื่อมาจากภายในผู้เยี่ยมชม