วิธีการกำหนดเส้นทางแบบหลายเส้นทางต่อแพ็คเก็ตบน Linux


9

เคอร์เนล Linux ก่อน 3.6 ใช้การแคชเส้นทางเพื่อทำเส้นทาง IPv4 หลายเส้นทางซึ่งหมายความว่าการกำหนดเส้นทางระหว่างสองสายแยก / ISP นั้นค่อนข้างง่าย จาก 3.6 อัลกอริทึมเปลี่ยนเป็นแพ็คเก็ตต่อหมายความว่าต้องใช้เทคนิคมาร์กเกอร์ตาราง / กฎ / iptables เพื่อให้บรรลุสองบรรทัด / ISP

อย่างไรก็ตามหากคุณมีสองบรรทัดที่มี ISP เดียวกันซึ่งสามารถกำหนดเส้นทาง IP เดียวลงทั้งสองบรรทัดบนพื้นฐานต่อแพ็คเก็ตในรูปแบบที่สมดุล / ล้มเหลวจาก 3.6 คุณสามารถประสบความสำเร็จในการเชื่อมสาย (ระดับ IP) ได้อย่างง่ายดาย เส้นทางต่อแพ็คเก็ตในทั้งสองทิศทาง

จาก 4.4 เคอร์เนลเปลี่ยนไปอีกครั้งเป็นโหลดบาลานซ์ที่อิงตามโฟลว์โดยใช้แฮชเหนือที่อยู่ต้นทางและปลายทาง

ฉันกำลังใช้เคอร์เนล 4.4.36 และกำลังใช้การกำหนดเส้นทางแบบหลายเส้นทางผ่านการเชื่อมต่อ PPPoE ปริมาณการใช้งานดาวน์สตรีมของฉันจาก ISP ถูกกำหนดเส้นทางข้ามสองบรรทัดแยกกันตามแต่ละแพ็กเก็ต (หนึ่ง IP กำหนดเส้นทางลงทั้งสองบรรทัด) สิ่งนี้ทำให้ฉันมีความเร็วในการดาวน์โหลดเร็วกว่าความเร็วของแต่ละบรรทัด เกือบความเร็วของทั้งสองสายเข้าด้วยกัน มันใช้งานได้ดีมากวิดีโอ Skype, VoIP (UDP), YouTube และอื่น ๆ ทั้งหมดใช้งานได้ดี

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

มีวิธีการกำหนดค่าเคอร์เนลปัจจุบันให้ใช้อัลกอริทึมต่อแพ็คเก็ตหรือไม่? หรือวิธีอื่นเพื่อให้ได้เส้นทางหลายแพ็คเก็ตต่อแพ็คเก็ต? ฉันจะต้องเปลี่ยนกลับไปใช้เคอร์เนลรุ่นเก่า (ซึ่งฉันไม่ต้องการทำด้วยเหตุผลอื่น ๆ อีกมากมาย) หรือไม่?

ISP ของฉันไม่รองรับ multi-link ppp

ในกรณีที่มีความเกี่ยวข้องฉันกำลังเรียกใช้ Arch Linux ARMv7 บน Raspberry Pi 3


3
นี่เป็นความคิดที่แย่มาก การทำสมดุลแพ็คเก็ตต่อ L2 (เช่น MLPPP) รวมถึงตรรกะที่เพียงพอในการรวบรวมแพ็กเก็ตตามลำดับ การเปิดใช้งานผ่านทาง IP ทำให้เกิดโอกาสอันยิ่งใหญ่ (หากไม่ใช่ความแน่นอน) สำหรับการจัดส่งที่ไม่เป็นไปตามคำสั่ง สิ่งนี้จะทำให้เกิดปัญหาจำนวนมากกับเซสชัน TCP ที่ช้า, UDP ที่ใช้งานไม่ได้รวม, ปัญหาเกี่ยวกับการสตรีมแบบเรียลไทม์ทุกชนิด ฯลฯ ปัญหาอื่น ๆ คือแม้ว่าคุณจะส่งแพ็กเก็ตแบบส่งไปยัง ISP ของคุณก็ตาม ไม่มีข้อเสนอแนะอย่างแน่นอนว่าพวกเขาจะสร้างสมดุลให้กับคุณ
rnxrx

@rnxrx ขอบคุณสำหรับความคิดเห็นของคุณ - ได้แก้ไขคำถามเพื่อให้รายละเอียดเพิ่มเติม จากคำถามของฉัน: "ปริมาณการใช้งานดาวน์สตรีมจาก ISP ถูกกำหนดเส้นทางข้ามสองบรรทัดแยกกันบนพื้นฐานต่อแพ็คเก็ต" ISP จัดเตรียมแผงควบคุม - เมื่อฉันเลือก IP หนึ่งรายการเพื่อกำหนดเส้นทางผ่านทั้งสองสายจากนั้นพวกเขาจะกำหนดเส้นทางให้สมดุลรอบโรบินอย่างสมบูรณ์แบบต่อแพ็คเก็ต ทำงานได้ดีประมาณ 90% ของความเร็วรวมของทั้งสองสายเข้าด้วยกันและให้ความล้มเหลวทันที วิดีโอ Skype, การโทร VOIP, YouTube, การสตรีมมิ่ง BBC และอื่น ๆ ทั้งหมดที่ยอดเยี่ยม - ประสบการณ์การดาวน์สตรีมที่ยอดเยี่ยมนี้ทำให้ฉันต้องการลองอัป
สตรีม

