F 5負荷等化にiRuleを使用してSNAT poolを選択


需要:iRuleを使って異なる目的のアドレスあるいはポートによって、SNATアドレスを選択して、同じバックグラウンドノードを実現して、異なる目的のアドレスあるいは目的のポートにアクセスする時、ソースのアドレスも異なっています;
ネットワーク概要:イントラネット:バックグラウンドノードserver:192.168.10.71対応VLAN:Internal-selfIP:192.168.10.1外部ネットワーク:クライアントクライアントクライアントクライアント:172.16.10.172対応VLAN:external-selfIP:172.16.10.1
1.需要一:負荷分散機能(clientアクセスサーバ)
ソリューション1、
  virtual server :http_VS: 172.16.10.100:80
VS        pool: 
Pool member: 192.168.10.71:80

2.需要二:SNAT機能(serverがclientにアクセスする)、1つ以上のイントラネットノードが1つのソースアドレスに変換する;
ソリューション1、
  SNAT :out_snat: 172.16.10.71 
    snat out_snat  {
   translation 172.16.10.71
   origin 192.168.10.71             //           
}   

ソリューション2、
snat out_snat2 {
   translation 172.16.10.250
   origin 0.0.0.0 mask 0.0.0.0          //           
}

ソリューション3、
snat out_snat3 {
   translation 172.16.10.188
   origin 0.0.0.0 mask 0.0.0.0
   vlan internal enable         //   vlan --internal      
}

3.需要3:iSNAT機能(serverアクセスクライアント)、1つのイントラネットノードが複数のソースアドレスに変換する;
ソリューション1、
        pool(        +     pool  ,  iRule  ): 
        pool http_pool { member 172.16.10.71:80 }
        pool ftp_pool { member 172.16.10.71:21 }

     snatpool:
snatpool SNATPool_21 { member 172.16.10.21 }
snatpool SNATPool_80 { member 172.16.10.80 }
snatpool Internal_SNAT_Pool { member 172.16.10.250 }

  virtual server :snat_VS: 0.0.0.0:0
VS    iRule :iSNAT_Rule,    :
rule iSNAT_Rule {
when CLIENT_ACCEPTED {                  /*      */
    set MYPORT [TCP::local_port]        /*        */
    set S_IP [IP::client_addr]          /*            */
    log local0. "Port is $MYPORT"       /*     ,   /var/log/ltm  */
    log local0. " S_IP is $S_IP"
if {[IP::addr [IP::client_addr] equals 192.168.10.71]}    /*           */
        { switch $MYPORT {              /*         ,    SNAT   */
            80 {
                    snatpool SNATPool_80
                    pool http_pool      /*           */
                    }
            21 {
                    snatpool SNATPool_21
                    pool ftp_pool
                    }
            default {
                    snatpool Internal_SNAT_Pool
                    pool other_pool
                    }
           }
         }
else {                          /*          ,         */
      snatpool Internal_SNAT_Pool 
      pool http_pool
      }
    }
}
//             iRule
        ,BIG-IP        :

(serverからclientにアクセスするhttpサービスなど)HTTP要求がserver側からBIG-IPシステムに到達し、VS 0.0にヒットする.0.0:0;iSNAT_Ruleが参照され、要求パケットがチェックされ、BIG-IPシステムがSNATPoolを選択80と負荷等化pool http_pool;round robin負荷等化アルゴリズムを採用し、BIG-IPシステムはhttp_からpoolで次のホップアドレス172.16が選択する.10.71;SNATPool_80には翻訳アドレス172.16がある.10.80 ;BIG-IPシステムは、この翻訳アドレスプールからランダムにアドレス172.16を選択する.10.80(本例は固定ソースアドレス翻訳であるため、翻訳アドレスプールには1つしか選択できない).最後に、BIG-IPシステムはクライアントソースIPアドレスをアドレス172.16に翻訳する.10.80、要求パケットを172.16に転送する.10.71:80;
この案では、従来のSNATが失効することは禁物である、優先度は7層を先として順次減少するため、0.0である.0.0のvirtual serverの優先度は通常のSNATより高いので、iRuleで詳細を考慮します.
ソリューション2、
        pool(        +     pool  ,  iRule  ): 
        pool http_pool { member 172.16.10.71:80 }

  virtual server :client_VS: 192.168.10.237:0
VS    iRule :iSNAT_Rule2,    :
rule iSNAT_Rule2 {
when CLIENT_ACCEPTED {
    set MYPORT [TCP::local_port]
    log local0. "Port is $MYPORT"
    switch $MYPORT {
    80 {
            snatpool SNATPool_80
            pool http
            }
    21 {
            snatpool SNATPool_21
            pool ftp_pool
            }
        default {
            snatpool Internal_SNAT_Pool
            pool http
            }
        }
    }
}

このスキームは、イントラネットセグメントでアクセスのニーズが多い場合に適しています.この方式はvirtual serverを相対的なイントラネットセグメントに確立することを採用して、clientにアクセスしてイントラネットセグメントのvirtual serverになって、BIGIPの処理を経た後にiRuleの中のあるSNATpoolに命中して、ソースアドレスはSNATpoolの中で選択可能なアドレスになって、目的のアドレスはpoolの中の172.16に転化します.10.71、要求パケットを172.16に転送する.10.71:80;
内部ネットワークセグメント内の他のノードも外部ネットワークにアクセスする必要があり、1対のマルチソースアドレス変換の必要がなければ、正常なSNAT方式で完全に行うことができ、互いに衝突しない.