लोड संतुलन और नेट-आईएनजी कई आईएसपी कनेक्शन लिनक्स पर


15

मेरे पास दो अलग-अलग आईएसपी से दो इंटरनेट कनेक्शन हैं और मुझे दो आईएसपी के बीच और मेरे नेटवर्क से आने वाले ट्रैफ़िक को संतुलित करने की आवश्यकता है। मैं डेबियन जीएनयू / लिनक्स का उपयोग कर रहा हूं।

मेरा सेट-अप इस तरह है -

eth0 (192.168.0.0/24) - स्थानीय नेटवर्क

eth1 (192.168.1.0/24) - आईएसपी # 1

eth2 (192.168.2.0/24) - आईएसपी # 2

मेरा स्थानीय नेटवर्क eth0 के माध्यम से इस सर्वर से जुड़ा है और बॉक्स LAN की सभी मशीनों के लिए DHCP सर्वर सह गेटवे है।

सर्वर को दो आईएसपी के बीच लोड-बैलेंसिंग करने की आवश्यकता है और एनएटी-आईएनजी करने की भी आवश्यकता है।

मैंने lartc.org पर रूटिंग निर्देशों का पालन किया है, लेकिन मुझे अभी भी NAT-ing को ठीक से करने के लिए निर्देशों की आवश्यकता है।

किसी भी तरह की सहायता को आभार समझेंगे।

PS - मुझे pFsense के बारे में पता है लेकिन मुझे लिनक्स का उपयोग करने की आवश्यकता है।


2
आपको किस तरह के निर्देशों की आवश्यकता है? सब कुछ lartc.org पर समझाया गया है। क्या आपको विशेष रूप से कोई समस्या है?
लॉरेंजॉग

जवाबों:


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 विधि का उपयोग करके कैसे करूंगा:

रूट टेबल

मार्ग तालिका संख्या और ISP नामों के बीच मानचित्र जोड़ने के लिए पहले / etc / iproute2 / rt_tables को संपादित करें

...
10 ISP1
20 ISP2
...

तो तालिका 10 और 20 क्रमशः आईएसपी 1 और आईएसपी 2 के लिए है। मुझे इस कोड स्निपेट (जो मैंने 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।

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 आसान है:

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

3
लिंक के साथ अच्छा जवाब। जरूरी नहीं कि ऐसा करने के लिए आपको नए iptables की जरूरत हो, क्योंकि इससे पहले जो आंकड़े मैच हुए थे, उनमें रैंडम और nth मैच थे, जो उसी भूमिका को निभाते थे।
घेराबंदी

1
मेरे पास iptables पर निशान के बारे में एक सवाल है। पोस्ट किए गए लिंक पर, वे केवल उन पैकेटों को चिह्नित कर रहे हैं जो नए राज्य से मेल खाते हैं। आप इसे अलग तरीके से क्यों कर रहे हैं?
मैटिस

क्या मैं एक और नेटवर्क का उपयोग कर सकता हूं, जैसे ISP3, ISP4, आदि?
विटोर मजूको

3

mefat के जवाब से मुझे बहुत मदद मिली, लेकिन दो ISP तालिकाओं में सभी मुख्य तालिका नियमों की एक-एक नकल के बजाय मुख्य तालिका के बाद डिफ़ॉल्ट नियमों को जोड़ने के लिए नियम प्रियो का उपयोग करने के लिए एक बेहतर तरीका हो सकता है।

सामान्य रूप में सेट करें / etc / iproute2 / rt_tables:

...
10 ISP1
20 ISP2
...

ध्यान दें कि

ip rule show

नियमों को दिखाता है 0-> स्थानीय, 32766-> मुख्य और 32767-> डिफ़ॉल्ट। man ipअधिक जानकारी के लिए देखें।

महत्वपूर्ण रूप से राउटिंग प्रक्रिया कम बेशुमार से लेकर उच्च बेशुमार नियमों तक काम करेगी ... लेकिन 32767 सर्वोच्च नियम # नहीं है। इसलिए यदि मुख्य मार्ग तालिका में कोई डिफ़ॉल्ट मार्ग नहीं है (लेकिन vpns आदि के लिए सभी प्रकार के गतिशील रूप से बदलते मार्ग हो सकते हैं) तो यदि कोई मेल नहीं बनता है, तो यह डिफ़ॉल्ट रूप से (सामान्य रूप से खाली) होकर गिरता है और फिर उच्चतर प्रियो नियमों की तलाश करता है।

यहां 'थ्रो' सेक्शन देखें: http://linux-ip.net/html/rout-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 मैनबलिंग का उपयोग करें क्योंकि मेफैट ने कहा:

# 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-ministrup,downministr.d.d/dual-rout में स्क्रिप्ट का उपयोग करता हूं

# 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>उपयोक्ता से। इसलिए यदि एक कनेक्शन पर लंबे समय तक चलने वाला डाउनलोड है और दूसरा कनेक्शन हल्का लोड है तो हमें हल्के से लोड किए गए कनेक्शन को प्राथमिकता देना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.