ฉันเพิ่งเจอสถานการณ์ที่ฉันต้องการที่อยู่ IP สองแห่งบนซับเน็ตเดียวกันที่กำหนดให้กับโฮสต์ Linux หนึ่งตัวเพื่อให้เราสามารถเรียกใช้ไซต์ SSL / TLS สองแห่ง วิธีแรกของฉันคือใช้นามแฝง IP เช่นใช้ eth0: 0, eth0: 1 เป็นต้น แต่ผู้ดูแลระบบเครือข่ายของเรามีการตั้งค่าที่เข้มงวดพอสมควรเพื่อความปลอดภัยที่ทำให้ความคิดนี้แย่ลง:
- พวกเขาใช้การสอดแนม DHCP และโดยปกติจะไม่อนุญาตให้ใช้ที่อยู่ IP แบบคงที่ การกำหนดแอดเดรสแบบสแตติกทำได้โดยใช้รายการ DHCP แบบคงที่ดังนั้นที่อยู่ MAC เดียวกันจะได้รับการกำหนด IP เดียวกันเสมอ คุณลักษณะนี้สามารถปิดการใช้งานต่อสวิตช์พอร์ตหากคุณถามและคุณมีเหตุผล (ขอบคุณฉันมีความสัมพันธ์ที่ดีกับพวกเครือข่ายและนี่ไม่ใช่เรื่องยากที่จะทำ)
- เมื่อปิดใช้งานการสอดแนม 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
จากiproute2
เพื่อเพิ่มที่อยู่มากกว่าหนึ่งรายการในอินเทอร์เฟซเดียวกัน