สองเน็ตเวิร์กอินเตอร์เฟสและสอง IP แอดเดรสบนซับเน็ตเดียวกันใน Linux


22

ฉันเพิ่งเจอสถานการณ์ที่ฉันต้องการที่อยู่ IP สองแห่งบนซับเน็ตเดียวกันที่กำหนดให้กับโฮสต์ Linux หนึ่งตัวเพื่อให้เราสามารถเรียกใช้ไซต์ SSL / TLS สองแห่ง วิธีแรกของฉันคือใช้นามแฝง IP เช่นใช้ eth0: 0, eth0: 1 เป็นต้น แต่ผู้ดูแลระบบเครือข่ายของเรามีการตั้งค่าที่เข้มงวดพอสมควรเพื่อความปลอดภัยที่ทำให้ความคิดนี้แย่ลง:

  1. พวกเขาใช้การสอดแนม DHCP และโดยปกติจะไม่อนุญาตให้ใช้ที่อยู่ IP แบบคงที่ การกำหนดแอดเดรสแบบสแตติกทำได้โดยใช้รายการ DHCP แบบคงที่ดังนั้นที่อยู่ MAC เดียวกันจะได้รับการกำหนด IP เดียวกันเสมอ คุณลักษณะนี้สามารถปิดการใช้งานต่อสวิตช์พอร์ตหากคุณถามและคุณมีเหตุผล (ขอบคุณฉันมีความสัมพันธ์ที่ดีกับพวกเครือข่ายและนี่ไม่ใช่เรื่องยากที่จะทำ)
  2. เมื่อปิดใช้งานการสอดแนม DHCP บน switchport พวกเขาต้องวางกฎบนสวิตช์ที่กล่าวว่าที่อยู่ MAC X ได้รับอนุญาตให้มีที่อยู่ IP Y แต่น่าเสียดายที่นี่มีผลข้างเคียงของการบอกว่า MAC address X ได้รับอนุญาตเท่านั้น ที่อยู่ IP Y การสร้างชื่อแทน IP จำเป็นต้องใช้ที่อยู่ MAC X ซึ่งได้รับการกำหนดสองที่อยู่ IP ดังนั้นจึงไม่สามารถใช้งานได้

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

แต่ปัญหาก็เกิดขึ้น: ผู้ดูแลระบบเครือข่ายสามารถมองเห็น (บนสวิตช์) รายการ ARP สำหรับทั้งสองอินเตอร์เฟส แต่เฉพาะอินเตอร์เฟสเครือข่ายแรกที่ฉันนำขึ้นมาเท่านั้นที่จะตอบสนองต่อการปิงหรือทราฟฟิก TCP หรือ UDP

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


ขั้นตอนที่ 1: เปิดใช้งานการกรอง ARP บนอินเทอร์เฟซทั้งหมด:

# sysctl -w net.ipv4.conf.all.arp_filter=1
# echo "net.ipv4.conf.all.arp_filter = 1" >> /etc/sysctl.conf

จากไฟล์ระบบเครือข่าย / ip-sysctl.txt ใน Linux kernel เอกสาร:

arp_filter - BOOLEAN
    1 - Allows you to have multiple network interfaces on the same
    subnet, and have the ARPs for each interface be answered
    based on whether or not the kernel would route a packet from
    the ARP'd IP out that interface (therefore you must use source
    based routing for this to work). In other words it allows control
    of which cards (usually 1) will respond to an arp request.

    0 - (default) The kernel can respond to arp requests with addresses
    from other interfaces. This may seem wrong but it usually makes
    sense, because it increases the chance of successful communication.
    IP addresses are owned by the complete host on Linux, not by
    particular interfaces. Only for more complex setups like load-
    balancing, does this behaviour cause problems.

    arp_filter for the interface will be enabled if at least one of
    conf/{all,interface}/arp_filter is set to TRUE,
    it will be disabled otherwise

ขั้นตอนที่ 2: ใช้เส้นทางตามแหล่งที่มา

โดยทั่วไปฉันเพิ่งทำตามคำแนะนำจากhttp://lartc.org/howto/lartc.rpdb.multiple-links.htmlแม้ว่าหน้านั้นจะเขียนด้วยเป้าหมายที่แตกต่างกันในใจ (จัดการกับ ISP สองแห่ง)

สมมติว่าซับเน็ตคือ 10.0.0.0/24 เกตเวย์คือ 10.0.0.1 ที่อยู่ IP สำหรับ eth0 คือ 10.0.0.100 และที่อยู่ IP สำหรับ eth1 คือ 10.0.0.101

กำหนดตารางเส้นทางใหม่สองตารางชื่อ eth0 และ eth1 ใน / etc / iproute2 / rt_tables:

... top of file omitted ...
1    eth0
2    eth1

กำหนดเส้นทางสำหรับสองตารางเหล่านี้:

# ip route add default via 10.0.0.1 table eth0
# ip route add default via 10.0.0.1 table eth1
# ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
# ip route add 10.0.0.0/24 dev eth1 src 10.0.0.101 table eth1

