Score:0

ไม่สามารถเชื่อมโยงเนมสเปซเครือข่ายมากกว่าหนึ่งรายการเข้าด้วยกัน

ธง de

คำชี้แจงปัญหา

ด้วยการกำหนดค่าด้านล่าง คู่ veth จะถูกสร้างขึ้นระหว่างเนมสเปซสุทธิเริ่มต้น/หลักและ netns ที่เรียกว่า ns1.

การกำหนดค่ายังสร้างคู่ veth ที่สอง: veth2 อยู่ใน netns ns1 และ veth3 อยู่ใน netns ns2นี้เข้าร่วม ns1 ถึง ns2 สร้างห่วงโซ่: เริ่มต้น netns-veth0 <-> veth1-ns1-veth2 <-> veth3-ns2.

ลิงค์ sudo ip เพิ่ม veth0 ประเภท veth ชื่อเพียร์ veth1
sudo ip -6 addr เพิ่ม CCFF::0/127 เพียร์ CCFF::1/127 dev veth0
ลิงก์ sudo ip ตั้งค่า dev veth0

sudo ip netns เพิ่ม ns1
sudo ip link ตั้งค่า veth1 netns ns1
sudo ip -n ns1 -6 addr เพิ่ม CCFF::1/127 เพียร์ CCFF::0/127 dev veth1
ลิงค์ sudo ip -n ns1 ตั้งค่า dev veth1
เส้นทาง sudo ip -n ns1 -6 เพิ่มค่าเริ่มต้นผ่าน CCFF::0

ลิงค์ sudo ip เพิ่ม veth2 ประเภท veth ชื่อเพียร์ veth3
sudo ip link ตั้งค่า veth2 netns ns1
sudo ip -n ns1 -6 addr เพิ่ม CCFF::2/127 เพียร์ CCFF::3/127 dev veth2
ลิงก์ sudo ip -n ns1 ตั้งค่า dev veth2
sudo ip -n ns1 -6 เส้นทางเพิ่ม CCFF::/64 ผ่าน CCFF::3

sudo ip netns เพิ่ม ns2
ลิงก์ sudo ip ตั้งค่า veth3 netns ns2
sudo ip -n ns2 -6 addr เพิ่ม CCFF::3/127 เพียร์ CCFF::2/127 dev veth3
ลิงค์ sudo ip -n ns2 ตั้งค่า dev veth3
เส้นทาง sudo ip -n ns2 -6 เพิ่มค่าเริ่มต้นผ่าน CCFF::2

sudo ip -6 r เพิ่ม CCFF::/64 ผ่าน CCFF::1

จาก netns เริ่มต้น ฉันสามารถ ping veth0 ซึ่งอยู่ใน netns เดียวกัน จาก netns เริ่มต้น ฉันสามารถ ping veth1 และ veth2 ซึ่งทั้งคู่อยู่ใน ns1. จาก netns เริ่มต้นฉันไม่สามารถไพน์ veth3 ซึ่งอยู่ใน ns2.

หากฉันขยายการเปลี่ยนแปลงดังนี้ โดยเพิ่ม veth4 เข้าไป ns2 และ veth5 ใน ns3 ผมมีปัญหาเดียวกัน. ฉันสามารถ ping จากอินเทอร์เฟซใดก็ได้ใน ns1 ไปยังอินเทอร์เฟซใดก็ได้ใน ns2แต่ไม่สามารถเข้าถึงส่วนต่อประสานใด ๆ ใน ns3.

ลิงค์ sudo ip เพิ่ม veth4 ประเภท veth ชื่อเพียร์ veth5
ลิงค์ sudo ip ตั้งค่า veth4 netns ns2
sudo ip netns exec ns2 ip -6 addr เพิ่ม CCFF::4/127 เพียร์ CCFF::5/127 dev veth4
sudo ip netns exec ns2 ลิงก์ ip ตั้งค่า dev veth4
sudo ip netns exec ns2 ip -6 เส้นทางเพิ่ม CCFF::/64 ผ่าน CCFF::5

