iptablesのルールを永続化するために「iptables-persistent」が利用されることが多いものの、すべてのディストリに公開されているわけではなく、OpenSUSEなどもこの例に漏れず。
仕方なくsystemdにて起動時にiptablesにルールを追加する。
systemd用サービスファイル用意
iptablesのようなものは特権で実行する必要があるので、「/etc/systemd/system/」以下に用意する。
ファイル名は.serviceがついて管理しやすいのならなんでもいいっぽい。
※非特権の特定ユーザーで実行したい場合は「/etc/systemd/user/」以下に用意するらしい
[Unit] Description=my startup After=network.target [Service] ExecStart=bash <実行するスクリプト>.sh [Install] WantedBy=multi-user.target
ExecStartはbashじゃなくてもいいけど、今回作ったものはbashで実行したかったのでこれで。
iptablesは「network-pre」の段階で起動されているはずで、
「After=network.target」で指定すれば問題なくルールを追加できるようになっているはず。
.serviceファイルの所有者と実行権限は他のものに合わせる(デフォであればroot:root パーミ664)
<実行するスクリプト>.shを用意
普通に特権ユーザーがアクセス可能な場所、権限でshellスクリプトを置くだけ。
#!/bin/bash # スタートアップ時に実行するコマンド羅列 # iptablesルールに独自のものを追加する iptables -I INPUT -s 101.36.0.0/16 -j DROP # 最後にログを吐く echo $(date +"%Y/%m/%d %H:%M:%S") "started /root/myStartup.sh" >> /var/log/my_startup.log
bash指定で起動するため、権限は644のままでいいと思う。
最後にログを吐くようにしておけば、実際にスクリプトが実行されたかどうかが判別しやすい。
systemctl enableで自動起動設定
通常起動状態で「<実行するスクリプト>.sh」が実際に動くことを確認した後、
サービスを自動起動に指定する。
# systemctl enable my-startup.service
あとは実際に再起動とかしてみてログが出力されたりすることを確認する。
もしスクリプトが不安定で、自動起動から外したい場合は下記コマンドで無効化すればいい。
# systemctl disable my-startup.service