natdとipfwを使用した2つの外部インターフェイス上のサービスのアクセシビリティの構成

小規模オフィスの古典的なインターネット接続スキーム。








この図は、小規模オフィスをインターネットに接続するための一般的なスキームを示しています。

インターネットアクセス(ISP1)およびバックアップ(ISP2)のメインチャネルの場合、メインチャネルに問題がある場合に切り替えます。

スイッチングは通常、ルーターのデフォルトゲートウェイを変更することによって行われます。



また、ルーターに外部からアクセスできるサービスがある場合、これらのサービスは、インターネット上の現在アクティブなチャネルの外部アドレスでのみ使用可能になります。非アクティブなチャネルから受信した要求に対する応答はアクティブなチャネルを介して送信され、正常に失われます。 あるフォーラムでアドバイスされたように、プロバイダーとのBGP相互作用を確立することは、大砲からスズメを撃つときの珍しい狂気であり、すべてのプロバイダーがそれを行うわけではありません。



ipfwとnatdを使用して、両方の外部アドレスで同時にサービスを利用可能にする方法を説明します。





ソースデータ

FREEBSD 6.3を搭載したルーター

ローカルネットワーク192.168.1.0/24、これを配置します。

IPアドレス192.168.1.1のローカルネットワークを調べるRe0インターフェイス

IPアドレス111.111.111.1でISP1を介してインターネットを見ているxl0インターフェイス

IPアドレス222.222.222.1でISP2を介してインターネットを見ているxl1インターフェイス

111.111.111.1と222.222.222.1で同時に利用可能にする必要があるサービス。

最初のプロバイダーのゲートウェイ:111.111.111.2

2番目のプロバイダーのゲートウェイ:222.222.222.2



すでにhabrでちらつくPFによる同様の問題解決策 PFには、この問題を解決する魔法の返信()があります。 IPFWでは、ソリューションはそれほど簡単ではありませんが、順番に始めましょう。



インスタンスの両方の外部インターフェイスでnatdをハングアップする必要があり、それらの間で変換テーブルを共有する必要があります。



2つのインスタンスで動作するようにnatdを構成しましょう

/etc/rc.conf

natd_program="/sbin/natd" natd_enable="YES" natd_flags="-f /etc/natd.conf"
      
      





インターフェイスを指定しないことに注意してください。



/etc/natd.conf

 log instance default interface xl0 port 8668 use_sockets yes same_ports yes instance xl1 interface xl1 port 8669 use_sockets yes same_ports yes globalport 8670
      
      





インスタンスのデフォルトが必要です。

一部のマニュアルで推奨されているように、natdの2つのインスタンスを手動で実行すると、それぞれに変換テーブルがあるため、何も機能しません。



IPFWを構成する

ここでは安全規則を示しません。これは密接な問題であり、それぞれの場合に異なる要件とタスクがあるため、これらの規則を好みに追加します。