sudo ip netns เพิ่ม ns3
ลิงค์ sudo ip ตั้งค่า veth5 netns ns3
sudo ip netns exec ns3 ip -6 addr เพิ่ม CCFF::5/127 เพียร์ CCFF::4/127 dev veth5
sudo ip netns exec ns3 ลิงก์ ip ตั้งค่า dev veth5
sudo ip netns exec ns3 ip -6 เส้นทางเพิ่มค่าเริ่มต้นผ่าน CCFF::4

ดูเหมือนว่าฉันสามารถ ping อินเทอร์เฟซใน netns "เพื่อนบ้าน" / "เชื่อมต่อ" โดยตรงไปยังอินเทอร์เฟซที่ฉันส่ง Ping ได้เท่านั้น ฉันไม่สามารถ ping ผ่านเชนเนมสเปซสุทธิได้ การกำหนดเส้นทางถูกต้องทั้งหมด netns เริ่มต้นสามารถ ping อินเทอร์เฟซใดก็ได้ ns1 แต่ไม่มีอะไรเพิ่มเติม อินเทอร์เฟซใน ns1 สามารถ ping อินเทอร์เฟซใด ๆ ใน netns เริ่มต้นหรือ ns2 แต่ไม่มีอะไรใน ns3, และ ns3 สามารถ ping อะไรก็ได้ ns2 แต่ไม่มีอะไรเกินใน ns1 หรือ netns เริ่มต้น

นี่เป็นข้อ จำกัด ของเนมสเปซเครือข่ายหรือไม่

การแก้ไขปัญหา

เปิดใช้งานการส่งต่อ IPv6 แล้ว ip6tables เพิ่งตั้งค่าเป็น "อนุญาตทั้งหมด" ฉันไม่แน่ใจว่าต้องตรวจสอบอะไรอีก

$ip -6 ร
ccff::1 dev veth0 proto kernel metric 256 pref สื่อ
ccff::/127 dev veth0 เคอร์เนลโปรโตเมตริก 256 pref สื่อ
ccff::/64 ผ่าน ccff::1 dev veth0 เมตริก 1024 pref สื่อ
fe80::/64 dev veth0 เคอร์เนลโปรโตเมตริก 256 pref สื่อ

$sudo ip -n ns1 -6 r
ccff:: dev veth1 proto kernel metric 256 pref สื่อ
ccff::/127 dev veth1 proto kernel metric 256 pref สื่อ
ccff::3 dev veth2 proto kernel metric 256 pref สื่อ
ccff::2/127 dev veth2 เคอร์เนลโปรโตเมตริก 256 pref สื่อ
ccff::/64 ผ่าน ccff::3 dev veth2 เมตริก 1024 pref สื่อ
fe80::/64 dev veth1 โปรโตเคอร์เนลเมตริก 256 pref สื่อ
fe80::/64 dev veth2 โปรโตเคอร์เนลเมตริก 256 pref สื่อ
ค่าเริ่มต้นผ่าน ccff:: dev veth1 metric 1024 pref medium

$sudo ip -n ns2 -6 r
ccff::2 dev veth3 proto kernel metric 256 pref สื่อ
ccff::2/127 dev veth3 โปรโตเคอร์เนลเมตริก 256 pref สื่อ
ccff::5 dev veth4 proto kernel metric 256 pref สื่อ
ccff::4/127 dev veth4 เคอร์เนลโปรโตเมตริก 256 pref สื่อ
ccff::/64 ผ่าน ccff::5 dev veth4 เมตริก 1024 pref สื่อ
fe80::/64 dev veth3 โปรโตเคอร์เนลเมตริก 256 pref สื่อ
fe80::/64 dev veth4 เคอร์เนลโปรโตเมตริก 256 pref สื่อ
ค่าเริ่มต้นผ่าน ccff::2 dev veth3 metric 1024 pref medium

$sudo ip -n ns3 -6 ร
ccff::4/127 dev veth5 เคอร์เนลโปรโตเมตริก 256 ลิงก์ดาวน์ pref สื่อ
ค่าเริ่มต้นผ่าน ccff::4 dev veth5 metric 1024 linkdown pref medium

