0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RTX1200でipv6対応のfqdnフィルタっぽいことをする

Posted at

概要

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?