Score:0

บังคับให้กระบวนการใหม่ใช้อินเทอร์เฟซเครือข่ายเฉพาะ (โดยใช้เนมสเปซ netns/เครือข่าย)

ธง cn

ฉันมีอินเทอร์เฟซจำนวนหนึ่งบนเครื่อง Ubuntu 20.04 ท่ามกลางคนอื่น ๆ enx0c5b8f279a64 และ usb0 โดยภายหลังถูกใช้เป็นค่าเริ่มต้น ฉันต้องการให้แน่ใจว่ากระบวนการเฉพาะที่เริ่มต้นในเทอร์มินัลจะใช้หนึ่งในอินเทอร์เฟซเหล่านี้เท่านั้น (เช่น enx0c5b8f279a64 แม้ว่าอินเทอร์เฟซอื่นจะเป็นค่าเริ่มต้นก็ตาม) หากกระบวนการนี้เริ่มต้นและถูกเลือก enx0c5b8f279a64 อินเทอร์เฟซไม่ทำงาน ไม่ควรลองใช้อินเทอร์เฟซอื่นเป็นทางเลือกสำรอง (ราวกับว่าอินเทอร์เฟซอื่นจะไม่มีอยู่จริงจากมุมมองของกระบวนการนี้).

ฉันคิดว่า ip เน็ต เป็นวิธีที่จะไป แต่ฉันมีปัญหาในการปรับใช้โซลูชันที่ใช้งานได้ ฉันเหนื่อย https://superuser.com/a/750412 อย่างไรก็ตามฉันได้รับ ไม่สามารถเข้าถึงโฮสต์ปลายทางได้ ถ้าฉันพยายาม ping 8.8.8.8 :(

ส่วนที่เกี่ยวข้องของ ไอพี เอส เอาต์พุต:

 9: enx0c5b8f279a64: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 สถานะ qdisc fq_codel กลุ่ม UP เริ่มต้น qlen 1,000
     ลิงค์/อีเธอร์ 12:12:12:12:12:12 brd ff:ff:ff:ff:ff:ff
     inet 192.168.7.100/24 ​​brd 192.168.7.255 ขอบเขต global dynamic noprefixroute enx0c5b8f279a64
        valid_lft 84611วินาทีที่ต้องการ_lft 84611วินาที
     inet6 2323::2323:2323:2323:2323/64 ลิงค์ขอบเขต noprefixroute 
        valid_lft ตลอดไป reserved_lft ตลอดไป
 10: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN กลุ่มเริ่มต้น qlen 1000
     ลิงค์/อีเธอร์ 34:34:34:34:34:34 brd ff:ff:ff:ff:ff:ff
     inet 192.168.42.**47**/24 brd 192.168.42.255 ขอบเขต global dynamic noprefixroute usb0
        valid_lft 1858 วินาทีที่ต้องการ_lft 1858 วินาที
     inet6 4545:454:545:4545:454:5454:5454:5454/64 ขอบเขตแบบไดนามิกที่เลิกใช้ทั่วโลกชั่วคราว 
        valid_lft 2461 วินาทีที่ต้องการ_lft 0 วินาที
     inet6 5656:565:656:5656:5656:5656:5656:5656/64 ขอบเขตระดับโลกที่เลิกใช้งานแบบไดนามิก mngtmpaddr noprefixroute 
        valid_lft 2461 วินาทีที่ต้องการ_lft 0 วินาที
     inet6 6767::6767:6767:6767:6767/64 ลิงค์ขอบเขต noprefixroute 
        valid_lft ตลอดไป reserved_lft ตลอดไป

และตารางเส้นทาง:

 เส้นทาง -n
 ตารางเส้นทางเคอร์เนล IP
 เกตเวย์ปลายทาง Genmask ตั้งค่าสถานะการอ้างอิงเมตริก ใช้ Iface
 0.0.0.0 192.168.7.1 0.0.0.0 UG 100 0 0 enx0c5b8f279a64
 0.0.0.0 192.168.42.129 0.0.0.0 UG 101 0 0 usb0
 192.168.7.0 0.0.0.0 255.255.255.0 คุณ 100 0 0 enx0c5b8f279a64
 192.168.42.0 0.0.0.0 255.255.255.0 คุณ 101 0 0 usb0

จนถึงตอนนี้วิธีแก้ปัญหาทั้งหมดที่ฉันได้ลองเริ่มต้นในลักษณะเดียวกัน:

#สร้างเนมสเปซ
sudo ip netns เพิ่ม nspace0
#สร้างลิงค์
ลิงค์ sudo ip เพิ่ม veth0 ประเภท veth ชื่อเพียร์ veth1
#ลิ้งย้าย
ลิงก์ sudo ip ตั้งค่า veth1 netns nspace0

#ทำเวทมนตร์บางอย่าง 
# (ไม่มีวิธีแก้ไขใดที่ฉันพยายามปรับใช้ที่นี่ได้ผลสำหรับฉันจนถึงตอนนี้)
...

# เรียกใช้กระบวนการในเนมสเปซ (ที่นี่ฉันใช้ curl เป็นตัวอย่าง) 
sudo ip netns exec nspace0 curl ifconfig.me/ip

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

Score:1
ธง cn

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

# บันทึกการตั้งค่าเริ่มต้นเป็นไฟล์เพื่อการอ้างอิงที่สะดวก
ไอพีแอดเดอร์ > log_000.ip_addr.txt
ลิงค์ไอพี > log_000.ip_link.txt
เส้นทาง ip > log_000.ip_route.txt
เส้นทาง -n > log_000.route_n.txt

#อินเตอร์เฟส
INTERFACE_0="usb0"
INTERFACE_1="enx0c5b8f279a64"

