cafedripのブログ

IPネットワーク・IP電話のメモ

NBAR NetFlow

Vlan 1のIn方向でNBAR NetFlowを有効にするコンフィグです。

flow record nbar-appmon
 match ipv4 source address
 match ipv4 destination address
 match application name
 collect interface output
 collect counter bytes
 collect counter packets
 collect timestamp absolute first
 collect timestamp absolute last

flow monitor application-mon
 cache timeout active 60
 record nbar-appmon

interface Vlan1
 ip nbar protocol-discovery
 ip flow monitor application-mon input

以下のコマンドで、アプリケーション別のフローを確認できます。

show flow monitor application-mon cache sort counter bytes format table

上記の設定でgoogleyoutubeの識別ができますが、 有名所ではないとアプリケーションの識別ができないようです。

以下のようなコンフィグを投入することで個別にアプリケーションを識別できます。 (yahoo japanを識別する方法)

ip nbar custom yahoo-jp ssl unique-name "*yahoo.co.jp"  

httpとhttpsでコマンド体系が異なります。詳細はCiscoのwebサイトに記載されています。

Ubuntu16.04にSquidをインストールする

Proxyサーバの動作確認のため、Ubuntu16.04にSquidをインストールしてみました。

Squidのインストール手順

以下のとおりです。

$ sudo apt install squid

$ squid -v
Squid Cache: Version 3.5.12
Service Name: squid
Ubuntu linux
〜以下省略〜

Squidの設定

「/etc/squid/squid.conf」がSquidの設定ファイルです。設定変更箇所は以下のとおりです。 (squid.conf.defaultが変更前、squid.confが変更後のファイルです)

$ diff squid.conf.default squid.conf
973c973
< #acl localnet src 192.168.0.0/16   # RFC1918 possible internal network
---
> acl localnet src 192.168.0.0/16    # RFC1918 possible internal network
1186c1186
< #http_access allow localnet
---
> http_access allow localnet
1599c1599
< http_port 3128
---
> http_port 8080
3144a3145
> maximum_object_size_in_memory 2 MB
3252a3254
> maximum_object_size 16 MB
3410a3413
> cache_dir ufs /var/spool/squid 1000 16 256
3819a3823
> logformat squid %tl %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
5156a5161,5175
> request_header_access Authorization allow all
> request_header_access Cache-Control allow all
> request_header_access Proxy-Authorization allow all
> request_header_access Content-Length allow all
> request_header_access Content-Type allow all
> request_header_access Date allow all
> request_header_access Host allow all
> request_header_access If-Modified-Since allow all
> request_header_access Pragma allow all
> request_header_access Accept allow all
> request_header_access Accept-Charset allow all
> request_header_access Accept-Encoding allow all
> request_header_access Accept-Language allow all
> request_header_access Connection allow all
> request_header_access All deny all
5507a5527
> visible_hostname unknown
7621a7642
> forwarded_for off

ざっくりと説明すると、以下の設定で、192.168.0.0/16のNWアドレスからProxyサーバへの接続を許可しています。

acl localnet src 192.168.0.0/16
http_access allow localnet

以下でプロキシサーバのポート番号を「8080」に指定しています。

http_port 8080

ここまでの設定で、プロキシサーバとして動きます。

以下は、パフォーマンスに関する設定です。

maximum_object_size_in_memory 2 MB
maximum_object_size 16 MB
cache_dir ufs /var/spool/squid 1000 16 256

ここはデフォルト設定より大きめに設定してみましたが、どの程度効果があるかはよくわかりません。

以下は、セキュリティ関連の設定です。

> request_header_access Authorization allow all
> request_header_access Cache-Control allow all
> request_header_access Proxy-Authorization allow all
> request_header_access Content-Length allow all
> request_header_access Content-Type allow all
> request_header_access Date allow all
> request_header_access Host allow all
> request_header_access If-Modified-Since allow all
> request_header_access Pragma allow all
> request_header_access Accept allow all
> request_header_access Accept-Charset allow all
> request_header_access Accept-Encoding allow all
> request_header_access Accept-Language allow all
> request_header_access Connection allow all
> request_header_access All deny all
5507a5527
> visible_hostname unknown
7621a7642
> forwarded_for off

「request_header_access」は、httpヘッダの記載に関する設定です。squid.conf内のコメントを参照して、一番厳しい設定を投入しています。 「visible_hostname unknown」は、プロキシサーバのホスト名を隠蔽するための設定です。 「forwarded_for」は、送信元のIPアドレスを隠蔽するための設定です。

Squidのログ

ログ確認方法は以下のとおりです。

sudo cat /var/log/squid/access.log 
sudo cat /var/log/squid/cache.log 

aptからインストールした場合、logrotateが有効になっています。以下で設定を確認できます。

less /etc/logrotate.d/squid

ufwのインストール

以上でSquidの設定は完了ですが、TCPポート8080を開放していない場合はProxyサーバに接続できません。 ポートを開放するためにufwをインsぬトールします。

sudo apt install ufw

ufwの設定

ufwの設定は以下のとおりです。

sudo ufw enable
sudo ufw default deny
sudo ufw allow 8080/tcp

設定確認コマンドは以下のとおりです。

$ sudo ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
8080/tcp                   ALLOW       Anywhere                  
22/tcp                     ALLOW       Anywhere                  
8080/tcp (v6)              ALLOW       Anywhere (v6)             
22/tcp (v6)                ALLOW       Anywhere (v6)             

Pythonのコーディング規約

ネットワーク機器のプログラミング言語として、Pythonが使われることが多い気がします。 初めてプログラミングを行う人が多いからでしょうか?

そんなこともあって、私もPythonの勉強を始めてみました。 で、一通り文法を学んだあとは以下を参考にしてコーディング規約を確認しています。

