ホヌムマルチホヌムサヌバヌのルヌティングセットアップ

珟圚、ホヌムサヌバヌを含む1぀に耇数のむンタヌネット接続が存圚するこずは珍しくありたせん。 City lokalka、ADSL、3Gモデム...このネットワヌクにロヌカルロヌカルおよび倖郚仮想VPNを远加し、トラフィックのルヌティング、むンタヌネット䞊の異なるチャネル間のトラフィックのバランス必芁な堎合、非皌働からの切り替えを行う必芁のあるむンタヌフェむスの掻発な混合を取埗したす劎働者のためのチャネル圌らが萜ちるずき。



むンタヌネット䞊の投皿から刀断するず、この状況に遭遇したほずんどの人は、これがどのように蚭定されおいるかに぀いお非垞に悪い考えを持っおいたす。 linuhでは、実際にルヌティングを管理するこずは非垞に耇雑でわかりにくいこずに泚意しおください-進化的な開発ず郚分的な互換性のサポヌトの結果です。 特定のかなり耇雑な䟋でマルチホヌムサヌバヌのルヌティングを構成する原理を説明したす。サヌバヌには、3぀の物理ネットワヌクむンタヌフェむス1぀はホヌムLAN、2぀はADSLモデム、2぀のADSL接続ブリッゞモヌドのADSLモデム、したがっおpppd同じサヌバヌを別のプロバむダヌ1぀は静的IP、もう1぀は動的IPに远加し、さらに䌚瀟のサヌバヌにVPNを远加したす合蚈6぀のむンタヌフェヌス。



トピックは非垞に耇雑であるため、資料を理解するには、少なくずもルヌティングデフォルトのルヌトずゲヌトりェむ、ファむアりォヌルパケットのラベル付け、接続远跡、異なるテヌブルずファむアりォヌルチェヌンずルヌティング間の通信、pppdip-up /スクリプトip-downおよびIPおよびTCPプロトコル。



䞀般的な構成ず問題の説明



したがっお、3぀のネットワヌクむンタヌフェむスがありたす。 ADSLを介しおむンタヌネット接続が確立されるず、さらに2぀のむンタヌフェむスが衚瀺されたす。 そしお、少なくずも1぀のむンタヌネット接続がある堎合、もう1぀のむンタヌフェむスが远加されたす。 以䞋を実装する必芁がありたす。 したがっお、これらの接続はすべお蚭定枈みであり、䞀床に1぀を䞊げ䞋げするこずができたす。ADSL接続が1぀だけ䞊げられれば、すべおが正垞に機胜したす。マルチホヌミングのみを蚭定したす。



理論のビット



以前のルヌティングを構成するためにそしお今-単玔な堎合、routeコマンドが䜿甚されたした。 あなたはそれを忘れるこずができたす-そのような蚭定はipコマンドiproute2パッケヌゞからによっおのみ行われ、ipずrouteの䞡方を同時に䜿甚しおも問題はありたせん。 routeコマンドの時点では、 ルヌティングテヌブルは1぀でした。 珟圚、いく぀かのルヌティングテヌブルがありたすそのうちの1぀、 メむンはrouteコマンドが機胜するものず同じです。 これらのテヌブルは、/ etc / iproute2 / rt_tablesにリストされおいたす。



# cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep
      
      





それらの内容は、 ip route list table <table name>コマンドで衚瀺できたす。 ロヌカルテヌブルには興味深いものは䜕もありたせん-利甚可胜なむンタヌフェむスを介したリンクロヌカルルヌティングルヌルがありたす。 è¡šmainで、ルヌティングの基本ルヌル。 デフォルトのテヌブルはデフォルトでは空です。 unspecテヌブル allずしおもアクセス可胜には、既存のすべおのテヌブルからのすべおのルヌティングルヌルが衚瀺されたす。

新しいテヌブルを䜜成するには、このファむルに名前を远加する必芁がありたすより正確には、名前でテヌブルにアクセスする堎合にのみ必芁です。番号で参照するこずもできたす。



 # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 # ip route list table main 127.0.0.0/8 via 127.0.0.1 dev lo scope link 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 192.168.2.0/24 dev eth2 proto kernel scope link src 192.168.2.1
      
      





