# 設定例集#17: BGP-4：2つのISPに対するマルチホーム（ASパス長の操作による負荷分散）

ドメイン間経路制御プロトコルBGP（Border Gateway Protocol）の設定例です。
ここでは、2つのISPに接続するマルチホームの構成例を示します。
BGPでは、経路情報にさまざまな「属性」を付加することにより、他ASの経路選択プロセスに影響を与えることができます。この例では、各ISPに通知する経路のAS_PATH（ASパス）属性を操作することにより、下りトラフィックの負荷分散を試みます。また、自AS宛でないトラフィックの通過（トランジットサービス）を行わないよう設定します。

## 構成

ここでは、上のような構成のネットワークを例に解説します。
AS 65030は3つのサブネット（プレフィックス）を持っており、ルーターAのeth1インターフェース経由でISP1（AS 65010）と、ルーターBのppp1インターフェース経由でISP2（AS 65020）と接続しています。
AS 65030では、各ISPからの下りトラフィックが次のように負荷分散されることを望んでいます。

- 192.168.10.0/24宛：ルーターA（ISP1）経由
- 192.168.20.0/24宛：ルーターB（ISP2）経由

これを実現するため、AS 65030は各ISPに対し、各プレフィックス（192.168.10.0/24と192.168.20.0/24）のAS_PATH（ASパス）属性を次のように操作してISPに通知します。

- ISP1（ルーターA側）とのeBGPセッション
  - 192.168.10.0/24：AS_PATH=65030
  - 192.168.20.0/24：AS_PATH=65030 65030 65030 65030（自AS番号を3つ余計に追加）
- ISP2（ルーターB側）とのeBGPセッション（IPsecにより保護）
  - 192.168.10.0/24：AS_PATH=65030 65030 65030 65030（自AS番号を3つ余計に追加）
  - 192.168.20.0/24：AS_PATH=65030

ASパスは、プレフィックスがどのASを通って通知されてきたかを示すAS番号のリストです。BGPが経路を選択する場合は、ASパスが最も短い経路を選択します。このことを利用して、特定のプレフィックス宛のトラフィックを受け取りたくない場合に、ASパスを意識的に長くして他のASに通知することができます。
またこの例では、自AS宛のトラフィックだけを受け取るため、自AS内のプレフィックスだけをISP1、ISP2に通知するようにします。
Note

ISP2から学習した経路をISP1に再通知すると、ISP1からISP2に宛てたトラフィックが自ASを通過する可能性があります。複数のASに接続しているときは、不要なトラフィックが自ASに流れ込まないよう、通知する経路情報の選別が必要です。

## 設定開始前に

### 自動設定の確認と削除

本設定例に掲載されているコマンドは、設定がまったく行われていない本製品の初期状態（スタートアップコンフィグなしで起動した状態）から入力することを前提としています。
そのため、通常は erase startup-config を実行し、スタートアップコンフィグが存在しない状態で起動してから、設定を始めてください。
ただし、本製品はスタートアップコンフィグなしで起動した場合でも、特定の条件を満たすと自動的な設定を行うことがあるため、その場合は設定例にしたがってコマンドを入力しても、コマンドがエラーになったり、全体として意図した動作にならない可能性があります。
これを避けるため、設定開始にあたっては次のいずれかの方法をとることをおすすめします。

- ネットワークケーブルを接続せずに起動する。
  起動時に自動設定が実行されるための条件の一つに、特定インターフェースのリンクアップがあります。
  ネットワークケーブルを接続しない状態で起動することにより、自動設定の適用を回避できます。
- 自動設定を手動で削除してから設定を行う。
  前記の方法を採用できず自動設定が適用されてしまった場合は、「自動的な設定内容の削除」にしたがって、これらを手動で削除してから設定を開始してください。

自動設定が行われる条件などの詳細については、AMF応用編のAMFネットワーク未検出時の拡張動作をご参照ください。

