L2TP/IPsecのワンタイムパスワードを設定する

管理番号:YMHRT-4603 
(最終更新日: 2023/7/26)

本設定例では、Luaスクリプト機能とL2TP/IPsecを用いたリモートアクセスVPN機能を使用しています。

Luaスクリプト機能の対応機種は、RTX5000RTX3510RTX3500RTX1300RTX1220RTX1210RTX1200(Rev.10.01.16以降)、RTX830RTX810NVR700WNVR510NVR500FWX120vRXです。

リモートアクセスVPN機能の対応機種は、RTX5000(Rev.14.00.12以降)、RTX3510RTX3500(Rev.14.00.12以降)、RTX1300RTX1220RTX1210RTX1200(Rev.10.01.59以降)、RTX830RTX810(Rev.11.01.21以降)、NVR700WNVR510(Rev.15.01.03以降)、FWX120(Rev.11.03.08以降)、vRXです。

図 L2TP/IPsecのワンタイムパスワードを設定する

定期的にL2TPクライアントから接続を受け付けるためのPPP認証のパスワードを変更し、ユーザーへ新しいパスワード(ワンタイムパスワード)をメールで通知するスクリプトです。

メールで通知されたユーザーは、ワンタイムパスワードを下記ドキュメントの説明内にある「認証用パスワード」として設定します。

本設定例では、一例として毎週月曜日の朝8:00にLuaスクリプトを実行しています。

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

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

機種 掲載内容 備考
RTX1300 RTX1220 RTX1210 RTX1200 RTX830 RTX810 NVR700W NVR510 FWX120 コマンド設定例
Luaスクリプト例
Luaスクリプト機能、
リモートアクセスVPN機能

ルーターの設定例

ゲートウェイの設定 ip route default gateway pp 1
LANインターフェースの設定
(LAN1ポートを使用)
ip lan1 address 192.168.100.1/24
ip lan1 proxyarp on
WANインターフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept (認証方式)
pp auth myname (ISPに接続するID) (ISPに接続するパスワード)
ppp lcp mru on 1454
ppp ipcp ipaddress on
ppp ipcp msext on
ppp ccp type none
ip pp mtu 1454
ip pp nat descriptor 1
pp enable 1
L2TP接続を受け入れるための設定 pp select anonymous
pp bind tunnel1-tunnel2
pp auth request (認証方式)
pp auth username (PPPユーザー名1) (PPPパスワード1) # 注釈1
pp auth username (PPPユーザー名2) (PPPパスワード2) # 注釈1
ppp ipcp ipaddress on
ppp ipcp msext on
ip pp remote address pool 192.168.100.10-192.168.100.20
ip pp mtu 1258
pp enable anonymous
L2TP接続で使用するトンネルの設定
(クライアントA)
tunnel select 1
tunnel encapsulation l2tp
ipsec tunnel 101
ipsec sa policy 101 1 esp (暗号化アルゴリズム) (認証アルゴリズム)
ipsec ike keepalive use 1 off
ipsec ike local address 1 192.168.100.1
ipsec ike nat-traversal 1 on
ipsec ike pre-shared-key 1 text (事前共有鍵)
ipsec ike remote address 1 any
l2tp tunnel disconnect time off
l2tp keepalive use on 10 3
l2tp keepalive log on
l2tp syslog on
ip tunnel tcp mss limit auto
tunnel enable 1
L2TP接続で使用するトンネルの設定
(クライアントB)
tunnel select 2
tunnel encapsulation l2tp
ipsec tunnel 102
ipsec sa policy 102 2 esp (暗号化アルゴリズム) (認証アルゴリズム)
ipsec ike keepalive use 2 off
ipsec ike local address 2 192.168.100.1
ipsec ike nat-traversal 2 on
ipsec ike pre-shared-key 2 text (事前共有鍵)
ipsec ike remote address 2 any
l2tp tunnel disconnect time off
l2tp keepalive use on 10 3
l2tp keepalive log on
l2tp syslog on
ip tunnel tcp mss limit auto
tunnel enable 2
IPsecのトランス
ポートモード設定
ipsec transport 1 101 udp 1701
ipsec transport 2 102 udp 1701
ipsec auto refresh on
L2TP設定 l2tp service on
NATの設定 nat descriptor type 1 masquerade
nat descriptor address outer 1 ipcp
nat descriptor address inner 1 auto
nat descriptor masquerade static 1 1 192.168.100.1 esp # 注釈2
nat descriptor masquerade static 1 2 192.168.100.1 udp 500 # 注釈2
nat descriptor masquerade static 1 3 192.168.100.1 udp 4500 # 注釈3
DHCPの設定 dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.30-192.168.100.191/24
DNSの設定 dns host lan1
dns server (ISPより指定されたDNSサーバーのIPアドレス)
dns private address spoof on
Luaスクリプトのスケジュール設定 schedule at 1 */mon 8:00 * lua (Luaスクリプトファイル名)

