วิธีรวมการเชื่อมต่ออินเทอร์เน็ตหลาย ๆ อันเข้าด้วยกัน


23

พีซีของฉันมีทั้งหมด 4 NICs, การ์ดเครือข่าย Gigabit Ethernet แบบมีสาย 2 สายและการ์ดเครือข่ายไร้สาย 2 แบบ (หนึ่ง Broadcom พร้อมไดรเวอร์ที่เป็นกรรมสิทธิ์และ Ralink พร้อมซอฟต์แวร์โอเพ่นซอร์สซึ่งทำงานได้ดีกว่า Broadcom มาก)

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

ตัวอย่างเช่นถ้าฉันมีโมเด็มที่มีการเชื่อมต่ออินเทอร์เน็ตที่ 1024kB / s และอีกอันหนึ่งที่มี 512kB / s และอีกอันเล็ก ๆ ที่ให้ 128kB / s หลังจากโหลดสมดุลและรวมการเชื่อมต่อทั้งหมด (Bonding หรือ Teaming) ฉันสามารถดาวน์โหลดได้ที่ ความเร็ว 1664kB / s โดยใช้ทั้ง 3 การเชื่อมต่ออินเทอร์เน็ตเป็นตัวอย่างเช่น

คำถามนี้ทำให้ฉันประหลาดใจเสมอ


5
ดูเหมือนจะค่อนข้างเกินขอบเขตของ Ask Ubuntu :) นี่เป็นสิ่งที่ค่อนข้างซับซ้อนของระบบเครือข่าย IMO มันไม่ค่อยคุ้มค่าเมื่อคุณคำนึงถึงแพ็กเก็ตที่หายไปเนื่องจากลิงก์หยุดทำงาน (แม้เป็นการชั่วคราว) การเรียงลำดับแพ็กเก็ตใหม่เนื่องจากลิงก์บางลิงก์ช้ากว่าลิงค์อื่นและอื่น ๆ ฉันไม่รู้วิธีแก้ปัญหา "กล่องดำ" ที่จะทำสิ่งนี้อาจเป็นโครงการที่น่าสนใจ
Cesium

9
มีคำถามเกี่ยวกับว่าสามารถทำได้ในอูบุนตูและถ้าใช่วิธี
Luis Alvarado

ฉันสร้างคำตอบในการเชื่อมต่ออินเทอร์เน็ต 2 รายการบนพีซีโพสต์เดียว การลิงก์เอกสารสำหรับเชื่อมโยงใน Ubuntu
Lucio

@Lucio ฉันสามารถทำเครื่องหมายคำถามว่าซ้ำหรือคุณสามารถย้ายคำตอบของคุณที่นี่และฉันสามารถทำเครื่องหมายว่ายอมรับได้ คุณจะต้องพร้อมเมื่อ 13.04 ออกมาเพราะมันจะรวมอยู่ใน Network Manager ตัวเลือกการเชื่อม (เฉพาะทาสพันธะแบบใช้สายตอนนี้)
Luis Alvarado

คำตอบ:


11

ฉันทำบางสิ่งเช่นนี้ในที่ทำงานโดยใช้ Ubuntu 11.04 เราเรียกใช้เครื่องมือกำหนดค่าไฟร์วอลล์ Shorewall ซึ่งนอกเหนือจากความสามารถในการทำงานที่ยอดเยี่ยมแล้วยังมีเครื่องมือการกำหนดเส้นทาง ISP ที่เป็นพื้นฐานซึ่งอาจเหมาะสมกับความต้องการของคุณ คุณสามารถค้นหาเอกสารได้ที่นี่: http://www.shorewall.net/MultiISP.html

สิ่งที่เกิดขึ้นคือคุณไม่สามารถใช้ ISP หลาย ๆ เครื่องสำหรับการเชื่อมต่อเดียว ... สิ่งต่าง ๆ นั้นไม่ง่ายเลย สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือพยายามเชื่อมต่อการเชื่อมต่อใหม่ ๆ อย่างสม่ำเสมอระหว่างผู้ให้บริการต่างๆ

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


