ON THIS PAGE
プレフィックスリストを自動的に更新する方法
本書では、プレフィックスリストを使用してきました。プレフィックスリストには、ルーティングポリシーで使用できる1つまたは複数の事前修正が含まれています。ネットワークを構築する際には、通常、手動で更新されたプレフィックスリストを使用します。実際には、頻繁に変更されることは’ありません。中継プロバイダからのすべてを受け入れることができます。そのため、多くのピアや顧客が存在しない場合は、プレフィックスリストを変更するだけではありません。私’たちは私たちのようになりました。
しかし、ネットワークと顧客ベースの成長に伴い、手動でプレフィックスリストを更新することは不可能です。この付録では、Junos OS の NETCONF 機能をいくつかの Python スクリプトとともに使用して、プレフィックスリストの変更を自動的にアップロードする方法について説明します。
この付録は、ネットワーク’の管理システムへの切り取りと貼り付けを可能にする既製のスクリプトを提供できないため、本書の残りの内容とは多少違いがあります。その方法をご紹介し、お客様のソフトウェア開発チームに連絡して、新しいセキュアルーティングテーブルについて熱心して、ネットワーク上でプレフィックスリストの自動変更を実装するよう要請してください。
基本的な手順は3つあります。
お客様の顧客に対して、お客様に対して顧客に対して発表される設定 (または数値) が含まれていることを確認します。
IRR から、そのセットのプレフィックスリストを取得します。
プレフィックスリストをルーターにアップロードします。
このような作業’を定期的に行うと (たとえば、1日に2回)、接頭辞リストを変更したい顧客について心配する必要はありません。自分のプレフィックスリスト’の変更を求めるチケットを作成する必要はありません。つまり、このよう’なチケットをもはや処理する必要がないということです。
顧客データベース
お客様のデータベースには、顧客ごとに少なくとも2つのフィールドを含める必要があります。
AS 番号は、ルーターにアップロードされる際のプレフィックスリストの名前に使用されます。
セットとして機能します。
顧客は、IRR に設定されているものを作成します。顧客をネットワークに接続する際には、お客様が設定しているかどうかを確認します。このファイルには、自社のネットワークに使用されている
AS 番号 (独自のプレフィックスをアナウンスするもの) だけでなく、顧客の as 番号や as セットを含める必要があります。この“ツリー”をたどることで、 bgpq3
このツールでは、顧客が発表するすべての接頭番号を折りたたむ単一のプレフィックスリストを1つ作成します。
プレフィックスリストを取得します。Bgpq3 を使用
セットとしてプレフィックスリストに変換するツールは bgpq3
。公式の
bgpq3 web サイトは、 https://github.com/snar/bgpq3にあり、お客様に招待してお客様の声を読み、学習し、投稿することができます。Bgpq3 をコンピューターにインストールした後、それを使用して、次のようなプレフィックスリストを作成できます。
IPv6 の場合:
使っ bgpq3
、ディレクトリに .txt ファイルを作成します。 prefix-list.d/
の各セットに対して、自動更新を行います。.Txt ファイルには、ルーターにプッシュするプレフィックスリストの名前を指定します。また、コンテンツは1行にプレフィックスを付ける必要があります。この作業を定期的に実行するスクリプトを作成することは、読者にとっての課題として残されています。
ルーターにアップロード
Junos OS では、外部情報を設定データベースにアップロードする方法を複数サポートしています。これは付録であるため、包括的ではありません。現場でテストされた組み込みの構成を提供していません。ここでは例のみを示しています。この例では、Junos OS 用の NETCONF インターフェイスを使用して情報をアップロードしています。この例では、Python 3 言語を使用し、ジュニパーネットワークスによって作成および管理される Junos の Pの z + ライブラリを具体的に示しています。また、Pごみ箱は、必要に応じて Python 2.7 とともに使用することもできます。
1 日分の「Day z」ガイドをご覧ください。https://www.juniper.net/us/en/training/jnbooks/day-one/automation シリーズ/junos/について
この例では、架空の Juniper デバイスを構成ターゲットとして使用しています。ただし、この例は、同じ方法でプレフィックスリストを使用する Junos OS デバイスのいずれかで動作する必要があります。この要件は、テキストファイルの内容に基づいて、プレフィックスリストに存在する IP プレフィックスのリストを更新することを目的としています。このスクリプトは、リモートホストから実行されます。
要件
Junos OS デバイス用:
NETCONF SSH サブシステムを持っています (以下を参照してください。https://www.juniper.net/documentation/en_US/junos/topics/topic-map/netconf-ssh-connection.html)有効にする場合:
#
set system services netconf ssh
NETCONF ポートのリモートサーバーからのアクセスを許可する (デフォルト: 830)
リモートサーバーの場合:
Python 3.5 がインストールされている
(また、Python 2 を使用して、以下のコードで構文を調整することもあります)
Junos Pごみ箱がインストールされていること (を参照してください)。https://github.com/Juniper/py-junos-eznc): たとえば、次のようになります。
#
pip install junos-eznc
サンプルコード
以下の Python 3 コードは、* .txt ファイルを指定したディレクトリで検索しています。 prefix-list.d
スクリプト自体の親ディレクトリ内これらの各ファイルは、更新されるプレフィックスリストを表し、プレフィックスリストが含まれている必要があるのは、各行に1つずつ接頭辞を含める必要があります。空行と
hash (#) 記号で始まる行は無視されます。ファイルの名前 (拡張子サフィックスを除く) は、プレフィックスリストの名前として使用されます。
設定に合わせて、スクリプトの最上位にある設定変数 HOST、USER、PASS を更新します。詳細については、スクリプト内のコメントを参照してください。
<code> from pathlib import Path from jnpr import junos from jnpr.junos.utils.config import Config from lxml import etree as ET HOST = 'mx0.example.com' USER = 'automation' PASS = 'secret' # Prefix lists to update. # Dictionary of {name -> list of prefixes}. prefix_lists = {} # Find files matching 'prefix-list.d/*.txt' # relative to the parent directory of the script. CONF_DIR = Path( file ).parent / 'prefix-list.d' for f in CONF_DIR.glob('*.txt'): with f.open('r', encoding='utf-8') as fp: # Use the file basename ('stem') as the prefix list name; # read, split & trim lines, exclude comments ('#') and empty. lines = [x.strip() for x in fp.read().splitlines()] prefix_lists[f.stem] = [x for x in lines if x and not x.startswith('#')] # Connect to configuration target. # Note: should use agent auth if PASS is None. print('Connect to [%s]...' % HOST) with junos.Device(host=HOST, user=USER, passwd=PASS) as device: # Open configuration; use private mode to avoid # committing existing shared candidate configuration. print('Open private configuration...') with Config(device, mode='private') as config: # Merge XML config for each prefix list. for name, prefixes in prefix_lists.items(): # Generate an XML configuration with the following structure: """ <configuration> <policy-options> <prefix-list replace="replace"> <name>{name}</name> <prefix-list-item> <name>x.x.x.x/n</name> </prefix-list-item> (...) </prefix-list> </policy-options> </configuration> """ patch = ET.Element('configuration') policy_options = ET.SubElement(patch, 'policy-options') # Note: replace entire prefix-list to remove extraneous entries. prefix_list = ET.SubElement(policy_options, 'prefix-list', replace='replace') ET.SubElement(prefix_list, 'name').text = name for prefix in prefixes: item = ET.SubElement(prefix_list, 'prefix-list-item') ET.SubElement(item, 'name').text = prefix print('\nUpdate prefix list [%s] with [%d] entries:' % (name, len(prefixes))) print('---\n' + ET.tounicode(patch, pretty_print=True) + '---') config.load(patch) print('\nUpdated [%d] prefix lists; config diff:' % len(prefix_lists)) print('---\n' + config.diff() + '---') while True: choice = input('\nDo you want to commit these changes? [y/n] ').lower() if choice in ('y', 'yes'): print('Committing changes...') config.commit() print('Commit successful!') break elif choice in ('n', 'no'): print('Changes not committed.') break </code>
このコードは、独自のネットワーク管理システムへのカットアンドペーストではない可能性がありますが、nitely は、手動で実行できるようにして、自動的にプレフィックスリストが変更されたことを確認する必要があります。
次のステップ: 同じメカニズムを使用してピアをフィルタリングする
開発者は、独創的なソフトウェアを作成し、ネットワークエンジニアはこちらを使用して独自のものになります。
前述の作業に基づくと、顧客を絞り込むためのプレフィックスリストを作成するだけでなく、同じメカニズムを使用してピアをフィルタリングすることもできます。ネットワーク管理システム‘で擬似’顧客を作成し、ピアがアナウンスする必要があるセットを書き留め、その後で、 prefix-list
そのピアの BGP ポリシーに含まれています。
このようにすることで、お客様と、顧客との間で確実にセキュリティを確保することができます。