Firewalldサービスの設定
OS7系よりiptablesではなくfirewalldの利用が推奨されています。
iptablesもインストールされていますが、デフォルトでは無効化されています。
firewalldの稼働状況確認
# firewall-cmd --state
インストールされていない場合インストールする。
# yum install firewalld
NetworkManager管理環境で後からfirewalldをインストールした場合、管理の競合が発生する場合があるため、
NetworkManagerを再起動しておく。
firewalldではzone
という単位でセキュリティグループを定義しています。
セキュリティグループにNICを登録する事でポリシーの定義、管理を簡単に行えるようにしています。
zone名 | ex |
---|---|
drop | 着信ネットワークパケットはすべて遮断され、返信されません。送信ネットワーク接続のみが可能です。 |
block | IPv4 では icmp-host-prohibited メッセージで、IPv6 では icmp6-adm-prohibited メッセージですべての着信ネットワーク接続が拒否されます。システム内で開始されたネットワーク接続のみが可能です。 |
public | 公開エリア用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターを信頼しません。選択された着信接続のみが許可されます。 |
external | マスカレードを特別にルーター用に有効にした外部ネットワーク上での使用向けです。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターを信頼しません。選択された着信接続のみが許可されます。 |
dmz | 公開アクセスが可能ではあるものの、内部ネットワークへのアクセスには制限がある非武装地帯にあるコンピューター用。選択された着信接続のみが許可されます。 |
work | 作業エリア用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターをほぼ信頼します。選択された着信接続のみが許可されます。 |
home | ホームエリア用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターをほぼ信頼します。選択された着信接続のみが許可されます。 |
internal | 内部ネットワーク用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターをほぼ信頼します。選択された着信接続のみが許可されます。 |
trusted | すべてのネットワーク接続が許可されます。 |
LANに接続しているNICがデフォルトでどのzoneに登録されているかを確認。
# firewall-cmd --get-zone-of-interface=${INTERFACE_NAME}
アクティブなzoneとNICを一括で表示
# firewall-cmd --get-active-zones
NICの登録ゾーンを変更する場合はnmcliコマンドで設定する。
# nmcli c mod "eth0" connection.zone public
# nmcli c up eth0
# nmcli -p con show "eth0"
デフォルトで利用されるzoneの情報は下記設定ファイルで管理されています。
コマンドで変更する場合
# firewall-cmd --set-default-zone=public
# vim /etc/firewalld/firewalld.conf
DefaultZone=public
手動で変更した場合はfirewalldを
# firewall-cmd --reload
または
# firewall-cmd --complete-reload
を実行して反映させます。
firewalldコマンドで操作、変更した内容を永続的にするには、--direct
コマンド(これらは元々一時的なもの)を除いてすべてのコマンドに--permanent
オプションを追加します。
こうすると変更が永続的になるだけではなく、変更はファイアウォールのリロード、サービスの再起動、
もしくはシステムの再起動後にのみ適用されることに注意してください。--permanent
オプションなしでfirewall-cmd
を使って設定すると、
変更は即座に適用されますが、これが有効なのはファイアウォールがリロードされる、システム再起動、
またはfirewalldサービスが再起動されるまでになります。
ファイアウォールのリロード自体は接続を切断しませんが、一時的な変更が破棄されることに注意してください。
ポリシーの登録
firewalldのポリシーは基本的にINに対するポリシーを管理します。
まずzoneにデフォルトでどのようなポリシーが設定されているか確認します。
# firewall-cmd --zone=public --list-all
許可ポートの追加
# firewall-cmd --zone=public --add-port=80/tcp
レンジで登録したい場合は下記のように指定-add-port=5060-5061/udp
登録されると一覧が下記のように見えます。ports: 80/tcp
許可サービスの追加
ポートやポートレンジをサービスとして登録し、サービスの許可、拒否という管理も行えます。
# firewall-cmd --zone=public --add-service=smtp
現在登録されているサービスの確認
# firewall-cmd --get-services
dhcpv6-client ssh
登録したサービスを削除したい場合
--remove-service=smtp
firewall経由でiptablesにはどのように設定されているかを確認しておく。
# iptables -nL
内容を確認してみると、チェインを細分化し管理している事がわかる。***_public
と書いてあるのが基本操作で設定するチェイン
***_public_****
の内容をインクルードしており、
基本のサービスやポート登録、リッチルールはここで管理されている。
それらを***_IN_ZONE
でインクルードして、
さらにそれをOUTPUT
,INPUT
チェインにインクルードしてゾーンごとに管理している
後述する****_direct
だけ直接INPUT
に等に配置されている。
リッチルール
サービスやポート単位の許可・拒否ではなく細かく制御したいときに利用できるルールを作成できます。
制御できるのは通常どおりINに対するアクセスのみになります。
リッチルールの基本書式
firewall-cmd [--permanent] --add-rich-rule = ルール(追加)[––timeout=(seconds)]
firewall-cmd [--permanent] --remove-rich-rule = ルール(削除)[––timeout=(seconds)]
定義内容の確認
# firewall-cmd --list-rich-rules
定義例
# firewall-cmd --add-rich-rule="rule family=ipv4 source address=1.0.16.0/20 service name=https accept"
iptablesの定義方法と似ているが、ゾーンの概念があり送信元やポートに対してアクセスを制御できる。
ダイレクトルール
firewalldを経由してiptablesに直接定義を記述するようにルールを作成できる。
基本挙動とちがいOUTに対するルールも作成できる。
書式
firewall-cmd [--permanent] --direct --add-rule {ipv4|ipv6|eb} <テーブル> <チェイン> <優先順位> <引数>(追加)
firewall-cmd [--permanent] --direct --remove-rule {ipv4|ipv6|eb} <テーブル> <チェイン> <優先順位> <引数>(削除)
定義例
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT_direct 2 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 1 -s 0.0.0.0 -p tcp -m state --state NEW --dport 22 -j ACCEPT
iptablesライクに定義を行う事が出来るので、iptablesからも乗り換えられるようにできている。
これであればiptablesを使ったほうが便利なような気はする。。。
iptablesと違い初期化が無いため追加と削除は別々に行なわなければならないが、 XML形式で記述する事でiptables時と同様にポリシーを簡単に管理、配布する事が出来る。
# vim /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<!-- default rule -->
<rule priority="2" table="filter" ipv="ipv6" chain="INPUT_direct">-j DROP</rule>
<rule priority="2" table="filter" ipv="ipv4" chain="OUTPUT_direct">-j DROP</rule>
<rule priority="2" table="filter" ipv="ipv6" chain="OUTPUT_direct">-j DROP</rule>
<rule priority="2" table="filter" ipv="ipv4" chain="FORWARD_direct">-j DROP</rule>
<rule priority="2" table="filter" ipv="ipv6" chain="FORWARD_direct">-j DROP</rule>
<!-- ssh -->
<rule priority="1" table="filter" ipv="ipv4" chain="INPUT_direct">-s 59.159.73.35 -p tcp -m state --state NEW --dport 22 -j ACCEPT</rule>
</direct>
ルールの管理
firewalldではゾーンポリシー、リッチルール、ダイレクトルールがそれぞれ有効に動きます。
そのため定義の管理やルールの内容、適応順序はiptable -nL
等でしっかり把握しておく必要があります。
またデフォルトポリシーはDROP
ではありません。
操作ロック
他root実行されているアプリケーションからfirewallの設定を変更されたくない場合ロックすることが可能
ロック状態の確認
# firewall-cmd --query-lockdown
ロックの有効化、無効化
# firewall-cmd --lockdown-on
# firewall-cmd --lockdown-off