ฟิสิคัลอินเตอร์เฟสจำนวนมากที่มี IP บนซับเน็ตเดียวกัน


13

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

ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0

พฤติกรรม ARP เริ่มต้นนั้นไม่สามารถป้องกันได้ในกรณีนี้เนื่องจากส่งผลให้เกิดการรับส่งข้อมูลทั้งหมดสำหรับ IP ทั้งหมดที่ส่งผ่านโดยเฉพาะeth1ซึ่งค่อนข้างตรงกันข้ามกับสิ่งที่ฉันต้องการ

ดังนั้นฉันจึงค้นหาและแก้ไขการเปลี่ยนแปลง sysctl เช่นนี้:

net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

นั่นป้องกันไม่ให้eth1แอบอ้างเป็นคนอื่น แต่ฉันก็ยังคงไม่สามารถ ping อะไรนอกจากeth1ที่อยู่ของเรียบร้อยแล้ว (เช่นจากคอมพิวเตอร์เครื่องที่สองบนสวิตช์ตัวเดียวกัน192.168.123.1ตอบสนองต่อการ ping เท่านั้น)

ฉันเดาว่าฉันต้องทำบางสิ่งด้วย arptables หรือ iproute หรือ SOMETHING แต่ฉันหลงทางทะเลในทุ่งนี้

คะแนนโบนัส: โซลูชันจะต้องเข้ากันได้กับ Linux 2.6.27.27 (เจาะจงมากขึ้น Slax 6.1.2)


คุณสามารถโพสต์ตารางเส้นทางได้ไหม?
ponsfonze

2
จุดประสงค์ของคุณในการสร้างการกำหนดค่านี้คืออะไร คุณพยายามทำอะไรให้สำเร็จ
David Schwartz

ความบ้าคลั่งแบบนี้
Sirex

ถ้าคุณต้องการที่จะเชื่อมต่ออินเทอร์เฟซเหล่านี้
resmon6

1
@DavidSchwartz ไม่เครื่องไม่ควรทำหน้าที่เหมือนสวิตช์ (หรือเราเตอร์) ลองคิดดูว่าการใช้เครื่องเสมือน 8 เครื่องที่มีฟิสิคัล NIC เฉพาะสำหรับแต่ละ VM ( หมายเหตุ: ฉันไม่ได้ใช้ VM นี่เป็นเพียงการเปรียบเทียบ ) จากมุมมองของกล่องอื่นในเครือข่ายเดียวกันพีซีเครื่องเดียวของฉันควรแยกไม่ออกอย่างสิ้นเชิงจากพีซีแปดเครื่องที่แยกจากกัน
frustrated_tester

คำตอบ:


17

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

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

ขั้นตอนที่จำเป็นอย่างแน่นอนคือ:

  1. กำหนดค่า arp_filter = 1 และ arp_ignore = 2 บนอินเตอร์เฟสทั้งหมด

  2. เพิ่มการกำหนดเส้นทางตามแหล่งที่มาสำหรับการรับส่งข้อมูลขาออก (ต้องเลือกอินเตอร์เฟสปลายทางตามที่อยู่ต้นทาง)

  3. เพิ่มการกรองแบบต่ออินเทอร์เฟซเพื่อลดแพ็กเก็ตที่ได้รับในส่วนต่อประสานที่ไม่ถูกต้อง (แพ็คเก็ตที่มีที่อยู่ปลายทางที่กำหนดให้กับอินเทอร์เฟซอื่น)

น่าเสียดายที่ไม่มีความเห็นพ้องกันว่าขั้นตอนทั้งสามนี้เป็นสิ่งที่จำเป็นหรือไม่ รูปแบบระบบปลายทางที่อ่อนแอนั้นมีอยู่ใน Linux TCP / IP ทั้งสแต็กและไม่ชัดเจนว่าจะเกิดอะไรขึ้นกับปัญหาที่ละเอียดอ่อนเช่นมัลติคาสต์

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