### システム時刻の設定

ログなどの記録日時を正確に保ち、各種機能を適切に動作させるため、システム時刻は正確にあわせて運用することをおすすめします。
ご使用の環境にあわせ、次のいずれかの方法でシステム時刻を設定してください。

- 手動で設定する方法 - 「運用・管理」/「システム」
- NTPで自動設定する方法 - 「運用・管理」/「NTP」

## ルーターAの設定

1. LANポートにおいて初期状態で有効化されているスパニングツリープロトコル（RSTP）を無効化します。これにはspanning-tree enableコマンドをno形式で実行します。
   スパニングツリープロトコルの詳細は「L2スイッチング」/「スパニングツリープロトコル」をご覧ください。

       no spanning-tree rstp enable

2. WANポートeth2にIPアドレスを設定します。これにはip addressコマンドを使います。
   IPインターフェースの詳細は「IP」/「IPインターフェース」をご覧ください。

       interface eth2
        ip address 192.168.30.1/24

3. WANポートeth1にIPアドレスを設定します。これにはip addressコマンドを使います。
   IPインターフェースの詳細は「IP」/「IPインターフェース」をご覧ください。

       interface eth1
        ip address 192.168.100.1/24

4. LAN側インターフェースvlan1にIPアドレスを設定します。これにはip addressコマンドを使います。
   IPインターフェースの詳細は「IP」/「IPインターフェース」をご覧ください。

       interface vlan1
        ip address 192.168.10.1/24

5. AS_PATH属性の内容にもとづいて経路情報をフィルタリングするASパスアクセスリストを作成します。
   これにはip as-path access-listコマンドを使います。
   ・list1 - AS_PATHが空、あるいは先頭が自AS番号（65030）の場合にマッチ
   ・list2 - AS_PATHが空の場合にマッチ
   ASパスアクセスリストの詳細は「IP」/「経路制御（フィルタリング）」をご覧ください。

       ip as-path access-list list1 permit ^$
       ip as-path access-list list1 permit ^65030_
       ip as-path access-list list2 permit ^$

6. 各種条件にもとづいて経路情報をフィルタリング・変更するルートマップを作成します。
   これにはroute-mapコマンドとルートマップモードの各種match、setコマンドを使います。
   ここでは、先ほど作成したASパスアクセスリスト「list2」を利用して、AS_PATHが空の経路に自AS番号である「65030」を3個余分に追加するルートマップ「add_myasn」を作成しています。
   ルートマップの詳細は「IP」/「経路制御（フィルタリング）」をご覧ください。

       route-map add_myasn permit 1
        match as-path list2
        set as-path prepend 65030 65030 65030
       route-map add_myasn permit 2

7. 経路制御プロトコルBGPの設定を行います。
   BGPの詳細は「IP」/「経路制御（BGP）」をご覧ください。
   自AS番号を指定してBGPルーティングプロセスを起動します。これにはrouter bgpコマンドを使います。

       router bgp 65030

8. 直結経路とスタティック経路をBGPで再通知します。これにはredistributeコマンドを使います。

        redistribute connected
        redistribute static

9. neighbor remote-asコマンドでルーターB（192.168.30.2）をiBGPピア（自AS 65030 ＝ 対向AS 65030）として指定したのち、該当ピアに対する設定を行います。
   ・neighbor next-hop-self - ルーターBに経路を送信するとき、自分自身をNEXT_HOPとして通知します
   ・neighbor allowas-in - ルーターBから経路を受信するとき、AS_PATH属性に自AS番号を含む経路も受け入れます
   ・neighbor route-map - ルーターBに経路を送信するとき、自分自身が生成した経路には自AS番号を3個余分に追加してから通知します

        neighbor 192.168.30.2 remote-as 65030
        neighbor 192.168.30.2 next-hop-self
        neighbor 192.168.30.2 allowas-in
        neighbor 192.168.30.2 route-map add_myasn out

