डेबियन 7 पर इंटरनेट प्रदाताओं के बीच स्विच करना

नवीनतम लिनक्स वितरण में / etc फ़ोल्डर में काफी कुछ उपहार हैं, लेकिन कुछ उन्हें सक्षम रूप से उपयोग करते हैं। यहां मैं डेबियन के नवीनतम स्थिर संस्करण के संबंध में उनमें से कुछ के बारे में बात करूंगा, और बैकअप चैनल पर स्विच करने के कार्यान्वयन का एक उदाहरण दूंगा।
एक तुच्छ ऑटो-स्विच को खोजने के सभी प्रयास 1-2 लिपियों का एक गुच्छा "खुद के लिए" लिखे गए हैं और बहुत विन्यास योग्य नहीं हैं। उनमें से कोई भी dhcp से जुड़ा नहीं था, जिसका अर्थ है कि प्रदाता की ओर से किसी भी हेरफेर को सेटिंग्स में हस्तक्षेप की आवश्यकता होती है। मैंने खुद एक समय में इन्हें लिखा था, लेकिन अब मैंने इसे नई प्रणाली पर खूबसूरती से डिजाइन करने का फैसला किया - जैसा कि डेबियन डेवलपर्स का इरादा था, अर्थात्, कॉन्फ़िगरेशन फ़ाइलों को बदलना, अपनी खुद की स्क्रिप्ट जोड़ना और जो सिस्टम हमें प्रदान किया गया है, उसे छूना नहीं।

तो हमारे पास है:
- दो प्रदाताओं से दो केबल, दोनों dhcp पर आईपी जारी करते हैं
- तीन नेटवर्क कार्ड के साथ डेबियन मट्ठा चलाने वाला एक ताजा इकट्ठे सर्वर (शायद मैं बाद में और जोड़ूंगा)
- यह इच्छा कि इंटरनेट गायब न हो (काम रुकता नहीं है!)। संतुलन, आदि। बाद के लिए छोड़ दें।

पहली नज़र में तर्क सरल है:
- हम अलग-अलग इंटरफेस के माध्यम से कुछ मेजबान को पिंग करते हैं
- अगर पिंग अस्थिर है, तो बैकअप चैनल पर स्विच करें।
यह केवल कार्यान्वयन में था कि लक्ष्य को यथासंभव सब कुछ लचीला करने के लिए निर्धारित किया गया था, उदाहरण के लिए, संभावित प्रदाताओं की संख्या को सीमित करने के लिए नहीं और बाद में पुनर्संरचना के लिए न्यूनतम आंदोलनों को करना।
पहले, आइए देखें कि सिस्टम में पहले से किस प्रकार के बन्स हैं।
/ Etc / नेटवर्क फ़ोल्डर में, हम इंटरफेस फ़ाइल और if-down.d, if-post-down.d, if-pre-up.d, if-up.d फ़ोल्डरों में रुचि रखते हैं।
root@ns:/etc/network# cat interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface iface lo inet loopback # The primary network interface iface eth0 inet static address 192.168.104.1 netmask 255.255.255.0 iface eth1 inet dhcp iface eth3 inet dhcp 

