OpenWrt の nftables を使用した Transparent Firewall

不要パケットによってECOマネシステムがポート遮断することを防ぐために、ECOマネシステムとネットワーク間にパケットフィルタリングを行うTransparent Firewall (Bridge)を設置することとした。機器としては手元にあった PoE給電で動作する GL-iNet AR750-poe (廃番)を利用した。OpenWrtデバイスでPoE給電できるものが他にあると良いが、小型で安価なものは見つからなかった。

以前は Ecoマネへの不要パケットのフィルタリング で書いたようなフィルタリングをしていたが、ECOマネに届くパケットが増えたようで、ポート遮断が起きるようになったので、この記事のようにした。

ところで、この夏に、GL-iNetの製品をamazonで調べようと思ったが、GL-iNet製ルータの脆弱性の問題(Security Advisories (Vulnerabilities and CVEs) August 1 2024)の影響なのか、日本から撤退したのかはっきししないが、ほとんどの機種は販売されないようになっていた。OpenWrt デバイスとして安価なものがあり便利なところもあったので残念である。

nftables

Transparent firewallの設定は OpenWrt の nftables を利用している。

GL-AR750のファームウェアは使わないので、https://openwrt.org/toh/gl.inet/gl-ar750 から OpenWrt 23.05 をダウンロードして、インストールした。

GL-AR750ファームウェア

ちなみに、nftables は OpenWrtの 22.03 からサポートされているようなので ( https://openwrt.org/docs/guide-user/firewall/misc/nftables )、GL-AR750 のfirmwareを利用する場合にはバージョン4.3.7以降である必要があり ( https://dl.gl-inet.com/release/router/release/ar750/4.3.7 )、OpenWrt 22.03.4がベースになる。

OpenWrtは直接関係ないようであるが、前述の脆弱性の問題があるので、firmwareはより新しいバージョンが良い。これを書いている時点の最新は、バージョン 4.3.18 である( https://www.gl-inet.com/support/firmware-versions/ )。GL-AR750は、SupportのStatusががMaintenance になっており、OpenWrtのバージョンは 22.03.4 が最後のバージョンのようだ。

設定

IPv4 のみを設定する。ECOマネはIPv4しか使わないので、IPv6はすべてdropする。

スクリプト

スクリプトの13行から16行目 (ARP)

ECOマネ、エコモニター共に ARPの問い合わせ request をしたり、request に responseする必要がある。宛先アドレス arp.daddr や 送信元アドレス arp.saddr が 192.168.1.220 もしくは 192.168.1.221 であるARPのフレームを受け付ける。

スクリプトの17行目 (ARP)

それ以外のARPは不要なので、ether.type が arp のフレームは drop する。

スクリプトの19行目 (Conntrack state)

Conntrack state が、establishedか related のパケットは accept する。

スクリプトの20行目 (DHCP)

DHCP を可能にするために、eth1 (ルータ側[WAN]) もしくは eth0(ECOマネ側[LAN]) からの宛先ポート 67もしくは68のパケットは acceptする。

スクリプト21行目 (UPnP)

UPnPのパケットは不要なので UDPの宛先ポートが 1900 のパケットは drop する。

スクリプト22行目 (mDNS)

Multicast DNS (mDNS) もECOマネ、エコモニターでは使っていないので、 UDPの宛先ポートが 5353 のパケットは drop する。

スクリプト23行目 (IPv6)

IPv6 は不要なので dropする。

スクリプト24行目 (lan -> wan)

eth0(ECOマネ側[lan]) から eth1(ルータ側[wan]) へのパケットは通すためにacceptする。

スクリプト25行目~26行目 (wan->lan)

eth1(ルータ側[wan])からeth0(ECOマネ側[lan]) のマルチキャストパケットは不要なので、宛先IPアドレスが224.0.0.0/4 のパケットをdropする。

eth1(ルータ側[wan])からeth0(ECOマネ側[lan]) で、同じセグメント(192.168.1.0/24)からのパケットは透過にするために、送信元IPアドレスが 192.168.1.0/24 のパケットは acceptする。本来ならeth1(ルータ側[wan])からeth0(ECOマネ側[lan]) のパケットはすべて通すようにしても良いように思うが、このように制限しておかないと、ルータの制御に使っている別セグメントのwireless lan (wwan)から、ブロードキャストパケットが lan側に送られてしまったため、ECOマネと同一セグメントのみ通すようにしている。もっと良い方法があるかもしれない。

スクリプト27行目 (drop)

他のすべてのパケットは drop して、ECOマネに不要なパケットが届かないようにする。counter で統計情報は収集する。デバッグ時は log も指定して、ログを記録するようにした。

スクリーンショット

ファイアウォール ( Status > Firewall )の設定

192.168.1.220 が ECOマネであり、192.168.1.221 が エコモニターである。基本的にこれらとの通信のみを許可する。

インタフェース ( Network > Interfaces )の設定

デバイス( Network > Interfaces > Devices )の設定

スイッチ( Network > Switch )の設定

スイッチ( Network > Firewall )の設定