10. neighbor remote-asコマンドでISP1のルーター（192.168.100.2）をeBGPピア（自AS 65030 ≠ 対向AS 65010）として指定したのち、該当ピアに対する設定を行います。
    ・neighbor allowas-in - ISP1のルーターから経路を受信するとき、AS_PATH属性に自AS番号を含む経路も受け入れます
    ・neighbor filter-list - ISP1のルーターに経路を送信するとき、自AS起源の経路だけを通知します（自AS宛てのトラフィックだけがISP1から流れ込むようにします）

         neighbor 192.168.100.2 remote-as 65010
         neighbor 192.168.100.2 allowas-in
         neighbor 192.168.100.2 filter-list list1 out

11. 以上で設定は完了です。

        end

## ルーターBの設定

1. LANポートにおいて初期状態で有効化されているスパニングツリープロトコル（RSTP）を無効化します。これにはspanning-tree enableコマンドをno形式で実行します。
   スパニングツリープロトコルの詳細は「L2スイッチング」/「スパニングツリープロトコル」をご覧ください。

       no spanning-tree rstp enable

2. WANポートeth2にIPアドレスを設定します。これにはip addressコマンドを使います。
   IPインターフェースの詳細は「IP」/「IPインターフェース」をご覧ください。

       interface eth2
        ip address 192.168.30.2/24

3. WANポートeth1上にPPPoEインターフェースppp1を作成します。これには、encapsulation pppコマンドを使います。
   PPPの詳細は「PPP」/「一般設定」をご覧ください。

       interface eth1
        encapsulation ppp 1

4. PPPインターフェースppp1に対し、PPPoE接続のための設定を行います。
   ・LCP EchoによるPPP接続状態の確認（keepalive）
   ・ユーザー名（ppp username）
   ・パスワード（ppp password）
   ・IPアドレスの固定設定（ip address）
   ・MSS書き換え（ip tcp adjust-mss）
   PPPの詳細は「PPP」/「一般設定」をご覧ください。

       interface ppp1
        keepalive
        ppp username test01@cug
        ppp password test01!
        ip address 10.1.1.1/32
        ip tcp adjust-mss pmtu

5. LAN側インターフェースvlan1にIPアドレスを設定します。これにはip addressコマンドを使います。
   IPインターフェースの詳細は「IP」/「IPインターフェース」をご覧ください。

       interface vlan1
        ip address 192.168.20.1/24

6. 対向ルーターとの間で使用するISAKMPの事前共有鍵を設定します。これにはcrypto isakmp keyコマンドを使います。
   ここでの対向ルーターはISP2のルーターです。

       crypto isakmp key secret address 10.1.1.2

7. ISP2のルーターとのBGP通信をIPsecで保護するため、IPsecトンネルインターフェースtunnel1を作成します。
   トンネルインターフェースの詳細は「VPN」/「トンネルインターフェース」を、IPsecの詳細は「VPN」/「IPsec」をご覧ください。
   これには、interfaceコマンドでトンネルインターフェースを作成し、以下の情報を設定します。
   ・トンネルインターフェースのIPアドレス（ip address）
   ・トンネルインターフェースから送信するデリバリーパケットの始点（自装置）アドレス（tunnel source）
   ・トンネルインターフェースから送信するデリバリーパケットの終点（対向装置）アドレス（tunnel destination）
   ・トンネリング方式（tunnel mode ipsec）
   ・トンネルインターフェースに対するIPsec保護の適用（tunnel protection ipsec）
   ・トンネルインターフェースにおけるMSS書き換え設定（ip tcp adjust-mss）

       interface tunnel1
        ip address 172.16.0.1/30
        tunnel source 10.1.1.1
        tunnel destination 10.1.1.2
        tunnel mode ipsec ipv4
        tunnel protection ipsec
        ip tcp adjust-mss 1260

