Web認証

本設定例では、ルーターのL2MSコントローラー機能・Luaスクリプト機能と、L2スイッチのL2MSスレーブ機能を使用しています。L2MSを使って、ルーターから、スイッチが持つ機能の設定を行います。

ルーターの対応機種は、RTX1210RTX1200(Open in new windowRev.10.01.16以降)、RTX810NVR700WNVR510NVR500
FWX120です。

L2スイッチの対応機種は、SWX2200-8GSWX2200-24GSWX2200-8PoEです。

L2MSコントローラー(ルーター)とL2MSスレーブ(L2スイッチ)の対応リビジョンは、Open in new window 技術資料「L2MS」でご確認ください。

図 Luaスクリプト構成図1
図 Luaスクリプト構成図2

Web認証を行ったホストだけインターネットへのアクセスを許可する設定例です。

ネットワークに参加したホストに対して、まずセカンダリネットワークのアドレスを付与します。セカンダリアドレスではルーターのGUI以外へのアクセスを禁止しています。
ホストがブラウザでルーターの認証用画面にログインできたことを認証とし、認証が成功するとホストが接続するポートを一旦シャットダウンします。次にポートがリンクアップした時には、DHCPでプライマリネットワークのアドレスを与えます。プライマリネットワークのアドレスではインターネットへのアクセスが可能となります。

なお、DHCP認証機能を利用しているので、プライマリネットワークのアドレスを固定で設定したホストのインターネットアクセスも禁止できます。また認証用画面にはカスタムGUIの機能を利用しています。

光回線に接続するためには、別途ONUが必要です。
NVR700WとNVR510は、本体のONUポートに小型ONUを装着することで、光回線に接続できます。

設定手順

本設定例は、以下の流れで設定します。

  1. ルーターにConfigを設定
  2. 構成を構築
  3. ルーターに認証用画面のHTMLファイルをコピー
  4. Luaスクリプトを実行

対応機種のうち、設定例を掲載している機種は、以下のとおりです。

機種 掲載内容 備考
ルーター

RTX1210 RTX1200 RTX810 NVR700W NVR510 NVR500

コマンド設定例
Luaスクリプト例
認証用画面のHTMLファイル

L2MSコントローラー機能、
Luaスクリプト機能

L2スイッチ

SWX2200-8G SWX2200-24G SWX2200-8PoE

L2MSスレーブ機能

事前準備

■ルーターに本設定例のconfigを設定する

  1. 設定例のリンクから設定ファイルをダウンロードし、ルーターに設定を追加してください。

pp auth myname (ISPに接続するID) (ISPに接続するパスワード)
dns server (ISPより指定されたDNSサーバのIPアドレス)

[解説]
上記のように設定例で黄色で記述されている設定値は、適切な値に変更してください。

ルーターにはTFTPを使用してPCからルーターに設定ファイルをコピーすることができます。
この方法については取扱説明書をご参照ください。

■構成を構築する

  1. 本設定例ページのトップにある認証前の構成図と同様の構成を構築します。

■ルーターへ認証用画面のHTMLファイルをコピーする

  1. 認証用画面のHTMLファイル(以降、HTMLファイルと表記)をPCにダウンロードします。
  2. PCにUSBメモリを接続して、ダウンロードしたHTMLファイルをUSBメモリにコピーします。
  3. USBメモリをPCから取り外し、ルーターに接続します。ルーターのUSBランプが点灯します。
  4. ルーターコンソールを開きます。

    [解説]
    ルーターコンソールはシリアルケーブルやtelnetで接続して使用します。
    使用方法については取扱説明書をご参照ください。

  5. 管理者権限でログインし、コマンドでルーターにHTMLファイルをコピーします。
    copyコマンドを使用します。
    USBメモリのルートディレクトリからルーターのルートディレクトリにHTMLファイルをコピーする場合:
    [ルーターコンソール]

    # copy usb1:/web_auth.html /web_auth.html
    #

    [解説]
    copyコマンドの詳細はこちらをご参照ください。
    ファイルをルーターのルートディレクトリ以外にも格納することができます。
    その場合は、ディレクトリを作成してから、そのディレクトリにコピーします。
    そちらの方法については参考資料をご参照ください。
    技術資料「RTFS」-「コマンド一覧」-「ディレクトリの作成」
    HTMLファイルをディレクトリにコピーした場合、httpd custom-gui userコマンドでのディレクトリ指定も変更してください。

