ヤマハルーター向け鎖国フィルター、定期更新の自動化(後編)

 一つ前 でパラメータ指定でフィルターファイルを取得する具体的な方法を説明しました。
 今回は、こうして入手したフィルターファイルを実際にルーターに自動セットするところ説明します。
 例題がないと分かりにくいので、以下のようなケース(海外に出かける縁のない人)を想定することにします。

  • ルーター NVR500 は 192.168.1.1/24 で管理者パスワードは root である。
  • 内側に WEBサーバー/メールサーバー(SMTP/POP/IMAP) がいる。
  • WEBサーバーは 192.168.1.2、メールサーバーは 192.168.1.3 とする。
  • 遠隔保守用に、RT107e(IPSec/L2TP) と ラズパイ(SSH) も内側にいる。
  • RT107e は192.168.1.4、ラズパイは 192.168.1.5 とする。
  • WEB閲覧は全ての国に許可
  • メールは全ての国から受信
  • 受信したメールを読むのは日本国内からのみ
  • 保守用の IPSec/L2TPSSH も日本国内からのみ
  • プロバイダの050番号も収容し、これも日本国内のみ

 外→内 の設定

# 例外なく拒否
ip filter 10 reject 10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16 * * * *
ip filter 11 reject * * udp,tcp * 135,137-139,445
ip filter 12 reject * * udp,tcp 135,137-139,445 *

# 国に関係なく許可
ip filter 30 pass * 192.168.1.2 tcp * 80,443
ip filter 31 pass * 192.168.1.3 tcp * 25

# 日本以外を拒否
# ip filter 100〜139 の予定

# 日本のみ許可
ip filter 300 pass * 192.168.1.3 tcp * 110,143,587
ip filter 301 pass * 192.168.1.4 udp * 500,4500
ip filter 302 pass * 192.168.1.5 tcp * 22
ip filter 303 pass * 192.168.1.1 tcp * 5060
ip filter 304 pass * 192.168.1.1 udp * 5004-5035,5060  # 注)ISP によって相違あり

# これを pp に適用する
pp select 1
ip pp secure filter in 10 11 12 30 31 100 101 ・・ 138 139 300 301 302 303 304

 内→外 の設定はユルユル

# 例外なく拒否
ip filter 20 reject * 10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16 * * *
ip filter 21 reject * * udp,tcp * 135,137-139,445
ip filter 22 reject * * udp,tcp 135,137-139,445 *

# 何でもあり(一般的な家庭用ルーターの工場出荷時と同次元)
ip filter 40 pass * * * * *

# ダイナミックフィルター
ip filter dynamic 1 * * tcp
ip filter dynamic 2 * * udp

# これを pp に適用する
pp select 1
ip pp secure filter out 20 21 22 40 dynamic 1 2

※ PP の設定、LAN の設定、NAT の設定は割愛してます。


 中でコメント書きました「# ip filter 100〜139 の予定」の部分に「日本以外を拒否」なフィルターリストを突っ込み、この部分を定期更新とします。


Lua 対応ルーター NVR500、NVR510、RTX1200、RTX1210 等々



 この子たちは Lua が使えるので、パソコンなしに自動定期更新が実現できます。(仕込みだけはパソコンが要りますが)


 まずは Luaソースコードをメモ帳か何かに貼り付けて保存します。
 ここでは C:\filter.lua と保存したことにして話を進めます。

http_filter = {
	url = "http://api.wakwak-koba.jp/filter/yamaha/in/reject.txt?country=!JP&start=100&max=139&save=1",
	method = "GET",
	save_file = "/filter.txt"
}

mail_tbl = {
	smtp_address = "smtp.hoge.local",
	from = "nvr500@hoge.local",
	to = "admin@hoge.com"
}

rt.syslog("info", "[SAKOKU] " .. http_filter.url .. " " .. http_filter.save_file)
rsp_t = rt.httprequest(http_filter)
if (rsp_t.rtn1) and (rsp_t.rtn2) then
	if (rsp_t.code <= 202) then
		f = io.open(http_filter.save_file)
		for line in f:lines() do
			if (string.sub(line, 1, 1) ~= "#") and #line > 0 then
				rtn, str = rt.command(line)
			end
		end
		f:close()
	end
	
	mes ="[SAKOKU] HttpStatusCode:" .. rsp_t.code
	if (rsp_t.code == 200) then
		rt.syslog("info", mes)
	else
		rt.syslog("notice", mes)
		print(mes)
	end
	
	mail_tbl.subject = mes;
	rtn = rt.mail(mail_tbl)