8. AS_PATH属性の内容にもとづいて経路情報をフィルタリングするASパスアクセスリストを作成します。
   これにはip as-path access-listコマンドを使います。
   ・list1 - AS_PATHが空、あるいは先頭が自AS番号（65030）の場合にマッチ
   ・list2 - AS_PATHが空の場合にマッチ
   ASパスアクセスリストの詳細は「IP」/「経路制御（フィルタリング）」をご覧ください。

       ip as-path access-list list1 permit ^$
       ip as-path access-list list1 permit ^65030_
       ip as-path access-list list2 permit ^$

9. 宛先IPプレフィックスにもとづいて経路情報をフィルタリングするIPプレフィックスリストを作成します。
   これにはip prefix-listコマンドを使います。
   ここでは、ppp1インターフェースのIPアドレスをBGPピアに通知しないようにするためのIPプレフィックスリスト「ppp」を作成しています。
   IPプレフィックスリストの詳細は「IP」/「経路制御（フィルタリング）」をご覧ください。

       ip prefix-list ppp seq 5 deny 10.1.1.1/32
       ip prefix-list ppp seq 10 permit any

10. 各種条件にもとづいて経路情報をフィルタリング・変更するルートマップを作成します。
    これにはroute-mapコマンドとルートマップモードの各種match、setコマンドを使います。
    ここでは、先ほど作成したASパスアクセスリスト「list2」を利用して、AS_PATHが空の経路に自AS番号である「65030」を3個余分に追加するルートマップ「add_myasn」を作成しています。
    ルートマップの詳細は「IP」/「経路制御（フィルタリング）」をご覧ください。

        route-map add_myasn permit 1
         match as-path list2
         set as-path prepend 65030 65030 65030
        route-map add_myasn permit 2

11. 経路制御プロトコルBGPの設定を行います。
    BGPの詳細は「IP」/「経路制御（BGP）」をご覧ください。
    自AS番号を指定してBGPルーティングプロセスを起動します。これにはrouter bgpコマンドを使います。

        router bgp 65030

12. 直結経路をBGPで再通知します。これにはredistributeコマンドを使います。

         redistribute connected

13. neighbor remote-asコマンドでISP2のルーター（172.16.0.2）をeBGPピア（自AS 65030 ≠ 対向AS 65020）として指定したのち、該当ピアに対する設定を行います。
    ここでは、ISP2のルーターを、同ルーターとの間に張ったIPsecトンネル上のIPアドレスで指定しています。そのため、ISP2とのBGP通信はIPsecトンネル経由で行われることになります。
    ・neighbor allowas-in - ISP2のルーターから経路を受信するとき、AS_PATH属性に自AS番号を含む経路も受け入れます
    ・neighbor prefix-list - ISP2のルーターに経路を送信するとき、ppp1インターフェースのIPアドレスを通知しないようにします
    ・neighbor filter-list - ISP2のルーターに経路を送信するとき、自AS起源の経路だけを通知します（自AS宛てのトラフィックだけがISP2から流れ込むようにします）

         neighbor 172.16.0.2 remote-as 65020
         neighbor 172.16.0.2 allowas-in
         neighbor 172.16.0.2 prefix-list ppp out
         neighbor 172.16.0.2 filter-list list1 out

14. neighbor remote-asコマンドでルーターA（192.168.30.1）をiBGPピア（自AS 65030 ＝ 対向AS 65030）として指定したのち、該当ピアに対する設定を行います。
    ・neighbor next-hop-self - ルーターAに経路を送信するとき、自分自身をNEXT_HOPとして通知します
    ・neighbor allowas-in - ルーターAから経路を受信するとき、AS_PATH属性に自AS番号を含む経路も受け入れます
    ・neighbor prefix-list - ルーターAに経路を送信するとき、ppp1インターフェースのIPアドレスを通知しないようにします
    ・neighbor route-map - ルーターAに経路を送信するとき、自分自身が生成した経路には自AS番号を3個余分に追加してから通知します

         neighbor 192.168.30.1 remote-as 65030
         neighbor 192.168.30.1 next-hop-self
         neighbor 192.168.30.1 allowas-in
         neighbor 192.168.30.1 prefix-list ppp out
         neighbor 192.168.30.1 route-map add_myasn out