กำหนดกฎสำหรับเวลาที่จะใช้ตารางเส้นทางใหม่:

# ip rule add from 10.0.0.100 table eth0
# ip rule add from 10.0.0.101 table eth1

ตารางเส้นทางหลักได้รับการดูแลโดย DHCP (และไม่ชัดเจนว่ามันจำเป็นอย่างยิ่งในกรณีนี้) แต่โดยพื้นฐานแล้วเท่ากับ:

# ip route add default via 10.0.0.1 dev eth0
# ip route add 130.127.48.0/23 dev eth0 src 10.0.0.100
# ip route add 130.127.48.0/23 dev eth1 src 10.0.0.101

และ voila! ดูเหมือนว่าทุกอย่างจะทำงานได้ดี การส่ง Ping ไปยังที่อยู่ IP ทั้งสองทำงานได้ดี การส่ง Ping จากระบบนี้ไปยังระบบอื่นและบังคับให้ ping ใช้อินเตอร์เฟสเฉพาะทำงานได้ดี ( ping -I eth0 10.0.0.1, ping -I eth1 10.0.0.1) และที่สำคัญที่สุดการรับส่งข้อมูล TCP และ UDP ทั้งหมดไปยัง / จากที่อยู่ IP ใดก็ได้ทำงานตามที่คาดไว้


ดังนั้นอีกครั้งคำถามของฉันคือ: มีวิธีที่ดีกว่าการทำเช่นนี้? ดูเหมือนว่าจะมีงานมากสำหรับปัญหาที่ดูเหมือนง่าย


อัปเดต: การแก้ปัญหาข้างต้นจบลงด้วยความไม่สมบูรณ์ สิ่งต่าง ๆ ทำงานได้ดีหากปริมาณการใช้งานยังคงอยู่บนซับเน็ตเดียวกัน แต่การสื่อสารกับซับเน็ตอื่นที่ใช้อินเทอร์เฟซที่ 2 จะทำงานไม่ถูกต้อง แทนที่จะขุดหลุมที่ใหญ่กว่าฉันลงเอยด้วยการพูดคุยกับผู้ดูแลระบบเครือข่ายและให้พวกเขาอนุญาตที่อยู่ IP หลายรายการสำหรับหนึ่งอินเทอร์เฟซและใช้นามแฝง IP (เช่น eth0 และ eth0: 0)


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

ฉันเชื่อว่าการกำหนดเส้นทางต้นทางไม่จำเป็นในกรณีนี้เนื่องจากการกรอง arp ควรใช้เฉพาะเมื่อสวิตช์ส่งไปยังส่วนต่อประสาน / เพื่อค้นหาระหว่างพอร์ต ฉันอาจผิด แต่เมื่อเครื่องส่งข้อมูลไปยังสวิตช์ IP ในฟิลด์ต้นทาง (ส่วนหัว IP) ไม่ได้ถูกตรวจสอบเพียง arp ส่งแพ็คเก็ต
AndreasM

MikeyB ถูกต้องการกำหนดเส้นทางต้นทางเป็นวิธีเดียวเท่านั้น เครื่องสามารถเลือกอินเทอร์เฟซขาออกที่ต้องการส่งปริมาณข้อมูลตราบใดที่อยู่บนเครือข่ายย่อยเดียวกัน ไม่สำคัญว่า IP จะไม่อยู่บนอินเทอร์เฟซนั้นจริงหรือ
Patrick

2
AndreasM: แพ็คเก็ตที่เข้ามาไม่ใช่ปัญหา แต่เป็นแพ็คเก็ตขาออกซึ่งเป็นปัญหา โดยไม่มีการกำหนดเส้นทางต้นทางแพ็กเก็ตขาออกทั้งหมดจะใช้เส้นทางเริ่มต้นซึ่งถูกผูกไว้กับหนึ่งอินเทอร์เฟซหรืออื่น ๆ แม้ว่าแพ็กเก็ตขาออกจะมีที่อยู่ IP ที่ถูกต้องตัวกรองบนสวิตช์จะไม่อนุญาตให้ออกไปเนื่องจากที่อยู่ IP นั้นไม่ได้เป็นของที่อยู่ MAC ของอินเทอร์เฟซนั้น เพื่อเปลี่ยนมันดูเหมือนว่าลูกค้าพยายามปลอม IP ของลูกค้าอื่น (สวิตช์เหล่านี้เป็นสมาร์ทเลเยอร์ 3)
Scott Duckworth

ชื่อแทน IP นั้นล้าสมัยและแฮ็กไม่ได้สะท้อนความเป็นจริงไม่ต้องพูดถึงว่าการถอนตัวหลักจะทำให้นามแฝงทั้งหมดหมดลง ใช้ipจากiproute2เพื่อเพิ่มที่อยู่มากกว่าหนึ่งรายการในอินเทอร์เฟซเดียวกัน
pilona

คำตอบ:


8

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

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