ลิงค์ที่ดี กวดวิชาที่ดีมาก
Luis Alvarado

ลองดูสิ่งนี้: debuntu.org/2006/02/23/…
Postadelmaga

8

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

  1. ติดตั้ง:

    sudo apt-get install ifenslave
    
  2. โหลดโมดูลเคอร์เนลพันธะ

    sudo modprobe bondingle
    
  3. กำหนดค่าอินเทอร์เฟซของคุณ:

    sudo vi /etc/network/interfaces
    

    ตัวอย่าง config เพื่อรวม eth0 และ eth1 เป็นทาสเข้ากับส่วนต่อประสานของคุณ:

    #eth0 is manually configured, and slave to the "bond0" bonded NIC
    auto eth0
    iface eth0 inet manual
    bond-master bond0
    
    #eth1 ditto, thus creating a 2-link bond.
    auto eth1
    iface eth1 inet manual
    bond-master bond0
    
    # bond0 is the bonded NIC and can be used like any other normal NIC.
    # bond0 is configured using static network information.
    auto bond0
    iface bond0 inet static
    address 192.168.1.10
    gateway 192.168.1.1
    netmask 255.255.255.0
    # bond0 uses standard IEEE 802.3ad LACP bonding protocol 
    bond-mode 802.3ad
    bond-miimon 100
    bond-lacp-rate 1
    bond-slaves none
    
  4. รีสตาร์ทเครือข่าย:

    sudo restart networking
    
  5. นำอินเทอร์เฟซที่มีขอบเขตขึ้น / ลง:

    ifup bond0
    ifdown bond0
    

    มีโหมดการเชื่อมหลายโหมดตามตัวอย่างที่เราใช้:

    bond-mode active-backup
    

    คำอธิบายของโหมดการเชื่อมข้อมูลสำรอง :

    นโยบายการสำรองข้อมูลที่ใช้งานอยู่: มีการใช้งาน slave เพียงหนึ่งรายการเท่านั้นในพันธบัตร สลาฟที่ต่างกันจะทำงานถ้าหากทาสที่ใช้งานอยู่นั้นล้มเหลว ที่อยู่ MAC ของพันธบัตรสามารถมองเห็นได้จากภายนอกในพอร์ตเดียวเท่านั้น (อะแดปเตอร์เครือข่าย) เพื่อหลีกเลี่ยงความสับสนของสวิตช์ โหมดนี้ให้การยอมรับข้อผิดพลาด ตัวเลือกหลักมีผลต่อพฤติกรรมของโหมดนี้

    แหล่งที่มาและข้อมูลเพิ่มเติมได้ที่อูบุนตูช่วยเหลือชุมชนวิกิพีเดีย

การเชื่อมต่อหมายถึงการรวมส่วนต่อประสานเครือข่าย (NICs) เข้ากับลิงก์เดียวซึ่งให้ความพร้อมใช้งานสูงความสมดุลภาระงานปริมาณงานสูงสุดหรือการรวมกันของสิ่งเหล่านี้ แหล่ง


+1 เพราะเป็นหนึ่งในเหตุผลสำหรับคำถามของฉัน จะยังคงรอวิธีการสร้างการเชื่อมต่อเครือข่ายหลักเสมือนที่เป็นผลรวมของการเชื่อมต่อสลาฟ (จริง) ทั้งหมด คล้ายพันธะที่มาในเคอร์เนลเวอร์ชันล่าสุด
Luis Alvarado

2
-1 - พันธะทำงานในระบบ LAN ในขณะที่ทำงานในชั้นที่ 2 คำถามเกี่ยวกับการทำโหลดบาลานซ์สอง WAN อิสระ
gertvdijk

@gertvdijk ฉันไม่เห็นด้วยโปรดตรวจสอบคำตอบการอัปเดตของฉันเพื่อดูว่าการเชื่อมจะทำให้การสร้างสมดุล
pl1nk

