#モチベーション
RHEL7になって標準でインストールされるパッケージが iptables から firewalld になりましたが、iptables パッケージがなくなったわけではなく、追加インストールすることにより引き続き iptables で運用することも可能です。また、旧バージョンを使用している場合やわざわざパッケージをアンインストールした場合など、firewalld が存在していないこともあるでしょう。シェルスクリプトで実際にどちらを使用しているかをチェックして処理を切り替えたい時の方法を考えました。
#実現方法
以下の2点をチェックしてどちらも真である場合はfirewalld を使用しているものとします。
- firewalld がインストールされている
- firewalld が実行中である
firewalldへの操作はfirewalldを直接実行するのではなく、パッケージに含まれるfirewall-cmdを使用します。なお、firewall-cmd の実行は root 権限が必要で、権限がない場合は firewall-cmd の終了コードが必ずエラーとなります。ここでは省略しますが、事前に $EUID が 0 であるかどうかで root 権限があるかどうかを確認し、root権限がない場合はここに入らないようにする必要があります。
firewalld が実行中であるかどうかは
$ firewall-cmd --state
を実行して終了コードを確認します。
ということで、以下のようなスクリプトとなります。
#!/bin/bash
if which firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then
echo You are using firewalld.
# ここにfirewalld使用時のコード
else
echo You are using iptables.
# ここにiptables使用時のコード
fi
#結果
$ sudo ./check-firewalld.bash
You are using iptables.
$