[注釈の説明]

注釈1:
Luaスクリプトによって変更されます。

注釈2:
VPN(IPsec)に関係するパケットを通過させる設定です。

注釈3:
VPN(IPsec:NATトラバーサル機能を使用時)に関係するパケットを通過させる設定です。

Luaスクリプト例

設定値

-- 登録するユーザーの一覧(カンマで区切って列挙する)
user_tbl = {
 {
  name = "(PPPユーザー名1)",
  mail_tbl = {
   smtp_address = "(SMTPサーバーアドレス1)",
   from = "(送信元メールアドレス1)",
   to = "(宛先メールアドレス1)"
  }
 },
 {
  name = "(PPPユーザー名2)",
  mail_tbl = {
   smtp_address = "(SMTPサーバーアドレス2)",
   from = "(送信元メールアドレス2)",
   to = "(宛先メールアドレス2)"
  }
 }
}

-- ワンタイムパスワードの文字数 (4 - 64 文字)
digits = (ワンタイムパスワードの文字数)

-- メールの送信に失敗したときに出力する SYSLOG のレベル (info, debug, notice)
log_level = "(SYSLOG レベル)"

乱数を文字に変換するテーブル wd_tbl = {
 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
 "!", "$", "%", "&", "(", ")", "*", "+", ",", "-", ".", "/", ":",
 ";", "=", "@", "[", "]", "_", "`", "{", "|", "}", "~"
}
ワンタイムパスワードを作成する関数

function make_pass(name)
 local i
 local pass = ""

 math.randomseed(os.time())
 for i = 1, digits do
  pass = pass .. wd_tbl[math.random(#wd_tbl)]
 end

 cmd = "pp auth username " .. name .. " " .. pass
 rt.command("pp select anonymous")
 rt.command(cmd)
 rt.command("save")

 return pass
end

メール送信を行う関数

function send_mail(name, pass, mail_tbl)
 local sjct, text

 sjct = name .. " さんの新しいパスワードの通知"
 text = name .. " さんの新しいパスワードは\r\n" .. pass .. "\r\nになります。"
 mail_tbl.preface_of_text = false
 mail_tbl.subject = sjct
 mail_tbl.text = text

 return rt.mail(mail_tbl)
end

パラメーター確認を行う関数

function check_param()
 local i, k, v
 local err = false

 if digits < 4 or 64 < digits then
  err = true
 end

 for i = 1, #user_tbl do
  if user_tbl[i].name == "" then
   err = true
  end
  for k, v in pairs(user_tbl[i].mail_tbl) do
   if v == "" then
    err = true
   end
  end
 end

 return err
end

メインルーチン

local i, pass, err

if check_param() then
 rt.syslog(log_level, "Parameter Error. (OneTimePass.lua)")
 os.exit(0)
end

for i = 1, #user_tbl do
 pass = make_pass(user_tbl[i].name)
 err = send_mail(user_tbl[i].name, pass, user_tbl[i].mail_tbl)
 if not err then
  rt.syslog(log_level, "failed to send mail to " .. user_tbl[i].mail_tbl.to .. ". (OneTimePass.lua)")
 end
end

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

メール

ご相談・お問い合わせ