1
@ pl1nk นี่เป็นการโหลดบาลานซ์ของเลเยอร์ 2 สำหรับ NIC สองตัวในเครือข่าย L2 เดียวกัน สิ่งนี้ไม่เหมือนกับโหลดบาลานซ์หลาย ISP!
gertvdijk

3
@ pl1nk ความคิดเห็นสุดท้ายของฉัน คำถามเกี่ยวข้องกับการเชื่อมต่อบรอดแบนด์อิสระหลายอย่างชัดเจน แม้ว่าพวกเขาจะเป็น ISP หนึ่งคน แต่นี่ก็ไม่ได้เปลี่ยนความสามารถในการจัดการที่เลเยอร์ 2
gertvdijk

6

มันเป็นคำถามเก่า ๆ แต่ถ้าคุณยังอยากรู้ ..

มีสถานการณ์ทั่วไป 2 สถานการณ์สิ่งที่ gertvdijk และ pl1nk โต้เถียงกันในหนึ่งในคำตอบ:

คุณมีคอมพิวเตอร์ที่มี IP สาธารณะ 2 เครื่อง (ISP ที่แตกต่างกัน 2 เครื่อง) และคุณเชื่อมต่อกับโฮสต์อื่น (เช่นเซิร์ฟเวอร์ในศูนย์ข้อมูลที่มีท่อไขมันที่ใหญ่กว่าแบนด์วิดท์รวมของการเชื่อมต่อ ISP ทั้งสองเครื่องในคอมพิวเตอร์ของคุณ) ดังนั้นคุณจึงสร้างการเชื่อมต่อเชื่อมต่อกับโฮสต์ผ่านการเชื่อมต่อ 2 รายการของคุณจากนั้นโฮสต์ (เซิร์ฟเวอร์) จะทำหน้าที่รับส่งข้อมูลของคุณผ่านการเชื่อมต่ออินเทอร์เน็ตของตัวเอง ในสถานการณ์นี้คุณสามารถรับแบนด์วิดท์รวมเกือบทั้ง 100% ได้ทั้งสองทิศทางสำหรับการเชื่อมต่อเดียว

นี่เป็นกรณีพิเศษของการรวม / การรวมกลุ่ม / การรวมกลุ่มที่มีการเชื่อมต่อหลายชั้น 2 (เครือข่ายเดียวกัน) เข้าด้วยกัน มันสามารถทำได้โดยการสร้างการเชื่อมต่อ VPN เลเยอร์ 2 (แตะ) บนแต่ละอินเตอร์เฟส ISP จากคอมพิวเตอร์ไปยังโฮสต์และเชื่อมต่อเข้าด้วยกัน (โหมด round-robin) เพื่อมีอินเตอร์เฟซเดียว ปัจจัย จำกัด ในสถานการณ์นี้คือความล่าช้า (ping) ที่แตกต่างกันในแต่ละการเชื่อมต่อ ISP ไปยังโฮสต์ ยิ่งพวกเขาคล้ายกันและมีเสถียรภาพมากเท่าไหร่ก็ยิ่งดีเท่านั้น เราใช้มันในหนึ่งในการติดตั้งของเรามันใช้งานได้ดี หากคุณต้องการทราบรายละเอียดเกี่ยวกับวิธีการใช้เพียงแจ้งให้เราทราบ

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

