openwrt の firewall ipset 記述を入れたがうまく動かない。
firewall ipset を記述するときの注意。
fw4 / 2203以降
ipset ではなく、nft list setsを使ってる。
fw3 / 2203 未満
ipset rule を使っている。
rule が動かないとき
ipset を使った rule が動かない。(21.02.1、21.03.3 で確認)
protocol tcp を指定すると動く。
list proto 'tcp'
設定例 / マッチしたものを拒否
config ipset option name 'public_dns' option match 'dest_ip' option family 'ipv4' option loadfile '/etc/config/custom/public-dns/ip-list.txt' option enabled '1' config rule option src 'lan' option dest 'wan' option ipset 'public_dns' option target 'REJECT' option device 'pppoe-mopera' option direction 'out' option family 'ipv4' option name 'reject public dns:ipset' list proto 'icmp' list proto 'any'
設定例 / マッチしないものを拒否
config ipset option name 'jp_addr' option match 'dest_ip' option family 'ipv4' option loadfile '/etc/config/custom/ipset/jp_addr.txt' option enabled '1' config rule option name 'sslh-443 /ipset:cloudflare' option direction 'in' option device 'pppoe-ybb' option ipset '!jp_addr' option family 'ipv4' list proto 'tcp' list proto 'udp' option src 'wan' option dest_port '443' option target 'DROP'
rule 記述の注意。
わざわざ記事に書いているのは、トリッキー記述が必要だったから。プロトコル指定が必要。
ipsetを使うときluci/uci ではプロトコルを指定しないと動かなかった。プロトコルを指定すると動く。
以下に例を書く。
これは動く
#動く list proto 'tcp' list proto 'udp' list proto 'icmp'
プロトコルを省略したら動かない
## 動かない config rule option name 'sslh-443 /ipset:cloudflare' option direction 'in' option ipset '!jp_addr' option family 'ipv4' option src 'wan' option dest_port '443' option target 'DROP' ## list proto 省略
プロトコルをANYにしても動かない。
## 動かない list proto 'any'
プロトコルを指定すると動く
## 動く list proto 'icmp' list proto 'tcp' list proto 'udp'
プロトコルをICMP+ANYにすると、ANYでマッチする(謎)
## 動く list proto 'icmp' list proto 'any'
理由はよくわからない。