変数・関数のネーミングルールはこちらに頼っています。

STPのRoot Port, Designated Port, Non Designated Port

STPのRoot Port, Desginated Port, Non Designated Portの決め方をよく忘れるので覚え書き

Root Bridgeを決める

  • 最小のBridge IDを持つ機器がRoot Bridge
  • Bridge ID = Bridge Priority (2 Byte) + MAC Address (6 Byte)

    • Cisco機器の場合、defaultのBridge Priorityは32,768
    • Bridge Priorityを変更するには、Vlan単位で以下の設定を投入

      spanning-tree vlan “vlan num” priority “bridge priority”

    • Bridge Priorityは必ず4,096の倍数(0でもOK)

PVST+の場合、Bridge Priorityはdefaultで「32,768 + Vlan番号」、 Bridge Priorityを変更した場合は「指定したPriority値 + Vlan番号」となる

RPを決める

Root Bridgeはパスコスト0でBPDUを送信する。

各スイッチはBPDUを受け取った際、BPDUのパスコスト+受信I/Fのコスト値を加算(=ルートパスコスト)し、 BPDUのパスコストをルートパスコストで上書きして他のI/Fに転送する。

このとき、

  • スイッチごとに、ルートパスコストが最も小さいI/FがRP
  • ルートパスコストが同じ場合、送信元(上位機器の)Bridge IDが小さいポートがDP
  • Bridge IDも同じ場合、送信元(上位機器の)ポートIDが小さい方をDP

DPを決める

  • 各リンク(スイッチ〜スイッチ間の接続)の中で1ポートがDPとなる
  • 最小ルートパスコストを持つ機器側がDPになる(Root Bridgeの各I/Fは必ずDPになる)
  • 同じルートパスコストを持つ機器どうしが接続した場合、送信元(対向機器の)Bridge IDが小さいポートがDP

NDPを決める

RPにもDPにもなれなかったI/FがNDPとなり、ブロッキングポートになる

I/Fのコスト値について

よく見るのは以下3つ。

  • 100M : 19
  • 1G : 4
  • 2G : 3

LANが100M未満の環境はほぼなくなってきており、 10G以上の区間ではSTPよりもEtherChannelやTRILLベースのL2 fabric技術を用いることが多いため、 上記3つを覚えておけば大体事足りる。

基本的にはI/F速度をベースにしてコスト値を決めているものが多いが、 EtherChannel環境ではbandwidth設定をベースにしてコスト値を決めるケースがあるので要注意。

Ciscoルータ(IOS, IOS-XE)のコンフィグ変更テンプレート

コンフィグ変更は、組織内で決められている手順に従って行いますが、 「そんなものはない」という場合や新規で手順書を作成する必要がある場合は、 概ね以下の手順で手順書を作成しています。

! 変更作業前のログ取得
sh ver
sh log
sh ip int brief
sh int status
sh run

! 変更作業実施
conf t
 <config変更>
end

! 変更作業後のログ取得
sh ver
sh log
sh ip int brief
sh int status
sh run

! startup-configとrunning-configの差分を取得
show archive config differences nvram:startup-config system:running-config

! 設定保存
copy run star

exit

上記を基本セットとし、

  • ルーティングを変更した場合

    • sh ip route
    • sh ip cef
    • sh ip ospf nei
    • sh ip bgp summ
    • sh ip bgp regexp ^$
  • I/F設定を変更した場合

    • sh int [I/F]
    • sh span summ

など、変更内容に合わせて確認すべき項目を適宜追加していくと、なんとなくそれっぽい手順書が出来上がります。

ODインターフェースの起動方式について

ODには「ループ起動方式」と「地気起動方式」という2つの起動方式があり、それぞれの結線が異なります。

ODの各Wireには以下のような名称が振られており、 ループ起動方式の場合、8Wすべてを用いて機器間を結線します。

Wireの名称

  • TA:Transmit A
  • RA:Receive A
  • TB:Transmit B
  • RB:Receive B
  • SS:Signal Send
  • SR:Signal Read
  • SB:Signal to Battery
  • SG:Signal to Ground

地気起動方式の場合、SB, SGを除いた6Wの結線します。 代わりに機器間のアースを共有する必要があり、 もしアース線が外れたりしてアース間に電位差が生じると、うまく信号を送受信できなくなります。

専用線インターフェース種類まとめ

  • アナログ

    • Wire数、ch数:2Wで1ch
    • 機能:発信者番号通知不可、ダイヤルイン不可
    • 特徴:最もシンプルな接続方法。ほぼすべてのビジネスホンが対応している接続方式だが機能も最小限
  • OD

    • Wire数、ch数:6W/8W (音声用4W, 制御用2W/4W)で1ch
    • 機能:発信者番号通知不可、ダイヤルイン可能
    • 特徴:市外専用線との接続で使われていたI/F。最近のビジネスホンだと未対応のケースもある
  • TTC2M

    • Wire数、ch数:4Wで(最大)30ch
    • 機能:発信者番号通知不可、ダイヤルイン可能
    • 特徴:収容効率が最も良いI/F
  • BRI

    • Wire数、ch数:T点において4W, 2ch
    • 機能:発信者番号通知可能、ダイヤルイン可能
    • 特徴:
      • 番号通知ができる分、ODより高性能
      • 局線種別によってクロックの設計が変わるのが面倒
  • PRI

    • Wire数、ch数:T点において4W, 23ch
    • 機能:発信者番号通知可能、ダイヤルイン可能
    • 特徴:
      • 番号通知ができ、BRIよりも収容効率がよい
      • BRIと同様クロック設計が必要だが、BRIよりも設計が楽