โหลดบาลานซ์ & NAT-ing เชื่อมต่อ ISP หลายรายการบน Linux


15

ฉันมีการเชื่อมต่ออินเทอร์เน็ตสองจุดจาก ISP ที่แตกต่างกันสองแห่งและฉันต้องสมดุลการรับส่งข้อมูลที่มาจากและไปยังเครือข่ายของฉันระหว่าง ISP สองแห่ง ฉันใช้ Debian GNU / Linux

การตั้งค่าของฉันเป็นเช่นนี้ -

eth0 (192.168.0.0/24) - เครือข่ายท้องถิ่น

eth1 (192.168.1.0/24) - ISP # 1

eth2 (192.168.2.0/24) - ISP # 2

เครือข่ายท้องถิ่นของฉันเชื่อมต่อกับเซิร์ฟเวอร์นี้ผ่าน eth0 และกล่องคือเซิร์ฟเวอร์ DHCP พร้อม Gateway สำหรับเครื่องทั้งหมดใน LAN

เซิร์ฟเวอร์จำเป็นต้องทำโหลดบาลานซ์ระหว่าง ISP สองเครื่องและต้องทำ NAT-ing

ฉันได้ปฏิบัติตามคำแนะนำเส้นทางในlartc.orgแต่ฉันยังต้องการคำแนะนำในการทำ NAT-ing อย่างถูกต้อง

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.

PS - ฉันรู้เกี่ยวกับ pFsense แต่ฉันต้องใช้ Linux


2
คุณต้องการคำแนะนำประเภทใด? ทุกอย่างถูกอธิบายบน lartc.org คุณมีปัญหาอะไรเป็นพิเศษหรือไม่?
lorenzog

คำตอบ:


19

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

สมมติว่ามีบางสิ่ง:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, เกตเวย์: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, เกตเวย์: 192.168.2.2/24

ดังนั้นนี่คือวิธีที่ฉันจะทำได้โดยใช้วิธี iptables:

ตารางเส้นทาง

ก่อนอื่นแก้ไข / etc / iproute2 / rt_tables เพื่อเพิ่มแผนที่ระหว่างหมายเลขตารางเส้นทางและชื่อ ISP

...
10 ISP1
20 ISP2
...

ดังนั้นตารางที่ 10 และ 20 สำหรับ ISP1 และ ISP2 ตามลำดับ ฉันต้องเติมตารางเหล่านี้ด้วยเส้นทางจากตารางหลักด้วยโค้ดนี้ (ซึ่งฉันนำมาจาก hxxp: //linux-ip.net/html/adv-multi-internet.html)

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table ISP1 $ROUTE
done

และเพิ่มเกตเวย์เริ่มต้นให้กับ ISP1 ผ่านเกตเวย์ของ ISP1 นั้น:

ip route add default via 192.168.1.2 table ISP1

ทำเช่นเดียวกันสำหรับ ISP2

ตอนนี้ฉันมีตารางเส้นทาง 2 อัน 1 อันสำหรับแต่ละ ISP

iptables

ตกลงตอนนี้ฉันใช้ iptables เพื่อกระจายแพ็กเก็ตอย่างสม่ำเสมอไปยังแต่ละตารางเส้นทาง ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของมันได้ที่นี่ ( http://www.diegolima.org/wordpress/?p=36 ) และที่นี่ ( http://home.regit.org/?page_id=7 )

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

NAT

ดี NAT เป็นเรื่องง่าย:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

3
คำตอบที่ดีกับลิงค์ คุณไม่จำเป็นต้องใช้ iptables ใหม่ในการทำเช่นนี้ก่อนที่จะมีสถิติที่ตรงกันนั่นคือการจับคู่แบบสุ่มและแบบที่nเซิร์ฟเวอร์ใดที่มีบทบาทเดียวกัน
SiegeX

1
ฉันมีคำถามเกี่ยวกับเครื่องหมายบน iptables บนลิงค์ที่โพสต์พวกเขาจะทำเครื่องหมายเฉพาะแพ็กเก็ตที่ตรงกับสถานะใหม่ ทำไมคุณถึงทำมันแตกต่างกัน?
Matías

ฉันสามารถใช้เครือข่ายอีกหนึ่งเครือข่ายเช่น ISP3, ISP4 และอื่น ๆ ได้หรือไม่
Vitor Mazuco

3

คำตอบของ mefat ช่วยฉันได้มาก แต่แทนที่จะคัดลอกกฎตารางหลักทั้งหมดลงในตาราง ISP สองวิธีแนวทางที่ดีกว่าอาจใช้กฎ prio เพื่อเพิ่มกฎเริ่มต้นหลังจากตารางหลัก

ตั้งค่า / etc / iproute2 / rt_tables ตามปกติ:

...
10 ISP1
20 ISP2
...

สังเกตได้ว่า

ip rule show

แสดงกฎ 0-> local, 32766-> main และ 32767-> default ดูman ipรายละเอียดเพิ่มเติมได้ที่

ขั้นตอนการกำหนดเส้นทางที่สำคัญจะทำงานจากกฎ prio ต่ำถึงสูง prio ... แต่ 32767 ไม่ใช่กฎสูงสุด # ดังนั้นหากตารางเส้นทางหลักไม่มีเส้นทางเริ่มต้น (แต่อาจมีเส้นทางการเปลี่ยนแบบไดนามิกสำหรับ vpns และอื่น ๆ ทุกชนิด) ดังนั้นหากไม่มีการจับคู่มันจะผ่านไปสู่การเริ่มต้น

ดูส่วน 'โยน' ได้ที่นี่: http://linux-ip.net/html/routing-tables.html

ดังนั้นตอนนี้การติดตั้ง

ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2

และเพื่อให้แน่ใจว่าพวกเขาดูแลตารางหลัก:

ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000

ใช้

ip rule show

อีกครั้งเพื่อตรวจสอบว่ากฎเหล่านี้สูงกว่าหลัก

จากนั้นใช้ CONNMARK mangling ตามที่ mefat พูดว่า:

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

สิ่งที่ควรทราบ: pppd ต้องการเป็นnodefaultrouteอย่างอื่นมันตั้งอยู่ในหลัก; เมื่ออุปกรณ์รีสตาร์ทตาราง ISP1 / ISP2 จะได้รับการทำความสะอาดดังนั้นจึงจำเป็นต้องกู้คืนโดยใช้สคริปต์

ฉันใช้สคริปต์ใน /etc/ppp/ip-{up,down}.d/dual-routing

# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1

RULENUM=4
set_balance() {
    iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}

# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2

นี่คือการโหลดบาลานซ์ตามการเชื่อมต่อดังนั้นฉันจะดูที่การใช้โหลดเพื่อตรวจสอบและแทนที่กฎสถิติ: iptables -t mangle -R PREROUTING <n>จาก userspace ดังนั้นหากมีการดาวน์โหลดที่ใช้เวลานานในการเชื่อมต่อหนึ่งและการเชื่อมต่ออื่น ๆ มีการโหลดเบา ๆ เราควรจะชอบการเชื่อมต่อที่โหลดเบา ๆ

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