それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

openWrtのFirewallにホットプラグする。

OpenWrtはホットプラグで「〇〇したとき」に任意のスクリプトを実行できる。

interface(iface)で、接続時に〇〇するとかできる。

Firewallが追加されたときに、なにかしたいと思ったが、公式サイトに記述がない。

イベントを調べた。

mkdir /etc/hotplug.d/firewall
touch /etc/hotplug.d/firewall/sample.sh
chmod +x /etc/hotplug.d/firewall/sample.sh

/etc/hotplug.d/firewall/sample.sh

## 実行時に変数を保存して調べる。
echo '-----------' > /tmp/firewal.$ZONE
env >> /tmp/firewal.$ZONE

環境変数でファイルを調べる。 Firewallの追加はゾーン単位で起動され非同期(ノン・シーケンシャル / 並列)で行われる。

イベントの識別。

変数は次のようになっていて、必要なイベントを拾うことができる。

環境変数
ZONE FWゾーン wan
USER 実行ユーザ root
ACTION 手順種別 add
SHLVL シェルの深さ 1
HOTPLUG_TYPE 種別 firewall
LOGNAME ログ名 root
DEVICENAME バイス名? 空白
PATH 実行PATH /usr/sbin:/usr/bin:/sbin:/bin
INTERFACE インターフェース vpn_net
PWD 実行DIR /
DEVICE バイス eth1

サンプル

case と if を使って必要なイベント時にだけ実行されるようにする。

#!/bin/bash


function my_firewall(){
    case $1  in
      add)
        my_iptables add
        ;;
      remove)
        my_iptables add
        ;;
    esac
}


TARGET_ZONE=wan
TARGET_NAME=pppoe_isp
TARGET_HOTPLUG=fiewall


function main(){
  if [[ ! $HOTPLUG_TYPE == $TARGET_HOTPLUG ]]; then
    return 0;
  fi
  if [[ $ZONE == $TARGET_ZONE && $DEVICE==$TARGET_NAME  ]];then
    my_firewall $ACTION
  fi
}

main;

ホットプラグで便利

ホットプラグでファイアウォール使うと、スクリプトを使ってiptablesを使いやすい。LuCIに書くと複雑になりがちな条件をまとめて書くことができて便利だ。

参考資料

https://openwrt.org/docs/guide-user/base-system/hotplug