$cat /proc/sys/net/ipv6/conf/all/forwarding 
1

$cat /proc/sys/net/ipv6/conf/default/forwarding 
1

$sudo ip6tables-บันทึก
# สร้างโดย ip6tables-save v1.8.4 เมื่อวันพุธที่ 17 พฤศจิกายน 22:02:48 น. 2564
*กรอง
: ยอมรับอินพุต [76565:173401906]
:ส่งต่อ ยอมรับ [0:0]
: ยอมรับเอาต์พุต [50440:6536664]
ให้สัญญา
# เสร็จสิ้นวันพุธที่ 17 พ.ย. 22:02:48 น. 2564

$lsb_release -a
ไม่มีโมดูล LSB
รหัสผู้จัดจำหน่าย: Ubuntu
คำอธิบาย: Ubuntu 20.04.3 LTS
เผยแพร่: 20.04
ชื่อรหัส: โฟกัส

$uname -a
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP อ. 26 ต.ค. 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Score:2
ธง in

เปิดใช้งานการส่งต่อ IPv6

อาจไม่ใช่: เมื่อฉันลองสิ่งนี้กับระบบด้วยคำสั่งที่ให้ไว้ตอนต้นคำถาม ฉันก็ทำไม่ได้เช่นกัน veth3:

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 ไบต์ข้อมูล
^ซี
--- สถิติ CCFF::3 ping ---
ส่ง 13 แพ็กเก็ต ได้รับ 0 แพ็กเก็ต สูญเสียแพ็กเก็ต 100% เวลา 12290 มิลลิวินาที

อย่างไรก็ตาม เมื่อฉันเปิดใช้งานการส่งต่อใน ns1

เสียงสะท้อน 1 | sudo ip netns exec ns1 ที /proc/sys/net/ipv6/conf/all/forwarding

มันได้ผล:

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 ไบต์ข้อมูล
64 ไบต์จาก ccff::3: icmp_seq=1 ttl=63 เวลา=0.112 ms
64 ไบต์จาก ccff::3: icmp_seq=2 ttl=63 เวลา=0.054 ms

ดังนั้นจึงเป็นไปได้ว่าคุณไม่ได้เปิดใช้งานการส่งต่อ IPv6 ด้วย ns1. (และอย่าลืมส่งต่อคือ ต่อเนมสเปซ; คุณเปิดใช้งานในเนมสเปซหลัก แต่ไม่ได้อยู่ใน ns1?)


ฉันแก้ไขข้อบกพร่องนี้โดยทำ a tcpdump ในแต่ละอินเทอร์เฟซ ที่ส่ง Ping ไปไม่ถึง veth2 เป็นสัญญาณว่าไม่ได้เปิดใช้งานการส่งต่อ

และถ้าคุณสงสัยว่า "แต่ทำไมฉันถึง ping ได้ veth2 หากไม่ได้เปิดใช้การส่งต่อ": Linux ปฏิบัติต่อที่อยู่ภายในเครื่องทั้งหมดเหมือนกัน ดังนั้นคุณจึงสามารถเข้าถึงที่อยู่ภายในเครื่องจากอินเทอร์เฟซใดก็ได้ ซึ่งไม่เกี่ยวข้องกับการส่งต่อโดยสิ้นเชิง

BTW มันช่วยให้คุณทำงานได้มากมาย เอ็กซ์เทอม ในแต่ละเนมสเปซ ที่ทำให้การดีบักง่ายขึ้นมาก

jwbensley avatar
de flag
ฉันคิดว่าการตั้งค่า `/proc/sys/net/ipv6/conf/default/forwarding` ใน ns เริ่มต้นจะถูกสืบทอดไปยัง ns ใหม่ที่สร้างขึ้น ฉันช่างโง่เขลาเสียนี่กระไร ขอบคุณ @dirkt
Score:1
ธง cn

