ようへいの日々精進XP

よかろうもん

YAMAHA RTX1x00 の NAT テーブル数を GrowthForecast で追跡してみる一部始終

序章

「なんか最近ネットが重くないですか?」

という周囲の声。
色々と調べると使っているルーターの負荷が高そう。

ルーターの CPU 負荷に関しては SNMP 経由でデータを取得して Cacti あたりに飛ばせば追跡出来そう。実際に Cacti のデータテンプレートこさえて、グラフテンプレートこさえて CPU の負荷は追跡出きるようになったけど...。

そもそも何で負荷が高いのか?

色々と調べると NAT のテーブル数あたりが怪しいことが判明...ということで...今日も張り切って行ってみよう。

要件

  • YAMAHA RTX1x00 の NAT テーブル数を確認する
  • その確認したテーブル数を一定の間隔で追跡する
  • CPU 負荷のグラフと合わせて検証して NAT テーブル数との因果関係について結論付ける
  • 既に AWS の EC2 インスタンスに GrowthForecast は構築済み

構成イメージ

f:id:inokara:20130224121604p:plain

実装

YAMAHA RTX1x00 の NAT テーブル数を確認する
  • 純粋に RTX1x00 に telnet やコンソールからログインしている場合には下記コマンドを実行

show nat descriptor address

  • 以下のような結果が出力されるはず(冒頭部分且つ NAT テーブル数)

Masquerade Table
Outer address: ipcp/xxx.xxx.xxx.xxx port range=60000-64095 2564 used.

テーブル数を一定間隔で追跡する
  • 今回は下記のような ruby のスクリプトを書いて cron で定期実行させる
require 'net/telnet'
require "net/http"
require "uri"

#
file = "/tmp/nat_table.txt"
mode = "w"
url = "http://growthforecast-url:5125/api/path"

# telnet
telnet = Net::Telnet.new("Host"=>"xxx.xxx.xxx.xxx") {|c| print c}
telnet.waitfor(/Password[: ]*\z/n) {|c| print c}
telnet.cmd("your password")
telnet.cmd("console character ascii")
results = telnet.cmd("show nat descriptor address")
telnet.close
result = results.grep(/used/)
open(file,mode){|f|f.write(result)}

# report
open("/tmp/nat_table.txt") {|file|
        while l = file.gets
                str = l.split(nil)
                $table_num =  str[5]
        end
}
uri = URI.parse(url)
Net::HTTP.start(uri.host, uri.port){|http|
  header = {
    "user-agent" => "Ruby/#{RUBY_VERSION} LightHttpClient"
  }
  body = "number="+$table_num
  response = http.post(uri.path, body, header)
}
結果
  • こんな感じでグラフが生成される

f:id:inokara:20130223233952p:plain

まとめ

  • やっぱり NAT のテーブル数が多い時は CPU 負荷が高くなっていた
  • NAT のテーブル数が増えた原因については引き続き調査するが、下記が想定される
    • クライアント数の増加(人数の増加)
    • クライアント数の増加に輪を掛けて、長時間セッションを張り続ける謎の業務アプリケーションの存在...
  • ルーターを上位機種にアップグレードすることにした
  • NAT のテーブル数も CPU と同様、SNMPCacti でいけそうな気がする...
  • シェルで書いた方が絶対速いんでは...(汗