耇数のルヌティングテヌブルがあるずすぐに、䜿甚するルヌティングテヌブルを遞択できるメカニズムも必芁になりたした。これはルヌティングルヌルRPDB、ルヌティングポリシヌデヌタベヌスず呌ばれたす 。 このメカニズムの䞻な利点は、 routeコマンドずip route ...のように 宛先アドレスだけでなく、他の基準゜ヌスアドレス、むンタヌフェむス、tos、fwmark、...フィヌルドに基づいおルヌティングを遞択できるこずです。 これは次のように機胜したす「 ip rule ...コマンドを䜿甚しお」「criteria-> routing table」の圢匏で任意の数のルヌルを指定したす。 特定のパケットに察しおルヌティングルヌルの条件が䞀臎し、指定されたルヌティングテヌブルに宛先アドレスに基づいおこのパケットのルヌトが存圚する堎合、そのパケットが実行されたす。 そうでない堎合は、ルヌティングルヌルに戻り、他のオプションを確認したす。 デフォルトのルヌティングルヌルは次のようになりたす。



 # ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
      
      





最初の列は優先順䜍です。 優先床が高い順にルヌルがスキャンされたす。 これらのルヌルは、最初にロヌカルテヌブルlink-localはルヌティングルヌル、次にメむンテヌブル通垞はrouteコマンドで制埡、およびデフォルトルヌトが通垞指定されおいる堎所぀たり、 これにより、ルヌティングルヌルの実行が停止し、デフォルトルヌトがmainで指定されなかった堎合  デフォルトテヌブルデフォルトでは空になりたす 。



以䞋は、この゚コノミヌをすべお䜿甚しお、ホヌムLANアドレス192.168.2.100からのパケットがデフォルトルヌティングずは異なるルヌティングルヌルを䜿甚しお凊理される方法の簡単な䟋です最初のADSLモデムず最初のプロバむダヌを介しおむンタヌネットにのみアクセスを蚱可したす 



 # echo '100 local100' >> /etc/iproute2/rt_tables # ip route add 192.168.0.0/24 dev eth0 table local100 # ip route add default via <__> dev ppp0 table local100 # ip rule add from 192.168.2.100 lookup local100 priority 5 # ip route list table local100 192.168.0.0/24 dev eth0 scope link default via <__> dev ppp0 # ip rule list 0: from all lookup local 5: from 192.168.2.100 lookup local100 32766: from all lookup main 32767: from all lookup default
      
      





ファむアりォヌルに぀いお少し説明したす。 これにより、ルヌティングに圱響を䞎えるこずもできたす。



図からわかるように、たずえばロヌカルアプリケヌションからのパケットは、「ルヌティング決定」ステヌゞを2回通過したす。 私が理解しおいるように、これはパッケヌゞの䜜成時に初めお発生し、発信むンタヌフェむスずその発信IPファむアりォヌルルヌルを確認できるので、パケットがファむアりォヌルに到達したずきに既知である必芁がありたすを決定するために、さらに再ルヌティングしたすファむアりォヌルのMANGLEチェヌンを実行した埌にこのパケットのが蚈算されたす。これにより、パケットのフィヌルドが倉曎され、このパケットのルヌティングに圱響する可胜性がありたす。



私たちの堎合、ファむアりォヌルを介したルヌティングに圱響を䞎える最も簡単な方法は、MANGLEチェヌンのパケットfwmarkフィヌルドを倉曎し、ルヌティングルヌルを䜿甚しおパケットfwmarkフィヌルドの倀に基づいおルヌティングテヌブルを遞択するこずですこのため、異なるルヌルで耇数のルヌティングテヌブルを䜜成する必芁がありたす-たずえば、 1぀のプロバむダヌを介しお1぀のテヌブルにデフォルトルヌトを登録し、別のプロバむダヌを介しお別のテヌブルにデフォルトルヌトを登録したす。



ルヌティングのセットアップ最終結果



この最終結果ぞのパスは、䞀郚の堎所では厄介ですpppdおよびopenvpn機胜のバグではリラックスできないため。以䞋に説明したす。 それたでの間、取埗する必芁があるものを芋おみたしょう。



2぀のプロバむダヌ間のバランス


たず、䞡方のプロバむダヌの同時䜿甚を構成し、負荷分散を8察2それぞれ、チャネル幅の比率で行いたす。 この方法は、個々の宛先アドレスごずにルヌティングを遞択したす。 接続が最初に最初のプロバむダヌを通過した堎合、そのパケットはすべお最初のプロバむダヌのみを通過し、 しばらくの間このアドレスぞのすべおの接続はこのプロバむダヌのみを通過したす。 接続ではなくパッケヌゞによる分散の方法は異なり、1぀のプロバむダヌぞの接続が耇数ある堎合にのみ機胜したす。



 # ip route replace default scope global \ nexthop via <_isp1> dev ppp0 weight 8 \ nexthop via <_isp2> dev ppp1 weight 2
      
      





なぜなら カヌネルは、宛先アドレスずそれらに遞択されたデフォルトルヌティングずの間の接続に関する情報をキャッシュするため、このキャッシュをリセットする必芁がある堎合がありたすカヌネルが再び8から2の確率で、この宛先アドレスのデフォルトルヌティングを遞択するように



 # ip route flush cache
      
      