■Luaスクリプトを実行する

[解説]
Luaスクリプトのダウンロードから実行までの手順は、Luaスクリプト導入手順マニュアルをご覧ください。

Web認証の手順

本手順は、WebブラウザにInternetExplorerを使用した場合の説明です。

  1. PCをSWX2200に接続します。PCはDHCPサーバーからIPアドレスを取得できるように設定しておく必要があります。

    [解説]
    認証前はセカンダリネットワークのアドレスが付与されます。
    外部にアクセスできませんが、ルーターの認証用画面にはアクセスできます。

  2. Webブラウザを起動します。
  3. [ファイル]メニューから[開く]を選択し、http://192.168.100.1と入力します。
  4. 認証画面が表示されたら、ユーザ名とパスワードを入力しOKをクリックします。

    [解説]
    設定例ではユーザ名test、パスワードtestに設定されています。

  5. 認証に成功するとカスタムGUIのページが表示されます。
    IPアドレスの再取得が行われますので、一旦Webブラウザを終了し、少しお待ちください。

    [解説]
    認証後、プライマリネットワーク(192.168.100.0/24)のアドレスが付与されるまでに最長で1分程度の時間を要することがあります。

  6. Webブラウザを再度起動し、インターネットアクセスが行えることを確認します。

    [解説]
    複数のホストから認証用画面へのアクセスが短時間に集中すると、プライマリネットワークのアドレスへの切り替えが行われない場合があります。認証用画面へのアクセスが集中してLuaスクリプトでSYSLOGの確認ができない場合、そのような現象になります。
    その場合には、数分程度時間を置いてから再度認証用画面へのアクセスを試みてください。

イーサネットフィルタの設定

ethernet filter 1 reject-log dhcp-not-bind 192.168.100.1
ethernet filter 2 pass-nolog *:*:*:*:*:* *:*:*:*:*:*
ethernet lan1 filter in 1 2

LANの
インタフェースの設定
(LAN1ポートを使用)

ip lan1 address 192.168.100.1/24
ip lan1 secondary address 172.16.0.1/24

WANの
インタフェースの設定
(LAN2ポートを使用)

pp select 1
pp always-on on
pppoe use lan2
pppoe auto disconnect off
pp auth accept pap chap
pp auth myname (ISPに接続するID) (ISPに接続するパスワード)
ppp lcp mru on 1454
ppp ipcp ipaddress on
ppp ipcp msext on
ppp ccp type none
ppp ipv6cp use off
ip pp mtu 1454
ip pp nat descriptor 1
pp enable 1
ip route default gateway pp 1

NATの設定

nat descriptor type 1 masquerade

DHCPの設定

dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope lease type 1 bind-only fallback=2
dhcp scope 1 192.168.100.100-192.168.100.200/24
dhcp scope 2 172.16.0.100-172.16.0.200/24 expire 0:01 maxexpire 0:01

DNSの設定

dns server (ISPより指定されたDNSサーバのIPアドレス)
dns private address spoof on

ログインユーザの設定

login user test test
user attribute test login-timer=120

カスタムGUIの設定

httpd custom-gui use on
httpd custom-gui user test directory=/ index=web_auth.html

SWX2200の設定

switch control use lan1 on

フィルタの設定

ip filter source-route on
ip filter directed-broadcast on
ip filter 1000 pass 172.16.0.0/24 192.168.100.1 tcp * www
ip filter 1001 pass 192.168.100.0/24 *
ip filter 1002 pass 0.0.0.0 *
ip filter 1003 pass 172.16.0.0 172.16.0.1
ip filter 1010 reject * * udp,tcp 135 *
ip filter 1011 reject * * udp,tcp * 135
ip filter 1012 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 1013 reject * * udp,tcp * netbios_ns-netbios_ssn
ip filter 1014 reject * * udp,tcp 445 *
ip filter 1015 reject * * udp,tcp * 445
ip filter 1020 reject 192.168.100.0/24 *
ip filter 1030 pass * 192.168.100.0/24 icmp
ip filter 2000 reject * *
ip filter 3000 pass * *
ip filter dynamic 100 * * ftp
ip filter dynamic 101 * * www
ip filter dynamic 102 * * domain
ip filter dynamic 103 * * smtp
ip filter dynamic 104 * * pop3
ip filter dynamic 105 * * netmeeting
ip filter dynamic 106 * * tcp
ip filter dynamic 107 * * udp
pp select 1
ip pp secure filter in 1020 1030 2000
ip pp secure filter out 1010 1011 1012 1013 1014 1015 3000 dynamic 100 101 102 103 104 105 106 107
pp enable 1
ip lan1 secure filter in 1000 1001 1002 1003 2000