ฉันได้ข้อสรุปที่ถูกต้องเหมือนที่ @dirkt ทำ แต่ละเนมสเปซเป็นโฮสต์เครือข่ายโดยตัวมันเอง รวมถึงการตั้งค่าว่าจะทำงานเหมือนเราเตอร์หรือไม่ (ซึ่งค่าเริ่มต้นจะปิด) /proc/sys/net การตั้งค่าจะแยกกันสำหรับแต่ละเนมสเปซ การแก้ไขแยกจากกัน ลิงก์อินเทอร์เฟซแยกจากกัน (แต่ชื่อโฮสต์ไม่ใช่ เพราะคุณต้องสร้างเนมสเปซ UTS) โดยพื้นฐานแล้วนั่นคือคำตอบของคุณ

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

เพื่อสรุปโครงสร้างสำหรับเนมสเปซเริ่มต้นและ ns1 บวก ns2

#สร้างเนมสเปซ
ip netns เพิ่ม ns1
ip netns เพิ่ม ns2

#ลูปแบ็คดีที่มี
ตั้งค่าลิงค์ ip -n ns1
ตั้งค่าลิงค์ ip -n ns2 ได้เลย

# สร้างคู่ veth สำหรับเนมสเปซใหม่แต่ละอัน
ip link เพิ่ม veth0 พิมพ์ veth peer name veth1
ip link เพิ่ม veth2 พิมพ์ veth peer name veth3

# เพิ่มอินเทอร์เฟซให้กับเนมสเปซของพวกเขา
ชุดลิงค์ ip veth1 netns ns1
ip link ตั้ง veth2 netns ns1
ip link ตั้ง veth3 netns ns2

#แจ้งที่อยู่
ip -6 addr เพิ่ม CCFF::0/127 dev veth0
ip -n ns1 -6 addr เพิ่ม CCFF::1/127 dev veth1
ip -n ns1 -6 addr เพิ่ม CCFF::2/127 dev veth2
ip -n ns2 -6 addr เพิ่ม CCFF::3/127 dev veth3

# ตั้งค่าลิงค์ใหม่เป็นขึ้น
ลิงค์ ip ตั้งค่า dev veth0
ลิงก์ ip -n ns1 ตั้งค่า dev veth1
ลิงก์ ip -n ns1 ตั้งค่า dev veth2
ลิงก์ ip -n ns2 ตั้งค่า dev veth3

# เนมสเปซที่ควรส่งต่อ
ip netns exec ns1 sysctl -w net.ipv6.conf.all.forwarding=1

# กำหนดเส้นทาง ip6 ใด ๆ ออกไปยังโฮสต์ผ่านเนมสเปซ 1
เส้นทาง ip -n ns2 -6 เพิ่มค่าเริ่มต้นผ่าน CCFF::2

# กำหนดเส้นทาง ccff ip6 ใด ๆ จากโฮสต์
# สู่พื้นที่ภายในมากขึ้นผ่านเนมสเปซ 1
ip -6 r เพิ่ม CCFF::/64 ผ่าน CCFF::1

การทดสอบบางอย่างที่คุณสามารถทำได้:

รายการ ip netns
ip netns exec ns2 ping6 ccff::0
ip netns exec ns2 ping6 ccff::1
ip netns exec ns2 ping6 ccff::3

# หรือใส่เชลล์ของคุณ (เช่น bash) ในเนมสเปซ ns2
ip netns exec ns2 /bin/bash
ping6 ccff::0
ทางออก

คุณยังสามารถแก้ไขและโฮสต์การเปลี่ยนแปลงไฟล์ได้อีกด้วย

#ตั้งค่าตัวแก้ไข 
# (แทนที่ด้วย DNS ของคุณเอง ไม่ทำงานกับตัวแก้ไขลูปแบ็ค)

mkdir -p /etc/netns/ns2
echo เนมเซิร์ฟเวอร์ dns-ip > /etc/netns/ns2/resolv.conf

# อาจให้ไฟล์โฮสต์ของตัวเองเพื่อทำการแก้ไข
cp /etc/hosts /etc/netns/ns2/hosts

โพสต์คำตอบ

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