15. IPsec対向装置への経路をスタティックに登録します。これにはip routeコマンドを使います。
    IP経路設定の詳細は「IP」/「経路制御」をご覧ください。

        ip route 10.1.1.2/32 ppp1

16. 以上で設定は完了です。

        end

## 設定の保存

設定が完了したら、現在の設定内容を起動時コンフィグとして保存してください。これには、copyコマンドを「`copy running-config startup-config`」の書式で実行します。

    awplus# copy running-config startup-config
    Building configuration...
    [OK]

また、write fileコマンド、write memoryコマンドでも同じことができます。

    awplus# write memory
    Building configuration...
    [OK]

その他、設定保存の詳細については「運用・管理」/「コンフィグレーション」をご覧ください。

## ルーターAのコンフィグ

    !
    no spanning-tree rstp enable
    !
    interface eth2
     ip address 192.168.30.1/24
    !
    interface eth1
     ip address 192.168.100.1/24
    !
    interface vlan1
     ip address 192.168.10.1/24
    !
    ip as-path access-list list1 permit ^$
    ip as-path access-list list1 permit ^65030_
    ip as-path access-list list2 permit ^$
    !
    route-map add_myasn permit 1
     match as-path list2
     set as-path prepend 65030 65030 65030
    route-map add_myasn permit 2
    !
    router bgp 65030
    !
     redistribute connected
     redistribute static
    !
     neighbor 192.168.30.2 remote-as 65030
     neighbor 192.168.30.2 next-hop-self
     neighbor 192.168.30.2 allowas-in
     neighbor 192.168.30.2 route-map add_myasn out
    !
     neighbor 192.168.100.2 remote-as 65010
     neighbor 192.168.100.2 allowas-in
     neighbor 192.168.100.2 filter-list list1 out
    !
    end

## ルーターBのコンフィグ

    !
    no spanning-tree rstp enable
    !
    interface eth2
     ip address 192.168.30.2/24
    !
    interface eth1
     encapsulation ppp 1
    !
    interface ppp1
     keepalive
     ppp username test01@cug
     ppp password test01!
     ip address 10.1.1.1/32
     ip tcp adjust-mss pmtu
    !
    interface vlan1
     ip address 192.168.20.1/24
    !
    crypto isakmp key secret address 10.1.1.2
    !
    interface tunnel1
     ip address 172.16.0.1/30
     tunnel source 10.1.1.1
     tunnel destination 10.1.1.2
     tunnel mode ipsec ipv4
     tunnel protection ipsec
     ip tcp adjust-mss 1260
    !
    ip as-path access-list list1 permit ^$
    ip as-path access-list list1 permit ^65030_
    ip as-path access-list list2 permit ^$
    !
    ip prefix-list ppp seq 5 deny 10.1.1.1/32
    ip prefix-list ppp seq 10 permit any
    !
    route-map add_myasn permit 1
     match as-path list2
     set as-path prepend 65030 65030 65030
    route-map add_myasn permit 2
    !
    router bgp 65030
    !
     redistribute connected
    !
     neighbor 172.16.0.2 remote-as 65020
     neighbor 172.16.0.2 allowas-in
     neighbor 172.16.0.2 prefix-list ppp out
     neighbor 172.16.0.2 filter-list list1 out
    !
     neighbor 192.168.30.1 remote-as 65030
     neighbor 192.168.30.1 next-hop-self
     neighbor 192.168.30.1 allowas-in
     neighbor 192.168.30.1 prefix-list ppp out
     neighbor 192.168.30.1 route-map add_myasn out
    !
    ip route 10.1.1.2/32 ppp1
    !
    end