openwrt で ipset をfirewall のルールに書く
ipset を使って openwrt の firewall ルールを記入する
目的
ipset を使ってルールを完結に書きつつ、OpenWRTのWEB-UI(luci)と連携したい
追記2023-04-04
バージョンによってはlist proto`を書かないと動かない。詳しくは、別エントリ に書いた。
準備
ipset を準備する。
opkg install ipset
ipset コマンドの使い方の確認
ipset にテーブル(リスト)を作って、そこにデータをいれて、中身をみて、リストを消す方法。最初に覚えておいてサクッと確認する。
ipset list ipset create my_list hash:ip ipset add my_lisrt 192.168.1.1/32 ipset list my_list ipset list -n ipset destory my_list
ipset を firewall ルールに追加する
openwrt の firewall は ipset のルールを使用可能なので、マニュアルにしたがって記入する。
以下の設定例は、ファイルに記載されたIPアドレスをipset に読み込んでリスト表を作成する。
記入例
config ipset option name 'public_dns' option storage 'hash' list match 'dest_ip' option enabled '1' option family 'ipv4' option loadfile '/root/my-ip-list.txt'
ファイルに記載されたIPアドレスを読むこんで、IPSetのリスト表が作成される。
再起動して確認。
service firewall restart ipset list public_dns
記述ミスがあると、再起動しても反映されない。
Warning: Option @ipset[0].storage has invalid value 'hash:xxx'
Warning
と出てくるが、実際にはエラーである。記述を見直してエラー修正して、再起動
設定例2 / 日本のv4アドレスに限定する。
設定例2
config ipset option name 'jp_addr_list' option storage 'hash' list match 'src_net' option enabled '1' option loadfile '/etc/jp_addr_list.txt'
最初の例と違って、IPアドレスではなく、ネットワーク範囲で指定している。 ファイルの記述例 / jp_addr_list.txt
153.120.0.0/13 153.128.0.0/13 153.136.0.0/14 153.140.0.0/15 153.142.0.0/16 153.143.0.0/19
作成済みIPSet を使う
IPSetを使ったファイアウォールのルールを記述する。
名前を使って、IPSetのリスト名を指定する。
config rule option ipset 'public_dns'
設定例
config rule option src 'lan' option dest 'wan' option ipset 'public_dns' option target 'REJECT' option device 'my-pppoe' option direction 'out' option family 'ipv4' option name 'reject public dns '
上記の設定例はpublic_dns へのFORWARDを拒否する。public_dns を使わせないようにする設定を書いて、DNSサーバーで監視するGoogle HomeやTP-linkを締め出す設定例。
設定のマニュアル
指定可能な項目は、OpenWRT wiki にマニュアル記載があるので、細かい指定はマニュアルを参照すると良い。