คุณจะไม่ประสบความสำเร็จเท่ากับการใช้แบนด์วิดท์รวมสูงสำหรับคอมพิวเตอร์เครื่องเดียวเช่นเดียวกับสถานการณ์แรก แต่สำหรับสำนักงานขนาดเล็กมันอาจเป็นทางออกที่ดี สิ่งที่คุณสามารถทำได้เพื่อขยายออกไปเล็กน้อยคือการใช้โซลูชันที่กำหนดเองสำหรับโปรโตคอลเฉพาะ ตัวอย่างเช่นคุณอาจมีพร็อกซีบนเกตเวย์ (ซึ่งอาจเป็นคอมพิวเตอร์เครื่องเดียวกัน) สำหรับการดาวน์โหลด http และขอส่วนต่าง ๆ ของไฟล์ขนาดใหญ่ที่สร้างเซสชัน TCP ที่แตกต่างกันผ่านทางอินเตอร์เฟส ISP ที่ต่างกัน ในกรณีนี้อัตราการดาวน์โหลดที่ได้จะใกล้เคียงกับ 100% ของแบนด์วิดท์รวม มันเหมือนกับการถ่ายไปที่เกตเวย์สิ่งที่ ReGet, GetRight และตัวดาวน์โหลดที่คล้ายกันทำ Google 'HTTP 206 เนื้อหาบางส่วน' ฉันไม่ทราบวิธีแก้ปัญหาโอเพ่นซอร์สแบบ out-of-the-box สำหรับสถานการณ์นี้ แต่มีเครื่องใช้ฮาร์ดแวร์ที่ทำสิ่งนี้: google '


ว้าว! ส่วนแรกของคำตอบของคุณคือสิ่งที่ฉันกำลังมองหา ฉันมีเซิร์ฟเวอร์ในคลาวด์กับ Ubuntu และการเชื่อมต่อที่รวดเร็วมาก และการเชื่อมต่ออินเทอร์เน็ตเดียวที่ฉันมีได้คือ 300kbps ที่มี 3G จำกัด คุณสามารถให้ข้อมูลเพิ่มเติมเพื่อรับส่วนแรกของคำตอบของคุณเพื่อให้ฉันสามารถซื้อดองเกิล 3G จำนวนมากและวางแผนที่จะปรับปรุงความเร็วในการเชื่อมต่อของฉันได้หรือไม่?
Huafu

2
echo "bonding" >> /etc/modules echo -e "alias bond* bonding\noptions bonding max_bonds=10 mode=2 xmit_hash_policy=layer3+4 arp_interval=100 arp_ip_target=10.0.0.1" > /etc/modprobe.d/bonding.conf
Anatoli

1
และเป็นทาสแตะทั้งหมด ifaces ไปที่พันธบัตรนี้: echo "+tapX " >> /sys/class/net/bond0/bonding/slaves ตรวจสอบสถานะด้วย: cat /proc/net/bonding/bond0 ในขั้นตอนนี้การรับส่งข้อมูลอินเทอร์เน็ตทั้งหมดควรไหลผ่าน bond0 ไปยังเซิร์ฟเวอร์ในดาต้าเซ็นเตอร์ มีคุณควรกำหนดเส้นทาง: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (eth0 ควรจะเป็น iface อินเทอร์เน็ต)
Anatoli