end

 http_filter と mail_tbl の中身は各自で変更してください。


 続いて、これをヤマハルーターに転送します。
 コマンドプロンプトから

tftp 192.168.1.1 put c:\filter.lua /filter.lua/root

 こんな風です。
 アクセス拒否みたいなメッセージが出たら、ルーター側で tftp を許可していないせいだと思うので、緩めてやって下さい。


 引き続きルーター内での操作になります。

show file list /

として、先ほどパソコンから送信した filter.lua がリストに含まれていることを確認します。
 スケジュールに組み込む前に、まずは手動で実行してみましょう。

lua filter.lua

 show status lua とか show log reverse とかしてエラーが出てないか確認します。
 機種により速度が違うみたいです。
 NVR500/RTX1200 の世代だと 10秒ちょっとかかるぽいですが、RTX1210 だったら3秒で済んでしまいました。


 更に、show config で(もしくは tftp で config を抜いて)確認もお願いします。
 何となく良さそうな雰囲気だったら

schedule at 1 */Mon 06:27 * lua filter.lua

みたいに、スケジュール登録してください。
 なるべく変な時刻でお願いします。(0分は止めてー)
 現時点では元のデータベースが週1更新なので、毎日やっても無駄です。


(補足)
 rt.httprequest が https に対応しているのは Lua Version 1.08 からのようで、現時点では NVR510/NVR700W のみのようです。(ソース
 私の身の回りには RTX1210 までしかないので、APIURIhttps じゃなくて http で書いてます。


 NVR510/NVR700W の人は https が使えるはずらしいので、https でお試し下さい。
※ FujiSSL の証明書に対応しているのかどうか、結果を教えて下さると嬉しいです


追記(2018/04/12)
 RTX1210 のファームウェアが更新され、14.01.26 から NVR510/NVR700W たちと同様に httprequest で https〜 が使えるようになりました。
 api.wakwak-koba.jp で用いている証明書は FujiSSL のものですが、正常にデータ取得できました。
 「https://api.wakwak-koba.jp/filter/yamaha/in/reject.txt?country=!JP&start=100&max=139&save=1」みたいな SSL 通信が利用可能です。



Lua 非対応ルーター (パソコンから更新します)



 いろいろな方法がありますが、最もオーソドックスであろう wget を使うパターンで書きます。
 残念ながら Windows には標準で wget が入ってなくて、似たようなものが Invoke-webrequest というものが用意されているのですが、こいつは PowerShell の中で使うコマンドでして、デフォルトだとスクリプトの実行が許可されておらず、手動で実行許可を与えないといけないとか、まぁ何かと面倒くさいので、この機会なので、Windows の人も wget をインストールしてやっちゃって下さい。


 入手先はここ
 インストール方法とかは適当にググって頂くとして、一つ書き添えるとしたら、インストール直後は PATH が通ってなくて何かと不便なので、wget.exe のあるフォルダへの PATH を通しておきましょう、ってくらいかな。


 適当なフォルダを作って、以下のバッチファイルを書いて保存します。

wget -O filter.txt --tries=1 "http://api.wakwak-koba.jp/filter/yamaha/in/reject.txt?country=!JP&start=100&max=139&save=1"
if ERRORLEVEL 0 tftp 192.168.1.1 put filter.txt config/root

 tftp で config に put してますが、差し替えじゃなくて上書きとして動作するようなので、これで大丈夫です。


 Lua版では結果をメールしたりというロジックが簡単に組み込めたので含めましたが、コマンドプロンプトからだと面倒なので割愛!
 結果をメールするだけのフリーソフトは探せばあると思うので、なんとか頑張って下さいね
※ いいバッチが書けた人(かつホームページなりブログ持ってる人)はコメントください。そちらのページへのリンク張ります♪


 んで、これを Windows のタスクあたり仕込んでおきます。


(補足1)
 Windows 版の wget は FujiSSL の証明書を認識しないぽいです。
 なにか回避する方法あると思いますが、とりあえず https じゃなくて http でやればうまくいきます。


(補足2)
 Linux に触れてませんが、この手のものに興味を示される方は相応のスキルをお持ちの方しかいないと思うので、Windows の例を参考にしつつテキトーに読み替えて下さい。