/etc/rc.firewall

 ipfw="/sbin/ipfw -q " local="re0" ISP1="xl0" ISP2="xl1" localnet="192.168.1.0/24" ISP1_ip="111.111.111.1" ISP2_ip="222.222.222.1" ISP1_gw="111.111.111.2" ISP2_gw="222.222.222.2" nat_ISP1="8668" nat_ISP2="8669" nat_glob="8670" ${ipfw} -f flush #        . # sshd ${ipfw} add 20 allow tcp from any to me 22 # Web Server ${ipfw} add 25 allow tcp from any to me 80 # MailServer ${ipfw} add 26 allow tcp from any to me 25 ${ipfw} add 27 allow tcp from any to me 110 #   . #            ,         ,     . ${ipfw} add 100 fwd ${ISP1_gw} ip from ${ISP1_ip} to not ${localnet} ${ipfw} add 200 fwd ${ISP2_gw} ip from ${ISP2_ip} to not ${localnet} #        ,   #   ${ipfw} add 400 skipto 1000 all from any to any in recv ${local} ${ipfw} add 410 skipto 2000 all from any to any out xmit ${local} #   ${ipfw} add 500 skipto 3000 all from any to any in recv ${ISP1} ${ipfw} add 550 skipto 4000 all from any to any out xmit ${ISP1} ${ipfw} add 600 skipto 5000 all from any to any in recv ${ISP2} ${ipfw} add 650 skipto 6000 all from any to any out xmit ${ISP2} #        .      ,             ${ipfw} add 900 deny all from any to any #   ${ipfw} add 1000 allow all from any to any #   ${ipfw} add 2000 allow all from any to any # ISP1  (      natd) ${ipfw} add 3000 divert ${nat_ISP1} ip from any to ${ISP1_ip} ${ipfw} add 3010 allow all from any to any # ISP1  (   ) #    natd   globalport ${ipfw} add 4000 divert ${nat_global} ip from ${localnet} to any #       ,  natd         ,     #     ,           ${ipfw} add 4010 allow all from ${ISP1_ip} to any #     ,        . ${ipfw} add 4020 fwd ${ISP2_gw} ip from ${ISP2_ip} to any #   natd   ,        ,       natd ${ipfw} add 4030 divert ${nat_ISP1} ip from ${localnet} to any #   . ${ipfw} add 4040 allow all from any to any #      # ISP2  ${ipfw} add 5000 divert ${nat_ISP2} ip from any to ${ISP2_ip} ${ipfw} add 5010 allow all from any to any # ISP2  ${ipfw} add 6000 divert ${nat_global} ip from ${localnet} to any ${ipfw} add 6010 allow all from ${ISP2_ip} to any ${ipfw} add 6020 fwd ${ISP1_gw} ip from ${ISP1_ip} to any ${ipfw} add 6030 divert ${nat_ISP2} ip from ${localnet} to any ${ipfw} add 6040 allow all from any to any
      
      





すべてのルールは2つのプロバイダーに対して同じように記述されているため、チャネルの変更は、ルーターのメインゲートウェイを置き換えるだけで実行されます。 ルールを変更する必要はありません。



自動化のために、メインチャネルを介してリソースへの静的ルートを作成し、その可用性を監視できます。 使用できない場合は、プライマリゲートウェイをバックアップチャネルゲートウェイに変更します。



便利なリンク:

男の人

男ipfw



UPD



ルーティングスイッチスクリプト:

 #!/bin/sh IP1=111.111.111.1 IP2=222.222.222.1 GW1=111.111.111.2 GW2=222.222.222.2 /sbin/ping -q -c 1 -S $IP1 yandex.ru > /dev/null 2>&1 if [ $? != 0 ]; then /sbin/ping -q -c 1 -S $IP2 yandex.ru > /dev/null 2>&1 if [ $? = 0 ]; then if [ ! -f /tmp/gw.changed ]; then /sbin/route change default $GW2 && touch /tmp/gw.changed fi fi else if [ -f /tmp/gw.changed ]; then /sbin/route change default $GW1 && rm /tmp/gw.changed fi fi
      
      







つまり、目的のインターフェイスを介してリソースに「ping」するだけです(pingコマンドの-Sフラグ)

リソースがメインチャネルを介して利用できない場合:

-バックアップチャネルの操作性を確認します。

-バックアップチャネルゲートウェイへのデフォルトルートを再構成します。

-「ラベル」/tmp/gw.changedを残し、ゲートウェイの変更を通知します。



次回の実行時(たとえば、スクリプトは1分間に1回cronで実行できます)、GW1が正常で「ラベル」がある場合、メインゲートウェイをその場所に戻します。 両方のゲートウェイが使用できない場合、現在の状態は変更されません。



この方法の主な利点は、透明性と単純さです。

短所-小さいながらも非生産的なトラフィックコストであるにもかかわらず、特に高いチャネル負荷での誤検知のゼロ以外の確率、一定の慣性。



両方のチャネルの通常の操作中にリソース自体(この例ではYandex)が一時的に使用できなくなっても、操作性は確認されないため、チャネルの切り替えは行われません。



All Articles