

モジュールファイルを利用した設定の導入手順
■RTX1200に本設定例のconfigを設定する
- 設定例のリンクから設定ファイルをダウンロードし、RTX1200に設定を追加してください。
|
pp auth myname (ISPに接続するID) (ISPに接続するパスワード) |
|
[解説] |
|
RTX1200にはTFTPを使用してPCからルーターに設定ファイルをコピーすることができます。 |
■構成を構築する
- 本設定例ページのトップにある通常時の構成図と同様の構成を構築します。
|
[解説] |
■モジュールファイルをルーターにコピーする
- モジュールファイルをPCにダウンロードします。
[解説]
モジュールファイル名はLuaスクリプトの動作にも関係がありますので、本設定例では変更せずそのままご使用ください。 - PCにUSBメモリを接続して、ダウンロードしたモジュールファイルをUSBメモリにコピーします。
- USBメモリをPCから取り外し、ルーターに接続します。ルーターのUSBランプが点灯します。
- ルーターコンソールを開きます。
[解説]
ルーターコンソールはシリアルケーブルやtelnetで接続して使用します。
使用方法については取扱説明書をご参照ください。 - 管理者権限でログインし、コマンドでルーターにモジュールファイルをコピーします。
copyコマンドを使用します。
USBメモリのルートディレクトリからルーターのルートディレクトリにモジュールファイルをコピーする場合:
[ルーターコンソール]# copy usb1:/lua_rtx1200_storm-limit.lib /lua_rtx1200_storm-limit.lib
#[解説]
copyコマンドの詳細はこちらをご参照ください。
ファイルをルーターのルートディレクトリ以外にも格納することができます。
その場合は、ディレクトリを作成してから、そのディレクトリにコピーします。
そちらの方法については参考資料をご参照ください。
技術資料「RTFS」-「コマンド一覧」-「ディレクトリの作成」
モジュールファイルをディレクトリにコピーした場合、環境変数LUA_PATHでそのディレクトリを指定する必要があります。そちらの方法は参考資料をご参照ください。
技術資料「Lua スクリプト機能」 - 「詳細」にある「5.ルーターの環境変数 」をご参照ください。
モジュールファイルの名前を変更した場合、Luaスクリプト内のrequire関数の引数の名前も変更する必要があります。[補足]
本例のモジュールファイルをcopyコマンドではなくTFTPを使用してRTFSへコピーする場合はバイナリモードでコピーしてください。
■Luaスクリプトの導入手順
|
[解説] |
RTX1200の設定例
| 環境変数の設定 |
set LUA_PATH="./\?.lib;" #注釈1 |
|---|---|
| LANの インタフェースの設定 (LAN1ポートを使用) |
ip lan1 address 192.168.0.1/24 |
| WANの インタフェースの設定 (LAN2ポートを使用) |
pp select 1 |
| NATの設定 |
nat descriptor type 1 masquerade |
| DHCPの設定 |
dhcp service server |
| DNSの設定 |
dns server (ISPより指定されたDNSサーバのIPアドレス) |
| SWX2200の設定 |
switch control use lan1 on |
| フィルタの設定 |
ip filter source-route on |
| Luaスクリプトのスケジュール設定 |
schedule at 1 startup * lua /swx2200_lua_bc_storm_ctl_rtx1200.lua |
Luaスクリプト例
| 設定値 |
-- 転送レート上限 |
|---|---|
| グローバル変数の設定 |
-- 転送制限が連続した回数 |
| ロードするモジュールの指定 |
require("lua_rtx1200_storm-limit") |
| スイッチの機種を取得する関数 |
function switch_model_read(sw) rtn, str = rt.command(cmd) str = string.format("failed to get model name : %s\r\n", sw) |
| スイッチの名前を取得する関数 |
function switch_sys_name_read(sw) rtn, str = rt.command(cmd) |
| スイッチのカウンタタイプを設定する関数 |
function switch_set_counter(port, cnt_num) return rt.command(cmd) |
| スイッチのカウンタを読みだす関数 |
function switch_read_frame_counter(sw, rx_tx, port, cnt_num) rtn, val = rt.command(cmd) |
| 受信カウンタタイプをbroadcast-and-multicast-packetsに設定する関数 |
function set_counter_watch_pkts(sw) rtn = rt.command(cmd) rtn, str = switch_model_read(sw) if (string.find(str, "SWX2200-8G", 1, true)) then for i = 1, port_num do cmd = "switch select none" |
| 受信した抑制対象フレーム数を取得する関数 |
function read_counter_watch_pkts(sw) rtn, str = switch_model_read(sw) if (not rtn) or (not str) then if (string.find(str, "SWX2200-8G", 1, true)) then for i = 1, port_num do |
| 現在の日時を取得する関数 |
function time_stamp() t = os.date("*t") |
| カウンタの増加量がもっとも大きいポートを取得する関数 |
function get_port_cntinc_max(curr, prev) if (curr == nil) or (prev == nil) then |
| パケットストームの状態検出を行う関数 |
function get_storm_status(idx, sw) -- SWX2200の転送制限フラグを確認する |
| スイッチ毎に状態を監視を行う関数 |
function watch_switch(idx, sw) if (not limit_cfgd[idx]) then if (limit_cfgd[idx]) then if (limit) then if (storm) then |
| メインルーチン |
local rtn, rtn2, str, storm, limit, msg while (true) do if (storm) and (mail) then if (limit) and (not storm) then |
[注釈の説明]
注釈1:
モジュールファイルをロードするために使用するパスを設定します。
Lua ではモジュール名の置換記号として "?" を使いますが、ルーターコンソールで '?' を入力するとヘルプが表示されてしまうため、'?' を入力する前にエスケープシーケンスの '\' を入力しています。
require関数の引数と環境変数LUA PATHの設定値についての詳細はこちら