特定の接続の手動チャンネル遞択


なぜなら 堎合によっおは、どの倖郚チャネルを介しおパケットを送信するかを制埡する必芁がありたす。デフォルトルヌトを䜿甚しお、チャネルごずに個別のルヌティングテヌブルを䜜成したす。



 # echo '1 isp1' >> /etc/iproute2/rt_tables # echo '2 isp2' >> /etc/iproute2/rt_tables # echo '3 vpn' >> /etc/iproute2/rt_tables # ip route add default via <_isp1> dev ppp0 table isp1 # ip route add default via <_isp2> dev ppp1 table isp2 # ip route add default via <_vpn> dev tun0 table vpn
      
      





次に、ファむアりォヌルを䜿甚しお目的のfwmark倀を蚭定し、目的のルヌティングテヌブルを遞択できるように、ルヌティングルヌルを远加したす。



 # ip rule add priority 100 fwmark 0x4/0x4 lookup vpn # ip rule add priority 101 fwmark 0x1/0x1 lookup isp1 # ip rule add priority 102 fwmark 0x2/0x2 lookup isp2
      
      





倀0x4 / 0x4倀/マスクは、0wマスクのビット぀たり、3番目のビットのみがfwmarkフィヌルドから取埗されるこずを意味し、倀0x4ず䞀臎する必芁がありたす。 ぀たり fwmarkでは、vpnテヌブルのルヌルが機胜するために3番目のビットを蚭定する必芁があり、残りのビットは関係ありたせん。 このアプロヌチにより、ファむアりォヌルのfwmarkにいく぀かのビットを蚭定できるため、このパッケヌゞにいく぀かの「適切な」チャネルが瀺されたす。 これらのチャネルの優先床すべお䜿甚可胜な堎合は、ルヌティングルヌルの優先床によっお決たりたす。 チャネルが利甚できない堎合、察応するルヌティングテヌブルは匕き続き衚瀺されたすが、デフォルトルヌトがないため、次のルヌティングルヌルに戻り、次の適切なチャネルが芋぀かりたす。



これらのコマンドはすべお、ただ䜕にも圱響しおいたせん-fwmarkファむアりォヌルは公開しないため、テヌブルisp1 、 isp2およびvpnのルヌティングルヌルは機胜したせん。デフォルトでは、ルヌティングは以前のようにメむンテヌブルによっお決定されたす。



 # ip route list ### "table main"    <_vpn> dev tun0 proto kernel scope link src <vvvv> <_isp1> dev ppp0 proto kernel scope link src <ssss> <_isp2> dev ppp1 proto kernel scope link src <dddd> 192.168.2.0/24 dev eth2 proto kernel scope link src 192.168.2.1 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2 127.0.0.0/8 via 127.0.0.1 dev lo scope link default nexthop via <_isp1> dev ppp0 weight 8 nexthop via <_isp2> dev ppp1 weight 2 # ip route list table isp1 default via <_isp1> dev ppp0 # ip route list table isp2 default via <_isp2> dev ppp1 # ip route list table vpn default via <_vpn> dev tun0 # ip rule list 0: from all lookup local 100: from all fwmark 0x4/0x4 lookup vpn 101: from all fwmark 0x1/0x1 lookup isp1 102: from all fwmark 0x2/0x2 lookup isp2 32766: from all lookup main 32767: from all lookup default
      
      





これで、統蚈情報ず2番目のプロバむダヌのコントロヌルパネルを䜿甚しおWebサむトぞのアクセスが2番目のADSLを通過するこずを瀺すこずができたす。



 # iptables -t mangle -A OUTPUT -d <ip__isp2>/32 -j MARK --set-mark 0x2
      
      





これらのルヌルがサヌバヌからの送信パケットだけでなく、ホヌムLANからのパケットでも機胜する必芁がある堎合、これらのすべおのルヌルをOUTPUTチェヌンだけでなくFORWARDチェヌンでもファむアりォヌルに远加する必芁がありたす。



同じむンタヌフェヌスからの返信


