不要パケットによって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する。
スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
opkg update opkg install kmod-nft-bridge opkg install kmod-nft-arp cat << "EOF" > /etc/nftables.d/tp-bridge.sh . /lib/functions/network.sh network_flush_cache nft add table bridge tp_bridge nft flush table bridge tp_bridge nft add chain bridge tp_bridge eth0_and_eth1 { type filter hook forward priority -200\; policy accept\; } # create a chain for traffic between eth0(lan) and eth1(wan) nft add rule bridge tp_bridge eth0_and_eth1 arp daddr ip 192.168.1.220 accept # allow ARP nft add rule bridge tp_bridge eth0_and_eth1 arp saddr ip 192.168.1.220 accept # allow ARP nft add rule bridge tp_bridge eth0_and_eth1 arp daddr ip 192.168.1.221 accept # allow ARP nft add rule bridge tp_bridge eth0_and_eth1 arp saddr ip 192.168.1.221 accept # allow ARP nft add rule bridge tp_bridge eth0_and_eth1 ether type arp drop # drop all other ARP traffic nft add rule bridge tp_bridge eth0_and_eth1 ct state established,related accept # Conntrack state is one of established, related nft add rule bridge tp_bridge eth0_and_eth1 iifname "eth1" oifname "eth0" udp dport { 67, 68 } accept # allow DHCP nft add rule bridge tp_bridge eth0_and_eth1 udp dport 1900 drop # block SSDP nft add rule bridge tp_bridge eth0_and_eth1 udp dport 5353 drop # block mDNS nft add rule bridge tp_bridge eth0_and_eth1 ip6 saddr 0::/0 drop # block IPv6 nft add rule bridge tp_bridge eth0_and_eth1 iifname "eth0" oifname "eth1" accept nft add rule bridge tp_bridge eth0_and_eth1 iifname "eth1" oifname "eth0" ip daddr 224.0.0.0/4 drop # block IPv4 multicast nft add rule bridge tp_bridge eth0_and_eth1 iifname "eth1" oifname "eth0" ip saddr 192.168.1.0/24 accept nft add rule bridge tp_bridge eth0_and_eth1 counter drop EOF uci -q delete firewall.bridge uci set firewall.bridge="include" uci set firewall.bridge.path="/etc/nftables.d/tp-bridge.sh" uci commit firewall service firewall restart |
スクリプトの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 が エコモニターである。基本的にこれらとの通信のみを許可する。