Luaスクリプトのスケジュール設定

schedule at 1 startup * lua /swx2200_lua_web_auth_rtx1200.lua

設定値

-- 使用するルーターのLANインタフェースの数
num_lan = 1
-- メールの送信に失敗した時に出力する SYSLOG のレベル (info, debug, notice)
log_level = "info"
-- ポートをダウンさせている時間(秒)
down_wait = 5

ホスト検索の関数

function search(mac, addr, lan)
  -- ホスト検索結果の経路を格納
  route = nil
  -- ホスト検索結果の経路から一つ前の経路を格納
  switchroute = nil
  -- ホストが接続されているポート番号を格納(ホストのIPアドレスを格納することも)
  hostport = nil

  -- LAN1のMACアドレステーブルでホストが見つかった場合
  if (lan == 1) then
    rtn,str = rt.command("show status switching-hub macaddress " ..mac)
    port = string.match(str,"port (%d):")
    if (port ~= nil) then
      route = "LAN1:" ..port
      switchroute = "RTX1200"
      hostport = port
    else
      route = nil
      switchroute = nil
      hostport = addr
    end
  else
    -- LAN2またはLAN3でホストが見つかった場合
    lan = tostring(lan)
    route = "LAN"..lan
    switchroute = "RTX1200"
    hostport = "LAN"..lan
  end

  --[[
  上記いずかの方法でホストが見つかった場合、routeの値を基点とした経路で
  ホストが見つかるまで繰り返し検索する
  ]]
  while (true) do
    if (route ~= nil) then
      rtn, str = rt.command("switch control function get status-macaddress-addr "
                     ..mac .." " ..route)
      if (rtn) and (str ~= "0 entry\r\n") then
        switchroute = route
        hostport = string.match(str,"%d+")
        route = route .."-" ..string.match(str,"%d+")
      else
        route = nil
      end
    else
      break
    end
  end
  return switchroute, hostport
end

switch controlコマンドの実行関数

function exec_sw_cmd(route, cmd)
  rtn, str = rt.command("switch select "..route)
  if (rtn) then
    rtn, str = rt.command(cmd)
  end
  return rtn
end

メインルーチン

local rtn, str, app, ipaddr, mac
local ptn = "Login succeeded for HTTP:"

while (true) do
  rtn, str = rt.syslogwatch(ptn)
  if (rtn) and (str) then
    -- SYSLOG から IP アドレスを抽出し、ホストを検索
    ipaddr, user = string.match(str[1], "(%d+%.%d+%.%d+%.%d+)%s+(.+)")
    for i = 1, num_lan do
      rtn, str = rt.command("show arp lan" .. i .. " | grep " .. ipaddr)
      if (rtn) and (string.match(str, ipaddr) ~= nil) then
        mac = string.match(str, "(%x%x:%x%x:%x%x:%x%x:%x%x:%x%x)")
        if (mac ~= nil) then
          --[[
          プライマリアドレスが付与されるように dhcp scope bind コマンドを設定
          ]]
          rt.command("dhcp scope bind 1 * ethernet " .. mac)

          -- ホストを検索
          switchroute, hostport = search(mac, ipaddr, i)

          if (switchroute ~= nil) then
            --[[
            DHCPによるアドレス再取得を促すため、接続されているSWX2200の
            ポートを一時的にダウンする
            ]]
            str = "switch control function set port-use " ..hostport .." off"
            rtn = exec_sw_cmd(switchroute, str)

            --[[
            GUIへのログインを強制切断し、ルーターに残るユーザ情報を
            削除する。
            ]]
            rt.command("disconnect user "..user)

            if (rtn) then
              rt.sleep(down_wait)
              -- ダウンした SWX2200 のポートをアップ
              rt.command("no switch control function set port-use " ..
                       hostport)
            end
            break
          end
        else
          -- bindできない場合ログ出力
          rt.syslog(log_level, "[ERROR] not found MAC Address "..
                "swx2200_lua_web_auth_rtx1200.lua")
        end
      end
    end
  end
end

【ご注意】

本設定例は、設定の参考例を示したもので、動作を保証するものではございません。
ご利用いただく際には、十分に評価・検証を実施してください。

ページトップへ戻るReturn to Top