概要
RTX1200はfqdn非対応機種である。そこを何とかする。
我が家では、実家のみRTX1200が生き残っており、ほかの拠点は先日RTX1210へのリプレイスが終わっている。実家は帰省頻度も低く、パフォーマンス的にも困っておらず、フレッツ光 HGWの配下に存在するため自分でmap-eのセッションを張る必要もないため、リプレイスの動機が薄い。いつか電源が壊れるとは思いつつ。
しかし今回、別拠点へIPv6経由でL2TP/IPSecを張りたいという要件が出てきてしまって、困ったのである。
RTX1200はfqdnに非対応
当初書いていたフィルタは下記の通り。
ipv6 filter 1040 pass * * udp * 500
ipv6 filter 1041 pass * * esp
ipv6 filter 1042 pass * * udp * 4500
この書式では、インターネットに向けてudp500,udp4500,espがご開帳する。上位のHGWにFirewallが設定されており、フレッツNGN外からのパケットはDropしているとはいえ、う~ん、微妙。
udp500,4500はdynamicフィルタで許可しているので内→外への通信では不要と思うのだが、なぜかRejectされてしまうので入れてある。
fqdnフィルタに対応したRTX1210では下記のように書ける。しかし、RTX1200にはfqdnフィルタは実装されていないので、こういった書き方はできない。そこで、Luaスクリプトを用いて何とかする。
ipv6 filter 1040 pass example.com * udp * 500
ipv6 filter 1041 pass example.com * esp
ipv6 filter 1042 pass example.com * udp * 4500
luaスクリプト
luaスクリプトは、下記の方針で作る。
- 何らかの方法でfqdnからAAAAレコードを引く
- フィルタ書式を組み立てる
- フィルタを挿入する
IPv4ではあるが、Yamaha用鎖国フィルタを開発している方もいるので、まあ何とかなるのではないか。
RTX1200でipv6名前解決をする
フィルタに挿入するipv6アドレスを得なければならないので、名前解決の方法を探す。まず、nslookupを試す。
# nslookup google.co.jp
172.217.25.163
なんとなくだが、ipv4にしか対応してない雰囲気がしてきた。そこで、IPv6(AAAAレコード)しか存在しないfqdnで引いてみる。
# nslookup example.com
Error: No such domain name
ドメインがないといわれた。おわり。
正攻法だとダメそうなので、次はpingを送ってみる。
# ping6 -c 1 example.com
received from 2001:db8::1234, icmp_seq=0 hlim=56 time=12.500ms
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max = 12.500/12.500/12.500 ms
なんかいい感じにIPv6アドレスが取れそうなので、luaスクリプト with Chat GPTに何とかしてもらうことにする。
luaスクリプト
rt.syslog("info", "[fqdn-filter-add] Program Start")
fqdn = "example.com"
rtn, str = rt.command("ping6 -c 1 " .. fqdn)
rt.syslog("info", "[fqdn-filter-add] response=" .. str)
local ipv6_address = str:match("received from ([%x:]+)")
if ipv6_address then
ipv6_address = ipv6_address:gsub(",", "")
rt.syslog("info", "[fqdn-filter-add] addr=" .. ipv6_address)
rtn, str = rt.command("ipv6 filter 1999 pass * " .. ipv6_address .. " * * *")
rtn, str = rt.command("ipv6 filter 1998 pass " .. ipv6_address .. " * * * *")
else
rt.syslog("info", "[fqdn-filter-add] addr extraction failed")
end
あとはluaスクリプトをRTX1200に流し込み、毎分スケジューラで回せばいい感じにfqdnフィルタが完成する。
schedule at 5 */* *:*:00 * lua /filter-update.lua
こんな感じでlogに出てきたら完成
2024/12/29 11:33:02: [LUA] Task(1) executed rt.command("ipv6 filter 1999 pass * 2001:db8::1234 * * *"): true