システムリブートでのiptables/ipset自動復旧

停電や再起動のあと、PPPoEが自動接続されてもiptablesがデフォルトのままではセキュリティレベルが低い状態でサーバが公開されます。

そこで、リブート時にipsetによる制限などを自動復旧する内容を実装しました。

overlayfs環境などで設定復元を安定させるには工夫が必要です。

そこで、PPPoE確立後に自動でiptables/ipsetを初期化し、ブート後一度だけ外部リストをDL更新する構成を組みました。
結果として、停電やリブートが起きても、何もしなくても通信制御が完全に復元されます。

背景

PPPoEは起動時に自動接続されるよう設定済み(/etc/network/interfaces)

iptables・ipsetの設定は /mnt/data/sh/restore_iptable.sh にまとめてある

外部サイトから更新リストをDLする重い処理(update_ipset.sh)は再接続のたびに実行したくない

/etc/ppp/ip-up.d/ は overlayfsで直接編集できない

解決策の方針

/etc/ppp/ip-up.d/ にラッパースクリプトを1本だけ置く

まず軽量な restore_iptable.sh を即実行して通信ルールを復元
(restore_iptable.sh で空のipsetを作成し、iptables のチェインに組み込んでおく)

ブート後の最初の接続時だけ update_ipset.sh をバックグラウンドで走らせる
(restore_iptable.sh で作成した空のipsetの中身を更新)

/run/update_ipset_done で再実行を防止(再起動時に自動リセット)

実際のスクリプト

/etc/ppp/ip-up.d/ppp_up_wrapper

#!/bin/bash
# Run restore_iptable.sh immediately and update_ipset.sh only once after boot

FLAG_FILE="/run/update_ipset_done"
LOGFILE="/tmp/update_ipset.log"

echo "$(date '+%Y-%m-%d %H:%M:%S') [ip-up] PPPoE connected" >> "$LOGFILE"

# OverlayFSでなければ無効
if ! mount | grep -q overlay; then
    echo "OverlayFS not active, skip ppp_up_wrapper" >> "$LOGFILE"
    exit 0
fi

# 処理を一つの関数にまとめ、全体をバックグラウンドへ送る
run_initialization() {
    # ブート後初回のみ ipset の枠と iptables を復元
    if [ ! -f "$FLAG_FILE" ]; then
        echo "Step 1: Running restore_iptable.sh..." >> "$LOGFILE"
        bash /mnt/data/sh/restore_iptable.sh >> "$LOGFILE" 2>&1

        echo "Step 2: Running update_ipset.sh..." >> "$LOGFILE"
        bash /mnt/data/sh/update_ipset.sh >> "$LOGFILE" 2>&1

        touch "$FLAG_FILE"
        echo "All steps completed successfully." >> "$LOGFILE"
    else
        echo "Already executed, skipping iptables update step." >> "$LOGFILE"
    fi
}

# 関数全体をバックグラウンドで実行(pppdを待たせない)
run_initialization &

動作の流れ

起動後最初の接続時
→ restore_iptable.sh 実行
→ update_ipset.sh がバックグラウンドで起動
→ /run/update_ipset_done が作成される

その後の手動再接続(poff/pon)
→ restore_iptable.sh だけ実行
→ update_ipset.sh はスキップ

再起動後
→ /run/ は揮発領域のため、再び初回接続で update_ipset.sh が実行される

補足と工夫

/mnt/data/sh/ (USBメモリー上)に実体を置くことで overlayfs 環境でも編集自由

長時間DLやipset投入処理はバックグラウンドで処理するため、PPPoE接続の遅延を防止

ログは /var/log/update_ipset.log に時系列で記録

restore_iptable.sh の中で logger を使えば syslog にも出力できる

所感

この仕組みを入れておくと、
停電でのリブートやネット障害復旧後でも 自動で完全復旧 します。
iptables/ipsetが空のままになることもなく、再接続時の不要な再DLも避けられます。

シンプルですが、PPPoE運用での安心感が大きく変わります。
「何もしなくても元通り動く」──それが一番の快適さです。