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に書くと複雑になりがちな条件をまとめて書くことができて便利だ。