不正ホスト接続禁止 : FWX120 コマンド設定

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

ルーターの対応機種は、FWX120です。

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

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

図 不正ホスト接続禁止1 図 不正ホスト接続禁止2

登録済みのホストに対してはIPアドレスを付与してインターネットアクセスを許可し、不正なホストからのアクセスを遮断する設定例です。

本設定例のLuaスクリプトでは、MACアドレスフィルター機能によって出力されるログを監視しています。
検出したログに記録されたMACアドレスがCSVファイルに記載されている場合のみ、DHCPでIPアドレスを付与します。
CSVファイルにMACアドレスが記載されていない場合には、当該ホストが接続されているSWX2200のポートを遮断します。

CSVファイルに、以下の例のようにホスト名とMACアドレスを記述します。許可したいホストが複数ある場合は、1行に1つずつ記述してください。
また、CSVファイルはLuaスクリプトの設定値filenameに指定します。

・CSVファイル記述例
ホスト名1,xx:xx:xx:xx:xx:01
ホスト名2,xx:xx:xx:xx:xx:02
※MACアドレスは、半角小文字で指定してください。

光回線に接続するためには、別途ONUが必要です。

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

機種 掲載内容 備考
ルーター FWX120 コマンド設定例
Luaスクリプト例
CSVファイル
L2MSマスター機能、
Luaスクリプト機能
L2スイッチ SWX2200-8G SWX2200-24G SWX2200-8PoE L2MSスレーブ機能

FWX120の設定例

イーサネットフィルターの設定 ethernet filter 1 pass-nolog *:*:*:*:*:* 01:a0:de:00:e8:13 0 e8,12
ethernet filter 2 pass-nolog dhcp-bind 1
ethernet lan1 filter in 1 2
LANインターフェースの設定
(LAN1ポートを使用)
ip lan1 address 192.168.100.1/24
WANインターフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISPに接続するID) (ISPに接続するパスワード)
ppp lcp mru on 1454
ppp ipcp ipaddress on
ppp ipcp msext on
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
dhcp scope 1 192.168.100.2-192.168.100.191/24
dhcp scope bind 1 * ethernet (接続を許可するホストのMACアドレス)
DNSの設定 dns server (ISPより指定されたDNSサーバーのIPアドレス)
dns private address spoof on
L2MSの設定 switch control use lan1 on
SYSLOGの設定 syslog notice on
フィルターの設定 ip inbound filter 1001 reject-nolog * * tcp,udp * 135
ip inbound filter 1002 reject-nolog * * tcp,udp 135 *
ip inbound filter 1003 reject-nolog * * tcp,udp * netbios_ns-netbios_ssn
ip inbound filter 1004 reject-nolog * * tcp,udp netbios_ns-netbios_ssn *
ip inbound filter 1005 reject-nolog * * tcp,udp * 445
ip inbound filter 1006 reject-nolog * * tcp,udp 445 *
ip inbound filter 1007 reject-nolog 192.168.100.0/24 * * * *
ip inbound filter 1099 pass-nolog * * * * *
ip policy interface group 101 name=Private local lan1
ip policy address group 101 name=Private 192.168.100.0/24
ip policy address group 102 name=Any *
ip policy service group 101 name="Open Services"
ip policy service group 102 name=General dns
ip policy service group 103 name=Mail pop3 smtp
ip policy filter 1100 reject-nolog lan1 * * * *
ip policy filter 1110 pass-nolog * * * * 102
ip policy filter 1122 static-pass-nolog * lan1 * * *
ip policy filter 1123 static-pass-nolog * local * * *
ip policy filter 1124 static-pass-log * * 192.168.100.0/24 * http
ip policy filter 1150 pass-nolog * pp1 * * *
ip policy filter 1500 reject-nolog pp* * * * *
ip policy filter 1520 pass-log * lan1 * * 101
ip policy filter 1700 pass-nolog local * * * *
ip policy filter 1710 static-pass-nolog * lan1 * * *
ip policy filter 3000 reject-nolog * * * * *
ip policy filter set 101 name="Internet Access" 1100 [1110 1123 [1124] 1122 1150] 1500 [1520] 1700 [1710] 3000
ip policy filter set enable 101
pp select 1
ip pp inbound filter list 1001 1002 1003 1004 1005 1006 1007 1099
Luaスクリプトのスケジュール設定 schedule at 1 startup * lua (Luaスクリプトファイル名)

Luaスクリプト例

設定値 -- 接続を許可するPCリストのファイル名(絶対パスで指定)
filename = "/pc_list.csv"
-- 出力する SYSLOG のレベル (info, debug, notice)
log_level = "info"
-- 検出したい SYSLOG の文字列パターン
ptn = "Rejected at IN%(default%) filter"
-- MACアドレス検出の文字列パターン
mac_ptn = "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x"
ホスト検索

function search_host(mac)
  local sw_route, route, port
  rtn, str = rt.command("show status switching-hub macaddress " .. mac)
  port = string.match(str, "port (%d):")

  if (port) then
    route = "LAN1:" .. port
  else
    rtn, str = rt.command("show arp lan2")
    if (string.match(str, mac)) then
      route = "LAN2"
    end
  end

  if (not route) then
    return
  end

  while true do
    rtn, str = rt.command("switch control function get status-macaddress-addr " ..
                   mac .." " .. route)
    if (rtn) and (str ~= "0 entry\r\n") then
      port = string.match(str, "(%d+)")
      sw_route = route
      route = route .."-" ..port
    else
      break
    end
  end
  return sw_route, port
end

不正PC接続ポートのシャットダウン

function port_shutdown(mac)
  sw_route, port = search_host(mac)
  if (sw_route) and (port) then
    rt.command("switch select " .. sw_route)
    rtn, str = rt.command("switch control function set port-use " .. port .." off")
    if (rtn) then
      rtn, str = rt.command("switch control function get system-name " .. sw_route)
      name = string.match(str, "(.-)\r\n")
      if (name) then
        rt.syslog(log_level, "port shutdown ".. name .." : port " .. port)
      else
        rt.syslog(log_level, "port shutdown ".. sw_route .." : port " .. port)
      end
    else
      rt.syslog(log_level, "port shutdown error (".. str ..")")
    end
  end
end

メインルーチン

local bind = {}

-- 正規PCの登録
local fh, estr, ecode
fh, estr, ecode = io.open(filename, "r")

if (not fh) then
  rt.syslog(log_level, "file open error (".. estr ..")")
else
  for line in fh:lines() do
    mac = string.match(line, mac_ptn)
    if (mac) then
      rt.command("dhcp scope bind 1 * ethernet " .. mac)
      table.insert(bind, mac)
    end
  end
  io.close(fh)
end

-- 接続PCの監視
local rtn, str, bmac, hit

while (true) do
  rtn, str = rt.syslogwatch(ptn)
  mac = string.match(str[1], mac_ptn)
  if (mac) then
    for i, bmac in ipairs(bind) do
      hit = string.match(mac, bmac)
      if (hit) then
        break
      end
    end
    if (not hit) then
      port_shutdown(mac)
    else
      rt.syslog(log_level, "bind table match ".. mac)
    end
  end
end

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

メール

ご相談・お問い合わせ