อีกครั้งคุณเลือกเครื่องมือที่ผิดสำหรับงาน


6

คุณอาจต้องการสร้างบริดจ์ด้วยอินเตอร์เฟส 8/9 จากนั้นกำหนดที่อยู่ IP ให้กับบริดจ์นั้น (แพ็กเก็ต bridge-utils คำสั่ง 'brctl add')

วิธีนี้บริดจ์จะทำหน้าที่เหมือนสวิตช์และสามารถมีที่อยู่ IP ในเครือข่ายย่อยของคุณ


AFAIK นี่เป็นคำตอบที่ถูกต้องสำหรับ Linux ลินุกซ์ได้รับปัญหามากมายที่กล่าวถึงในคำตอบของเดวิดโดยใช้อุปกรณ์บริดจ์ (หรือที่รู้จักกันว่าหลีกเลี่ยงปัญหา L3 โดยสร้างเครือข่ายลอจิคัล L2 ที่ดีกว่า)
เดฟ

4

ฉันขอแนะนำให้ทำการเชื่อมต่อส่วนต่อประสานทางกายภาพจากนั้นกำหนดค่าที่อยู่ทั้งหมดบนส่วนต่อประสานเดียว

คุณจะต้องการการสนับสนุนบนสวิตช์เช่นกัน

ต่อไปนี้เป็นบทแนะนำแบบย่อส่วนที่คุณสามารถใช้เพื่อเริ่มต้นใช้งาน


4

ดูเหมือนว่าคุณต้องการสภาพแวดล้อมการทดสอบเทียบเท่ากับเครื่อง 9 เครื่องและเชื่อว่า 9 อินเตอร์เฟสในเครื่องหนึ่งสามารถเลียนแบบได้ ใน Linux มันไม่สามารถทำสิ่งนี้ผ่านสแต็กเดียวด้วยเหตุผลที่ David Schwartz อธิบาย BTDT และมีแผลเป็น มันไม่ดีพอกับ 2 อินเตอร์เฟส

ทางออกที่ดีกว่าอาจเรียกใช้เครื่องเสมือนแบบแยก 8 หรือ 9 เครื่องในโฮสต์เดียวของคุณและเชื่อมต่ออินเตอร์เฟส 8 หรือ 9 กับเครื่องเสมือนเหล่านี้


แหล่งข้อมูลการอ่าน: Unix Network Programming: Sockets Networking API โดย Stevens, Fenner และ Rudoff ดูที่ RFC1122 และ RFC4907
Skaperen

0

ใช่เป็นไปได้ตามคำแนะนำของ David Schwartz:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// สำหรับการใช้งานที่เหมาะสมนั่นคือ ARP ตอบกลับจาก eth1 เพื่อสร้างขึ้นเมื่อทั้ง eth0 และ eth1 อยู่ในซับเน็ตเดียวกัน

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// ตั้งค่าตาราง "new_rt_table" เพื่อกำหนดเส้นทางแพ็กเก็ตผ่าน eth1

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// ทำเครื่องหมายแพ็คเก็ตเพื่อให้ 'เส้นทาง IP' สามารถกำหนดเส้นทางผ่าน eth1

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

// เปิดใช้งานการสนับสนุนตารางการกำหนดเส้นทางหลายรายการในเคอร์เนล config

การกำหนดค่าเคอร์เนล

→การสนับสนุนเครือข่าย→ตัวเลือกเครือข่าย

[*] IP: เราเตอร์ขั้นสูง

[*] IP: การกำหนดเส้นทางนโยบาย

CONFIG_IP_ADVANCED_ROUTER

CONFIG_IP_MULTIPLE_TABLES

// ขั้นตอนข้างต้นเปลี่ยนเส้นทางแพ็คเก็ตหมายถึงการส่งออกจาก eth0 เพื่อออกอย่างถูกต้องจาก eth1

กรุณาแนะนำวิธีการอื่น ๆ ถ้าใครทำให้มันทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.