# รวบรวมข้อมูลเกี่ยวกับการกำหนดค่าปัจจุบัน
PUBL_IP=$(curl --silent ifconfig.me/ip)
INTERFACE_0_PUBL_IP=$(curl --silent --interface ${INTERFACE_0} ifconfig.me/ip)
INTERFACE_1_PUBL_IP=$(curl --silent --interface ${INTERFACE_1} ifconfig.me/ip)

INTERFACE_0_PRIV_IP=$(ip แสดง ${INTERFACE_0} | awk '/inet / {พิมพ์ $2}')
INTERFACE_1_PRIV_IP=$(ip แสดง ${INTERFACE_1} | awk '/inet / {พิมพ์ $2}')

INTERFACE_0_GATE=$(ip route show dev ${INTERFACE_0} | awk '/default via/ {print $3}')
INTERFACE_1_GATE=$(ip route show dev ${INTERFACE_1} | awk '/default via/ {print $3}')

เสียงสะท้อน "" > log_001.IPs.txt
echo "PUBL_IP: ${PUBL_IP}" >> log_001.IPs.txt
เสียงสะท้อน "============================================" >> log_001 .IPs.txt
echo "INTERFACE_0_PUBL_IP: ${INTERFACE_0_PUBL_IP}" >> log_001.IPs.txt
echo "INTERFACE_0_PRIV_IP: ${INTERFACE_0_PRIV_IP}" >> log_001.IPs.txt
echo "INTERFACE_0_GATE: ${INTERFACE_0_GATE}" >> log_001.IPs.txt
เสียงสะท้อน "============================================" >> log_001 .IPs.txt
echo "INTERFACE_1_PUBL_IP: ${INTERFACE_1_PUBL_IP}" >> log_001.IPs.txt
echo "INTERFACE_1_PRIV_IP: ${INTERFACE_1_PRIV_IP}" >> log_001.IPs.txt
echo "INTERFACE_1_GATE: ${INTERFACE_1_GATE}" >> log_001.IPs.txt
แมว log_001.IPs.txt

NAMESPACE_1="ns1"

# การตั้งค่า: สร้างเนมสเปซใหม่
sudo ip netns เพิ่ม ${NAMESPACE_1}

# การตรวจสอบ: ตรวจสอบว่าสร้างเนมสเปซแล้ว
รายการ sudo ip netns

# การตรวจสอบ: แสดงรายการอินเทอร์เฟซในเนมสเปซหลักและใหม่
แสดง ip addr
sudo ip netns exec ${NAMESPACE_1} ip addr แสดง

# การตั้งค่า: เชื่อมโยง (ย้าย) อินเตอร์เฟสไปยังเนมสเปซ
# หมายเหตุ อินเทอร์เฟซนี้จะไม่สามารถใช้งานได้ในเนมสเปซหลัก (ค่าเริ่มต้น) anymoe
sudo ip link set ${INTERFACE_1} netns ${NAMESPACE_1}

# การตรวจสอบ: ตรวจสอบว่าอินเทอร์เฟซถูกย้ายจากเนมสเปซหลักไปยังเนมสเปซใหม่
แสดง ip addr
sudo ip netns exec ${NAMESPACE_1} ip addr แสดง

# การตั้งค่า: ตั้งค่าที่อยู่ IP ของอินเทอร์เฟซในเนมสเปซใหม่และเปิดขึ้นมา
# สิ่งที่ต้องทำ: ตรวจสอบว่าที่อยู่จะต้องเป็นตามที่อยู่ในเนมสเปซหลัก
sudo ip netns exec ${NAMESPACE_1} ifconfig ${INTERFACE_1} ${INTERFACE_1_PRIV_IP} ขึ้น

# SETUP: เปิดอินเทอร์เฟซย้อนกลับ (เนื่องจากอาจจำเป็นสำหรับกระบวนการที่ทำงานในเนมสเปซใหม่)
sudo ip netns exec ${NAMESPACE_1} ifconfig lo 127.0.0.1/8 ขึ้นไป

# การตรวจสอบ: แสดงรายการอินเทอร์เฟซ (วนกลับและ INTERFACE_1) ในเนมสเปซใหม่
sudo ip netns exec ${NAMESPACE_1} ip addr แสดง

# การตรวจสอบ: ตรวจสอบตารางเส้นทาง
sudo ip netns exec ${NAMESPACE_1} เส้นทาง -n

# การตั้งค่า: เพิ่มเกตเวย์เริ่มต้นเพื่อกำหนดเส้นทางในเนมสเปซใหม่
sudo ip netns exec ${NAMESPACE_1} เส้นทาง เพิ่มค่าเริ่มต้น gw 192.168.7.1

# CHECKUP: ตรวจสอบตารางเส้นทางอีกครั้ง
sudo ip netns exec ${NAMESPACE_1} เส้นทาง -n

# เสร็จสิ้น: ใช้ชื่อใหม่
sudo ip netns เรียกใช้ ${NAMESPACE_1} ping 8.8.8.8
sudo ip netns exec ${NAMESPACE_1} traceroute 8.8.8.8

# การตั้งค่า: แก้ไข DNS
sudo mkdir -pv /etc/netns/${NAMESPACE_1}
sudo echo "nameserver 8.8.8.8" > /etc/netns/${NAMESPACE_1}/resolv.conf


sudo ip netns exec ${NAMESPACE_1} curl ifconfig.me/ip
sudo ip netns exec ${NAMESPACE_1} curl --silent ifconfig.me/ip

# พิเศษ: เลิกทำการเปลี่ยนแปลง (เปลี่ยนกลับเป็นสถานะดั้งเดิมของการตั้งค่า IP)
sudo ip netns เดล ${NAMESPACE_1}

โพสต์คำตอบ

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