1
การกำหนดค่าการเชื่อมต่อนี้ (โหมด = 2 xmit_hash_policy = layer3 + 4) จะทำให้การเชื่อมต่อใหม่แต่ละรายการผ่านการเชื่อมต่อ VPN พื้นฐาน iface ที่แตกต่างกันตามการแฮช (คำนวณจาก IP และพอร์ตที่เกี่ยวข้องกับการเชื่อมต่อ) mod iface ข้อมูลเพิ่มเติม: kernel.org/doc/Documentation/networking/bonding.txt นี่เป็นเหมือนโซลูชันที่สองจากคำตอบของฉันมันเป็นเพราะคุณต้องการการเชื่อมต่อพื้นฐาน (กระวนกระวายใจต่ำและแบนด์วิดท์เดียวกัน) ที่คล้ายกันมากสำหรับการเชื่อมแบบวนรอบโรบินเพื่อให้ทำงานได้อย่างถูกต้อง (ไม่เช่นนั้น ว่าการเชื่อมต่อของคุณคือ 3G
Anatoli

1
@Huafu เพื่อให้มีทางออกแรกคุณเพียงแค่เปลี่ยนตัวเลือกการเชื่อมแทนการmode=2 xmit_hash_policy=layer3+4ระบุ y mode=0(ดูลิงค์ @ kernel.org) แต่ก่อนอื่นให้ตรวจสอบว่าการเชื่อมโยงผ่านทาง 3G คล้ายกันอย่างไร หากเวลาปิงของพวกเขาแตกต่างกันมากกว่า 2-3ms หรือกระวนกระวายใจมากกว่า 1 มิลลิวินาทีคุณจะมีการเรียงลำดับแพ็กเก็ตใหม่อีกครั้งอย่างมีประสิทธิภาพลดความเร็วของลิงก์รวม คุณจะต้องตรวจสอบสถิติการเชื่อมโยงรวมกับnetstat -s(มองหา retransmissions) และ/iperf -s iperf -c <server_ip> -dขั้นแรกให้ตรวจสอบประสิทธิภาพของแต่ละลิงก์จากนั้นเราสามารถดำเนินการแก้ปัญหาต่อไปได้
Anatoli

0

ฉันประสบปัญหาที่คล้ายกัน .. และฉันก็สนใจวิธีการแก้ปัญหาตามสถานการณ์แรกโดยนาย GTH และ Anatoli ฉันขอให้คุณจัดโครงแบบพื้นฐานและสคริปต์ถ้าเป็นไปได้เพื่อทดสอบการกำหนดค่าที่อธิบายไว้ในสถานการณ์แรก ..

ตอนนี้ฉันกำหนดค่าการเชื่อมต่อ VPN ผ่านผู้ให้บริการ ISP รายอื่นโดยใช้อินเทอร์เฟซ tun / tap แบบรวม (ไม่ใช่พันธะคำอธิบายในคำตอบที่ 8) ด้วยยูทิลิตี้นี้:

Net-ISP-Balanceโดย Lincoln D. Stein

โหลดการเชื่อมต่ออินเทอร์เน็ตของคุณผ่าน ISP อย่างน้อยสองแห่งเพื่อเพิ่มแบนด์วิดท์และความน่าเชื่อถือที่ดียิ่งขึ้น

โครงการบ้าน: https://lstein.github.io/Net-ISP-Balance/

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

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

นี่คือยูทิลิตี้ที่ใช้ Perl สำหรับการจัดการการกำหนดเส้นทางและ iptables ใน Linux ที่สมบูรณ์แบบสำหรับวัตถุประสงค์ของเราในความเป็นจริงก่อนสร้างตารางเส้นทางสำหรับผู้ให้บริการทั้งหมดแล้วกระจายการรับส่งข้อมูล LAN ทั้งหมดเท่า ๆ กันระหว่างผู้ให้บริการ ตัวอย่างเล็ก ๆ (ทดสอบการกำหนดค่า) สำหรับ 3 isp + 1 lan

 #cat /etc/network/balance.conf
 ##service    device   role     ping-ip           
 CABLE3       enp0s3   isp      10.0.2.2
 CABLE8       enp0s8   isp      10.0.3.2
 CABLE9       enp0s9   isp      10.0.4.2
 LAN          enp0s10  lan                        

 #cat /etc/network/interfaces
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet dhcp

auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet dhcp

auto enp0s9
allow-hotplug enp0s9
iface enp0s9 inet dhcp

auto enp0s10
allow-hotplug enp0s10
iface enp0s10 inet static
    address 192.168.1.1/24

#Now work Net-ISP-Balance utility:

## Including rules from /etc/network/balance/pre-run/pre-run-script.pl ##
## Finished /etc/network/balance/pre-run/pre-run-script.pl ##
echo 0 > /proc/sys/net/ipv4/ip_forward
ip route flush all
ip rule flush
ip rule add from all lookup main pref 32766
ip rule add from all lookup default pref 32767
ip route flush table  2
ip route flush table  1
ip route flush table  3
ip route add  10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add  10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add  10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add  0.0.0.0/0 dev enp0s10 src 
ip route add default scope global nexthop via 10.0.4.2 dev enp0s9 weight 1 nexthop via 10.0.3.2 dev enp0s8 weight 1 nexthop via 10.0.2.2 dev enp0s3 weight 1
ip route add table 2 default dev enp0s3 via 10.0.2.2
ip route add table 2 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 2 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 2 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 2 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.2.15 table 2
ip rule add fwmark 2 table 2
ip route add table 1 default dev enp0s8 via 10.0.3.2
ip route add table 1 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 1 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 1 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 1 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.3.15 table 1
ip rule add fwmark 1 table 1
ip route add table 3 default dev enp0s9 via 10.0.4.2
ip route add table 3 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 3 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 3 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 3 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.4.15 table 3
ip rule add fwmark 3 table 3
## Including rules from /etc/network/balance/routes/01.local_routes ##
# enter any routing commands you might want to go in
# for example:
# ip route add 192.168.100.1 dev eth0 src 198.162.1.14

## Finished /etc/network/balance/routes/01.local_routes ##
## Including rules from /etc/network/balance/routes/02.local_routes.pl ##
## Finished /etc/network/balance/routes/02.local_routes.pl ##
iptables -F
iptables -t nat    -F
iptables -t mangle -F
iptables -X
iptables -P INPUT    DROP
iptables -P OUTPUT   DROP
iptables -P FORWARD  DROP

iptables -N DROPGEN
iptables -A DROPGEN -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "GENERAL: "
iptables -A DROPGEN -j DROP

iptables -N DROPINVAL
iptables -A DROPINVAL -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "INVALID: "
iptables -A DROPINVAL -j DROP

iptables -N DROPPERM
iptables -A DROPPERM -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "ACCESS-DENIED: "
iptables -A DROPPERM -j DROP

iptables -N DROPSPOOF
iptables -A DROPSPOOF -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "DROP-SPOOF: "
iptables -A DROPSPOOF -j DROP

iptables -N DROPFLOOD
iptables -A DROPFLOOD -m limit --limit 1/minute  -j LOG --log-level 4 --log-prefix "DROP-FLOOD: "
iptables -A DROPFLOOD -j DROP

iptables -N DEBUG
iptables -A DEBUG  -j LOG --log-level 3 --log-prefix "DEBUG: "
iptables -t mangle -N MARK-CABLE3
iptables -t mangle -A MARK-CABLE3 -j MARK     --set-mark 2
iptables -t mangle -A MARK-CABLE3 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE8
iptables -t mangle -A MARK-CABLE8 -j MARK     --set-mark 1
iptables -t mangle -A MARK-CABLE8 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE9
iptables -t mangle -A MARK-CABLE9 -j MARK     --set-mark 3
iptables -t mangle -A MARK-CABLE9 -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 1 -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.333333333333333 -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate NEW -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate NEW -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate NEW -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -d 127.0.0.0/8 -j DROPPERM
iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT   -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROPFLOOD
iptables -A INPUT   -i enp0s10 -s 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 0.0.0.0/0  -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 255.255.255.255/32  -j ACCEPT
iptables -A OUTPUT  -p udp -s 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s3 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s3                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s8 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s8                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s9 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s9                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -j DROPSPOOF
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
## Including rules from /etc/network/balance/firewall/01.accept ##
## This file contains iptables statements that add additional firewall rules

# allow incoming domain packets -- needed for DNS resolution
iptables -A INPUT   -p udp --source-port domain -j ACCEPT
# allow incoming NTP packets -- needed for net time protocol
iptables -A INPUT   -p udp --source-port ntp -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept ##
## Including rules from /etc/network/balance/firewall/01.accept.pl ##
iptables -A INPUT -p tcp -s 0.0.0.0/0 --syn --dport ssh -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept.pl ##
## Including rules from /etc/network/balance/firewall/02.forward.pl ##
iptables -A FORWARD -p udp --source-port domain -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD -p udp --source-port ntp    -d 0.0.0.0/0 -j ACCEPT
## Finished /etc/network/balance/firewall/02.forward.pl ##
echo 1 > /proc/sys/net/ipv4/ip_forward
## Including rules from /etc/network/balance/post-run/post-run-script.pl ##
## Finished /etc/network/balance/post-run/post-run-script.pl ##

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