วิธีที่เหมาะสมในการทำเช่นนี้คือการผูก () กับอินเทอร์เฟซที่คุณต้องการใช้สำหรับแพ็กเก็ตขาออก เนื่องจากคุณสามารถตั้งค่าเส้นทางด้วยip route
และip rule
คำสั่งเพื่อควบคุมวิธีการส่งแพ็กเก็ตที่กำหนดเส้นทางตามส่วนต่อประสานขาออก สำหรับตัวอย่างของฉันฉันจะถือว่าเครือข่ายต่อไปนี้:
- eth0:
- ที่อยู่: 192.168.0.2/24
- เกตเวย์เริ่มต้น: 192.168.0.1
- eth1:
- ที่อยู่: 192.168.1.2/24
- เกตเวย์เริ่มต้น: 192.168.1.1
ฉันจะสร้างตารางเส้นทางสองตารางหนึ่งตารางสำหรับการรับส่งข้อมูลสำหรับ eth0 เรียกว่าสำรองและหนึ่งตารางสำหรับ eth1 เรียกว่า main มีตารางหลักเส้นทางอยู่เสมอและเป็นตารางปกติที่ใช้โดยคำสั่งroute
และ ip route
คนส่วนใหญ่ไม่เคยจัดการกับตารางอื่น ๆ ในการสร้างตารางที่เรียกว่าสำรองเราจะเพิ่มบรรทัดต่อไปนี้ลงใน/etc/iproute2/rt_tables
:
10 alternate
ตารางหลักมีความสำคัญเริ่มต้นที่ 254 กฎที่ตารางเส้นทางมีผลบังคับใช้จะถูกควบคุมโดยip rule
คำสั่ง โดยค่าเริ่มต้นคำสั่งนั้นจะพิมพ์รายการกฎที่มีอยู่ซึ่งควรมีลักษณะดังนี้:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
สิ่งนี้บอกว่ามันจะหาเส้นทางในตารางlocal
ซึ่งเป็นตารางพิเศษที่เคอร์เนลดูแลสำหรับเส้นทางภายในเช่นที่อยู่ IP ของฉันเอง จากนั้นจะลองตารางหลักและตารางเริ่มต้น โดยปกติแล้วค่าเริ่มต้นของตารางจะว่างเปล่าดังนั้นหากไม่มีหลักที่ตรงกันจะไม่มีเส้นทางไปยังโฮสต์ ก่อนอื่นให้เติมตารางอื่นด้วยกฎสำหรับ eth0
sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1
โดยปกติคุณจะต้องการalternate
ตารางให้มีลักษณะคล้ายกับmain
ตาราง ความแตกต่างเพียงอย่างเดียวคือเมื่อการกำหนดเส้นทางควรแตกต่างกัน คุณอาจไม่ต้องการรวมบรรทัดที่สองด้านบนหากคุณต้องการให้ปริมาณการรับส่งข้อมูล NFS, HTTP และอื่น ๆ ทั้งหมดผ่านเกตเวย์เริ่มต้นบน eth0 แม้ว่าจะเป็นปลายทางสำหรับเครือข่ายบน eth1 ขั้นตอนต่อไปคือการเพิ่มกฎสำหรับเมื่อใช้ตารางการเราติ้งสำรองนี้:
sudo ip rule add from 192.168.0.0/24 pref 10 table alternate
กฎนี้บอกว่าการรับส่งข้อมูลใด ๆ ที่มาจากที่อยู่บนเครือข่าย 192.168.0 จะใช้alternate
ตารางเส้นทางแทนmain
ตารางปกติ ขั้นตอนสุดท้ายคือการทำให้แน่ใจว่าไคลเอนต์ทั้งหมดที่ต้องใช้การeth0
เชื่อมโยงนั้น ด้วยwget
ตัวอย่างเช่น set --bind-address=192.168.0.2
สำหรับ NFS ตั้งค่าclientaddr=192.168.0.2
ตัวเลือกการเมานต์ หากใช้ LibWWW กับ Perl คุณสามารถตั้งค่าตัวเลือก localaddr ใน LWP :: UserAgent เพื่อควบคุมส่วนต่อประสานภายในที่เชื่อมกับ หากคุณมีไคลเอนต์ที่คุณไม่สามารถควบคุมการรวมและแหล่งรวบรวมไม่ได้เป็นตัวเลือกคุณอาจจะสามารถใช้กฎ iptables เพื่อแก้ไขที่อยู่ของมัน แต่นี่เป็นแฮ็คมากกว่าและอาจไม่ทำงาน คุณจะต้องตั้งค่ากฎ SNAT ในโซ่ PREROUTING ของตาราง nat หรือตาราง mangle คุณจะต้องใช้ตารางการเราต์ที่ถูกแก้ไขด้านบนเพื่อให้มันใช้งานได้
iftop
และพวกเขาแต่ละคนแสดงการรับส่งข้อมูลที่ถูกต้อง ขอบคุณมาก.