1
อ่า - เข้าใจแล้ว ... ในปัจจุบันคุณมี IP ที่ไม่ซ้ำกันสองอัน (หนึ่งตัวต่อการเชื่อมต่อ) หรือว่าพวกมันมีเส้นทางไปยัง IP ตัวเดียว (หรือซับเน็ต) ด้านข้างของคุณผ่านทางคู่ขนานสองเส้นทาง? หากคุณใช้งาน NAT ประเภทใดก็เห็นได้ชัดว่ามันเกิดขึ้นก่อนการปรับสมดุล อย่างไรก็ตาม - คุณได้ดูที่support.aa.net.uk/ แล้วหรือยัง? มันใช้ส่วนขยาย iptables เพื่อให้บรรลุสิ่งที่คุณกำลังอธิบายและควรจะสอดคล้องกันในรุ่นเคอร์เนลที่ทันสมัยพอสมควร
rnxrx

ขอบคุณ @rnxrx - ใช่ฉันสามารถเลือกได้ (IP ที่ไม่ซ้ำกันสองรายการหรือ IP เดียวผ่านทางคู่ขนาน) ฉันต้องการตัวเลือก IP เดียวเนื่องจากดูเหมือนเหมาะสมกว่า
bao7uo

คำตอบ:


3

ตกลงดังนั้นหลังจากมีเวลามากขึ้นในการตรวจสอบเรื่องนี้ฉันพบวิธีที่จะทำมันโดยใช้ Linux TEQL (True Link Equalizer) นี่คือลิงค์ที่ฉันติดตามอย่างหลวม ๆ แต่ด้วยการปรับแต่งบางอย่าง

http://lartc.org/howto/lartc.loadshare.html

นี่คือวิธีที่ฉันได้ทำงานกับ Arch Linux ARMv7 (Raspberry Pi 3)

ในการบูต:

คำสั่งต่อไปนี้ควรจะทำงานในการบูตเพื่อโหลดโมดูลเคอร์เนลที่เหมาะสม

modprobe sch_teql

คำสั่งต่อไปนี้ยังทำงานในการบูตโดยสมมติว่าคุณต้องการ NAT จากเครือข่ายท้องถิ่นบน eth0

sysctl -w net.ipv4.ip_forward=1
iptables -A INPUT -i ppp+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -o teql+ -j MASQUERADE

FORWARD return traffic อยู่บน ppp + และ POSTROUTING MASQUERADE บน teql + เนื่องจากทราฟฟิกขาออกไปที่ teql และทราฟฟิกกลับมาบน ppp

เมื่อลิงก์ ppp เกิดขึ้น:

สมมติว่าลิงก์ที่จะโหลดมีความสมดุลคือ ppp คำสั่งต่อไปนี้จะทำงานในสคริปต์ใน/etc/ppp/ip-up.d/สคริปต์

sysctl -w net.ipv4.conf.ppp1.rp_filter=2
sysctl -w net.ipv4.conf.ppp2.rp_filter=2
tc qdisc add dev ppp1 root teql0
tc qdisc add dev ppp2 root teql0
ip address add 1.1.1.1/32 dev teql0
# you can add additional public IP addresses teql0 if you need to
ip link set teql0 up
ip route replace default scope global dev teql0

ที่อยู่1.1.1.1IP สาธารณะของคุณซึ่งเชื่อมต่อกับ ISP อยู่ที่ไหน IP สาธารณะเพิ่มเติมสามารถกำหนดให้กับอุปกรณ์ teql0 แต่ไม่จำเป็นต้องกำหนดให้กับอุปกรณ์ ppp ในการตั้งค่าของฉันลิงก์ ppp สองตัวนั้นใช้ IP เดียวกันร่วมกัน (เจรจาโดย pppoe เป็นต้น) ลิงก์ teql ที่กำหนดด้วยตนเองดังที่แสดงไว้ด้านบน ISP ต้องส่งปริมาณข้อมูลสำหรับ IP เท่า ๆ กันทั้งสองลิงก์

reverse path ( rp_filter) ถูกตั้งค่าเป็น2(Loose) ทั้งคู่ในสคริปต์ด้านบนเพื่อที่ว่าแพ็กเก็ตที่ส่งคืนจะไม่หลุดเนื่องจากพวกมันจะกลับมาที่อินเตอร์เฟส ppp แทนที่จะเป็น teql0

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

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

http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing


ฉันไม่เคยลองใช้การกำหนดเส้นทางนโยบายเพราะ TEQL ทำงานได้ดี ถ้ามันยังไม่พัง ....
bao7uo

ฉันพยายามทำให้มันใช้งานได้ ฉันทำงานได้ดีฉันสามารถใช้อินเตอร์เฟสที่ถูกผูกมัดจากเราเตอร์ได้ ฉันไม่สามารถทำให้ NAT ทำงานได้การรับส่งข้อมูลจาก LAN ของฉันจะไม่ลดลงเมื่อเชื่อมโยงที่ถูกผูกมัด :(
andynormancx

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

1
PS เพิ่งสังเกตเห็นข้อผิดพลาดในการกำหนดค่าของฉัน มันพูดsysctl -w net.ipv4.ip_forwardแต่ควรพูดsysctl -w net.ipv4.ip_forward=1ดังนั้นฉันได้แก้ไขข้างต้น แน่นอนว่าจะป้องกันการรับส่งข้อมูลจาก LAN ที่จะลงลิงค์ผูกมัด
bao7uo

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