Ifup / ifdown के माध्यम से इंटरफेस में हेरफेर करने पर, रन-पार्ट्स फ़ोल्डरों पर सेट किए जाते हैं और निम्न वातावरण चर उनमें स्क्रिप्ट के लिए सुलभ होते हैं: IFACE, LOGICAL, ADDRFAM, METHOD, MODE, PHASE, MODE, VERBOSITY, PATH
जब सिस्टम शुरू होता है, तो if-pre-up.d फ़ोल्डर से स्क्रिप्ट पहले चलाए जाते हैं (प्रत्येक इंटरफ़ेस के लिए एक बार, लेकिन इससे पहले कि वे IFACE = ”- सभी” पर आते हैं, तो इंटरफ़ेस उठाए जाते हैं और if-up.d और IFACE फ़ोल्डर से स्क्रिप्ट चलाए जाते हैं = "- सभी" पहले से ही अंत में आता है। ifup के साथ, ethX केवल ethX (".all" के बिना) के लिए एक बार लॉन्च किया जाता है। इसी तरह, if-down.d और if-post-down.d जब ifdown और system shutdown।
सिस्टम आपको प्रत्येक ऑपरेशन के लिए और प्रत्येक इंटरफ़ेस के लिए एक स्क्रिप्ट असाइन करने की अनुमति देता है, लेकिन 20 में से हर 10 स्क्रिप्ट में समान परिवर्तन करने के लिए मेरी योजनाओं में शामिल नहीं किया गया था, इसलिए हम एक बड़ी स्क्रिप्ट लिखेंगे और उस पर सभी चार फ़ोल्डरों से सिमलिंक की व्यवस्था करेंगे। आप समझ सकते हैं कि यह पर्यावरण चर से कहां लॉन्च किया गया है।

हालाँकि, हमें अभी भी गेटवे की जानकारी जानना आवश्यक है जो कि dhcp से आई है। इस मामले के लिए, स्क्रिप्ट /etc/dhcp/dhclient-enter-hooks.d और /etc/dhcp/dhclient-exit-hooks.d के साथ फ़ोल्डर भी हैं
स्टार्टअप अनुक्रम निम्नानुसार है:
- पोल dhcp सर्वर
- dhclient-enter-hooks.d फ़ोल्डर की सामग्री को लॉन्च किया
- कॉन्फ़िगर नेटवर्क पैरामीटर (आईपी, डीएनएस, गेटवे, ...)
- dhclient-exit-hooks.d फ़ोल्डर की सामग्री को लॉन्च किया
स्क्रिप्ट में विभिन्न उपयोगी चर (dhcp सर्वर से आए पैरामीटर) की भी पहुंच है, जिनमें से कुछ को हमें सहेजना होगा।

कई शाम के बाद, निम्नलिखित हुआ:
सभी स्क्रिप्ट / आदि / नेटवर्क / स्क्रिप्ट फ़ोल्डर में हैं। विभिन्न फ़ोल्डरों से सहानुभूति होती है
सेटिंग्स - / etc / डिफ़ॉल्ट / नेटवर्क-स्क्रिप्ट
अस्थायी फाइलें डाल / var / lib / dhcp
लॉग फ़ाइल /var/log/network-scripts.log पर लिखे जाते हैं
सेटिंग्स
 # cat /etc/default/network-scripts # Configuration file for /etc/network/scripts/* # Host to ping for autoroute HOST_TO_PING="4.2.2.1" # Number of pings to check the connection PING_COUNT=5 # list of LAN interfaces IFLAN="eth0" # WAN prio from first to last IFWAN="eth1 eth3" # open ports from WAN zone WAN_PORTS_OPEN="" 

यहां सब कुछ स्पष्ट होना चाहिए। Interfaces LAN, WAN को आप जितना चाहें उतना जोड़ सकते हैं। WAN सूची में, पहली सर्वोच्च प्राथमिकता है, फिर अवरोही क्रम में।
कार्यों के साथ अलग फ़ाइल।
 # cat /etc/network/scripts/functions #!/bin/sh DHCPLIB="/var/lib/dhcp" LOGDIR="/var/log" LOGFILE="$LOGDIR/network-scripts.log" HOST_TO_PING="4.2.2.1" PING_COUNT=3 SQUID_PORT="3128" IFLAN="" IFWAN="" WAN_PORTS_OPEN="" . /etc/default/network-scripts # Local variables DEFAULTWAN=${IFWAN% *} log() { DATE=`date` echo "$DATE $@" >> $LOGFILE } warn() { log "WARNING: $@" echo "WARNING: $@" } cmd() { $@ RES=$? log "$RES - $@" return $RES } get_ip() { IP=`ip addr list $1 | grep " inet " | head -n 1 | cut -d " " -f 6 | cut -d / -f 1` } update_local_redirect() { for i in $IFLAN; do cmd iptables -t nat $INS PREROUTING -i $i -p tcp --dport 80 -d $1 -j ACCEPT done } update_squid() { case $1 in start) ADD="-A" INS="-I" ;; stop) ADD="-D" INS="-D" ;; *) ADD="-C" INS="-C" esac for i in $IFLAN; do # transparent proxy cmd iptables -t nat $ADD PREROUTING -i $i -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT done } 

यहाँ हमारे पास है:
- / etc / डिफ़ॉल्ट / नेटवर्क-स्क्रिप्ट से आयात सेटिंग्स
- लॉगिंग (लॉग, चेतावनी),
- काम के मापदंडों और परिणामों के लॉग में रिकॉर्डिंग के साथ आदेशों का शुभारंभ
- update_local_redirect () 80 अतीत के पारदर्शी प्रॉक्सी को पोर्ट करने के लिए मार्ग जोड़ता है
- update_squid () स्वयं पारदर्शी प्रॉक्सी के लिए एक नियम जोड़ता है (/etc/init.d/squid3 में चलता है - यह एकमात्र सिस्टम स्क्रिप्ट है जिसे आपको प्राप्त करना था)
इसके बाद, प्रौद्योगिकी का उपयोग किया जाता है, जिसे मैंने कई साल पहले चर के साथ $ ADD और iptables के लिए $ INS के साथ आविष्कार किया था। आपको केवल एक ही स्थान पर एक नियम लिखने की अनुमति देता है, और उसके बाद केवल इन चरों को बदलते हुए इसे हटाता है।
 # cat /etc/network/scripts/route-enter #!/bin/sh . /etc/network/scripts/functions log "$0 route-enter ${interface} ${reason} ${new_routers}" # security bugfix new_host_name=${new_host_name//[^-.a-zA-Z0-9]/} # save routers to special file echo -n ${new_routers} > $DHCPLIB/routers.${interface} echo -n ${new_ip_address} > $DHCPLIB/ip_address.${interface} case ${interface} in $DEFAULTWAN) # by default enable routers only for first WAN interface ;; *) # and clear it for others unset new_routers ;; esac 

- new_routers और new_ip_address को फ़ाइल में सहेजें (तब उन्हें समझा जाएगा)
- डिफ़ॉल्ट मार्ग केवल प्राथमिकता वाले इंटरफ़ेस के लिए अनुमत है

 # cat /etc/network/scripts/route-exit #!/bin/sh . /etc/network/scripts/functions log "$0 route-exit ${interface} ${reason}" update_routes() { cmd route $ADD -host $HOST_TO_PING gw ${routers} # identyfy providers by DNS addresses case $DNS in *82.193.96*) DESTIP=`resolveip -s stat.ipnet.ua` cmd route $ADD -host $DESTIP gw ${routers} ;; *193.41.63*|*192.168.11.1*) DESTIP=`resolveip -s my.kyivstar.ua` cmd route $ADD -host $DESTIP gw ${routers} ;; *) warn "route-exit - unknown DNS ${new_domain_name_servers} specified" ;; esac } case ${reason} in BOUND) ADD="add" DNS=${new_domain_name_servers} # use saved-to-file value due to $old_routers can be cleared for some interfaces by other script routers=`cat $DHCPLIB/routers.${interface}` update_routes ;; RELEASE) # No need to delete routes during release # ADD="del" # routers=${old_routers}` # update_routes ;; PREINIT) ;; RENEW) if [ "$old_routers" != "$new_routers" ]; then ADD="del" DNS=${old_domain_name_servers} routers=${old_routers} update_routes ADD="add" DNS=${new_domain_name_servers} routers=`cat $DHCPLIB/routers.${interface}` update_routes fi if [ "$old_ip_address" != "$new_ip_address" ]; then ADD="-D" INS="-D" update_local_redirect ${old_ip_address} ADD="-A" INS="-I" update_local_redirect ${new_ip_address} fi ;; *) warn "route-exit - unknown reason ${reason} used" ;; esac 

- बिलिंग प्रदाताओं वाली साइटों के लिए एक स्थिर मार्ग जोड़ें। मुझे प्रदाता के लॉक की आवश्यकता नहीं है, लेकिन आप इसे भी जोड़ सकते हैं DNS सर्वर द्वारा प्रमाणीकरण।
- रेनव मोड के लिए एक पुनर्संरचना जोड़ा (यदि प्रदाता में अचानक कुछ परिवर्तन होता है), लेकिन अभी तक इसका परीक्षण नहीं किया है।

 # cat /etc/network/scripts/firewall #!/bin/bash . /etc/network/scripts/functions get_ip $IFACE log "$0 $IFACE $LOGICAL $ADDRFAM $METHOD $MODE $PHASE $VERBOSITY $IP" case $MODE in start) INS="-I" ADD="-A" echo -n $IP > $DHCPLIB/ip_address.$IFACE ;; stop) INS="-D" ADD="-D" echo -n > $DHCPLIB/ip_address.$IFACE ;; *) INS="-C" ADD="-C" warn "Wrong MODE:$MODE" ;; esac case $IFACE in --all) case $PHASE in pre-down|post-up) # skip proxy for local addresses for j in $IFLAN $IFWAN; do get_ip $j update_local_redirect $IP done ;; post-up|pre-down) ;; esac ;; lo) ;; *) if [[ "$IFLAN" == *$IFACE* ]]; then # LAN case $PHASE in pre-up|post-down) cmd iptables $INS INPUT -p tcp -i $IFACE --dport 22 -j ACCEPT ;; post-up|pre-down) ;; *) warn "Wrong PHASE:$PHASE" ;; esac fi if [[ "$IFWAN" == *$IFACE* ]]; then # WAN case $PHASE in pre-up|post-down) # by default close all input connections cmd iptables $ADD INPUT -p tcp -i $IFACE --dport 1:10000 -j DROP cmd iptables $ADD INPUT -p udp -i $IFACE --dport 1:10000 -j DROP # open ports from list for PORT in $WAN_PORTS_OPEN; do cmd iptables $INS INPUT -p tcp -i $IFACE --dport $PORT -j ACCEPT done ;; post-up|pre-down) cmd iptables -t nat $ADD POSTROUTING -o $IFACE -j MASQUERADE ;; *) warn "Wrong PHASE:$PHASE" ;; esac fi ;; esac 

फ़ायरवॉल नियम। सामान्य तालिकाओं के लिए, हम नेट-पोस्ट और प्री-डाउन में प्री-अप और पोस्ट-डाउन के समय लिखते हैं।

 # cat /etc/network/scripts/autoroute #!/bin/sh # Script for cron to monitor WAN interfaces # and (in future) SQUID status . /etc/network/scripts/functions CURRENT_ROUTE_DEV=`ip route show | grep default | awk '{print $5}'` unset ROUTE_GOOD PING_RESULTS="" for i in $IFWAN; do if [ -z $ROUTE_GOOD ]; then PING_RESULT=`ping -c$PING_COUNT -q $HOST_TO_PING -I $i | grep 'packet loss' | awk '{print $6}'` # If no route t host then set to 100% loss if [ -z $PING_RESULT ]; then warn "$0 No route to host $HOST_TO_PING on $i" PING_RESULT='100%' fi if [ $PING_RESULT = '0%' ]; then ROUTE_GOOD=$i if [ -z $CURRENT_ROUTE_DEV ]; then log "$0 Adding default route to $i" cmd route add default gw `cat $DHCPLIB/routers.$i` elif [ $CURRENT_ROUTE_DEV != $i ]; then log "$0 Change default route from $CURRENT_ROUTE_DEV to $i" cmd route del default cmd route add default gw `cat $DHCPLIB/routers.$i` fi else log "$0 loss $PING_RESULT on $i" fi fi PING_RESULTS="$PING_RESULTS $PING_RESULT" done if [ -z $ROUTE_GOOD ]; then warn "$0 lost all internet connections ($PING_RESULTS loss)" fi 

यह सरल है: हम प्राथमिकता के क्रम में पिंग करते हैं। सबसे अच्छा मिला - स्विच। कुछ भी हो, लॉग में लिखें।

और अंत में
 # cat /etc/cron.d/autoroute PATH="/usr/bin:/bin:/usr/sbin:/sbin" */5 * * * * root /etc/network/scripts/autoroute 

 # cat /etc/logrotate.conf | tail # system-specific logs may be configured here /var/log/network-scripts.log { weekly missingok rotate 7 compress } 


सिमलिंक
 /etc/dhcp/dhclient-enter-hooks.d/route-enter -> ../../network/scripts/route-enter /etc/dhcp/dhclient-exit-hooks.d/route-exit -> ../../network/scripts/route-exit /etc/network/if-pre-up.d/firewall -> ../scripts/firewall /etc/network/if-down.d/firewall -> ../scripts/firewall /etc/network/if-up.d/firewall -> ../scripts/firewall /etc/network/if-post-down.d/firewall -> ../scripts/firewall 

Source: https://habr.com/ru/post/In199478/


All Articles