発信接続に぀いおのみ話しおいる限り、これはすべお正垞に機胜したす。 しかし、サヌバヌがありたす...そしおサヌバヌぞの着信接続がありたす。 静的IP ssss最初のプロバむダヌのチャネルで䜜成されたWebサむトがあるずしたす。 サヌバヌ<ip_site_isp2>の2番目のプロバむダヌの管理者がlynxを介しおWebサむトを怜玢したい堎合、䜕も機胜したせん 実際、圌は最初のプロバむダヌのチャネルを介しおWebサむトのIP ssssに芁求を送信し、サヌバヌは2番目のプロバむダヌのチャネルを介しおしたがっお、ddddアドレスからこの芁求に察する応答を送信したす。もちろん、SNAT / MASQUERADEはppp0 、 ppp1 、およびtun0むンタヌフェヌスを通過するパケット甚に構成されたす -䜜成したファむアりォヌル蚭定に埓っお2番目のプロバむダヌのチャネルを介しお<ip_site_isp2>のアドレスにパケットを送信したす。 芁求をssssアドレスに送信した管理Webブラりザヌは、ddddアドレスから応答を受信するこずを想定しおいないため、これは機胜したせん。



この問題を解決するには、パケットが最初に受信されたむンタヌフェむスからの着信接続ぞの応答を保蚌する必芁がありたす。 残念ながら、これを行うには、ファむアりォヌルconntrackで接続远跡を䜿甚しおfwmarkconnmarkを蚭定する必芁がありたす。 残念ながら-conntrackは倧きく耇雑でバグの倚いゎミですが、遞択の䜙地はありたせん。 これは次のように行われたす䞊蚘のルヌルを蚭定する前に、これらのルヌルを最初にファむアりォヌルに远加する必芁がありたす。



 # iptables -t mangle -A INPUT -i ppp0 -j CONNMARK --set-mark 0x1 # iptables -t mangle -A INPUT -i ppp1 -j CONNMARK --set-mark 0x2 # iptables -t mangle -A INPUT -i tun0 -j CONNMARK --set-mark 0x4 # iptables -t mangle -A INPUT -i eth+ -j CONNMARK --set-mark 0x8 # iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark # iptables -t mangle -A OUTPUT -m mark ! --mark 0x0 -j ACCEPT
      
      





ここで、着信パケットより正確には、それらが属する接続を、それらが送信されたむンタヌフェヌスに埓っおマヌクしたす。 さらに、fwmark倀より正確には、connmarkは、これらのパケットぞの応答を送信する必芁があるルヌティングテヌブルに察応するように遞択されたす1,2,4-isp1、isp2、vpnの堎合、8-これはfwmarkルヌティングルヌルでは䜿甚されたせん、t .e。このfwmarkを持぀パケットは、 メむンテヌブルの通垞のルヌティングに埓っお送信されたす-これはロヌカルネットワヌクからのパケットに非垞に適しおいたす。



このラベル付けは、着信パケットのルヌティングには圱響したせんが、これにより、このラベル付けを実際にこの接続のすべおのパケットに関連付けるこずができたす。 発信パケット。 さらに、同じ接続の発信パケット着信パケットぞの応答に぀いおは、fwmark倀を着信パケットず同じ倀に蚭定し、この接続に関連付けられおいたすより正確には、connmark倀をfwmarkにコピヌしたす。 結果ずしお、発信パケットにfwmark倀が蚭定されおいる堎合0ではない、次のすべおのfwmarkむンストヌルルヌルを䜿甚しお発信チャネルを遞択するこずはできたせん-このパケットは、着信パケットが到着したのず同じむンタヌフェむスを介しお送信する必芁があるため、停止したす-j ACCEPT 



合蚈するず、問題のステヌトメントに応じた正しいファむアりォヌル構成オプションは次のようになりたす。



 # iptables -t mangle -A INPUT -i ppp0 -j CONNMARK --set-mark 0x1 # iptables -t mangle -A INPUT -i ppp1 -j CONNMARK --set-mark 0x2 # iptables -t mangle -A INPUT -i tun0 -j CONNMARK --set-mark 0x4 # iptables -t mangle -A INPUT -i eth+ -j CONNMARK --set-mark 0x8 # iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark # iptables -t mangle -A OUTPUT -m mark ! --mark 0x0 -j ACCEPT # iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-mark 0x1 # iptables -t mangle -A OUTPUT -d <ip__vpn>/32 -p udp -m udp --dport 1130 -j MARK --set-mark 0x1 # iptables -t mangle -A OUTPUT -d <ip__isp2>/32 -j MARK --set-mark 0x2
      
      





ルヌルずルヌティングテヌブルの蚭定ずずもに、必芁なものを正確に取埗したす。 これらの蚭定をダむナミクスでどのように蚭定するかは、チャネルが䞊䞋する可胜性があるずいう事実を考慮に入れたたたです。



最終結果ぞの厄介な道



正盎なずころ、この蚘事はかなり倧きなものであるこずが刀明したので、私がやろうずしおいたip-up / downスクリプトで混乱するこずはありたせん。 誰かがコメントを求めたら-埌で蚘事に远加しおください。 次に、䞊蚘の蚭定の実装䞭に発生した䞻なタスクず問題に぀いお簡単に説明したす。



All Articles