「firewalld」の基本的な設定方法です。
ポートフォワーディング等の設定方法は別途作成していく予定です。
firewalldについて
CentOS6までのファイアウォールは「iptables」でしたが、CentOS7からは「firewalld」が初期状態では有効となっています。
「firewalld」について簡単に説明すると、通信制御のポリシーを設定する場合、事前に定義されたゾーンに対して通信の許可・遮断ルールを適用し、そのゾーンを各NIC(ネットワークアダプタ)に割り当てていくという方式になっています。
コマンドラインで「firewalld」を制御するために「firewall-cmd」というコマンドが用意されているので、その基本的な使用方法についてもまとめてます。
ゾーンについて
初期状態で9つのゾーンが用意されています。
※自分でもゾーンを新規に作成することもできます。
下記は初期に定義されてるゾーンの一覧です。
ゾーン | 通信許可サービス | 説明 |
---|---|---|
block | なし 外部からの接続はすべて遮断 | 設定変更不可 遮断時は「CIMP Pohibited」を返し、内部からの通信時は戻りの通信も許可される |
dmz | ssh | dmz用に定義されたゾーン |
drop | なし 外部からの通信はすべて遮断 | 設定変更不可 内部からの通信は送信できるが、外部からの戻りの通信は遮断されるため、結果的にすべての通信が出来ない |
external | ssh | IPマスカレード有効でルータなど外部ネットワークとの接続で使用するために定義されたゾーン |
home | dhcpv6-client ipp-client mdns samba-client ssh |
自宅などで使用するために定義されたゾーン |
internal | dhcpv6-client ipp-client mdns samba-client ssh |
内部ネットワークで使用するために定義されたゾーン |
public | dhcpv6-client ssh |
公共の場所で使用するために定義されたゾーン |
trusted | すべての通信を許可 | 設定変更不可 |
work | dhcpv6-client ipp-client ssh |
職場などの業務エリアで使用するために定義されたゾーン |
確認系コマンド
「fierwalld」の状態や設定内容を確認するためのコマンドについて説明していきます。
firewalld稼働状況確認
「firewalld」の稼働状況は下記のコマンドで確認することが出来ます。
# firewall-cmd --state
実行例
「firewalld」が動作している場合は「running」、停止している場合は「not running」と表示されます。
動作中
# firewall-cmd --state running
停止中
# firewall-cmd --state not running
systemctlコマンドを使用した確認
稼働状況の確認は「firewall-cmd」コマンド以外にも「systemctl」コマンドを使用することで確認出来ます。
# systemctl status firewalld
起動している場合
Active: active (running)と表示され、動作していることが確認できます。
# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since 金 2016-08-26 15:13:37 JST; 26min ago Main PID: 735 (firewalld) CGroup: /system.slice/firewalld.service mq735 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid 8月 26 15:13:35 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon... 8月 26 15:13:37 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
停止している場合
Active: inactive (dead)と表示され、firewalldが停止していることが分かります。
# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: inactive (dead) since 金 2016-08-26 15:40:18 JST; 20s ago Process: 735 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS) Main PID: 735 (code=exited, status=0/SUCCESS) 8月 26 15:13:35 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon... 8月 26 15:13:37 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon. 8月 26 15:40:18 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon... 8月 26 15:40:18 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.
ゾーンの設定確認
ゾーンの設定状態を確認するためのコマンドについて説明します。
defaultゾーン設定を表示
下記のコマンドで「default」として設定されているゾーンの設定内容を確認できます。
firewall-cmd --list-all
実行例
下記の実行例では、「public」ゾーンが「default」設定となっていて、「eno16777736」「eno33554984」のNICに割り当てられていること等がわかります。
# firewall-cmd --list-all public (default, active) interfaces: eno16777736 eno33554984 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
指定したゾーンの設定を表示
「--zone」で確認したいゾーンを指定することで、対象としたゾーンの情報を表示させることができます。
firewall-cmd --zone=ゾーン名 --list-all
実行例
下記の実行例は「dmz」ゾーンの設定を表示させた例となります。
# firewall-cmd --zone=dmz --list-all dmz interfaces: sources: services: ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
全てのゾーンの設定を表示
全てのゾーン情報を表示させるには「--list-all-zones」を使用します。
firewall-cmd --list-all-zones
実行例
初期定義されている9つのゾーンの情報が表示されます。
# firewall-cmd --list-all-zone block interfaces: sources: services: ports: masquerade: no forward-ports: icmp-blocks: rich rules: dmz interfaces: sources: services: ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: drop interfaces: sources: services: ports: masquerade: no forward-ports: icmp-blocks: rich rules: external interfaces: sources: services: ssh ports: masquerade: yes forward-ports: icmp-blocks: rich rules: home interfaces: sources: services: dhcpv6-client ipp-client mdns samba-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: internal interfaces: sources: services: dhcpv6-client ipp-client mdns samba-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: public (default, active) interfaces: eno16777736 eno33554984 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: trusted interfaces: sources: services: ports: masquerade: no forward-ports: icmp-blocks: rich rules: work interfaces: sources: services: dhcpv6-client ipp-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
--permanentオプションの有無について
ゾーンの設定を確認する際に「--permanent」オプションを指定して確認を行うと、一時的に設定を追加されているルールについては表示されません。
- --permanentなし 現在の設定状態を表示
- --permanentあり permanent付きで設定されたものだけ表示
例として「--permanent」オプションを指定せずに「public」ゾーンへ「http」サービスを追加し、「--permanent」オプションの有り無しでどのように表示されるのかを確認してみます。
httpサービスをpublicゾーンに追加
まず、一時的に「public」ゾーンへ「http」サービスの通信を許可する設定を行います。
# firewall-cmd --zone=public --add-service=http success
--permanentオプション無しで状態を確認
servicesに「http」が追加されていることが確認できます。
# firewall-cmd --zone=public --list-all public (default, active) interfaces: eno33554984 sources: services: dhcpv6-client http ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
--permanentオプションをつけて状態を確認
追加された「http」サービスは一時的な設定なので、servicesにhttpが表示されていません。
# firewall-cmd --zone=public --permanent --list-all public (default) interfaces: sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
このように、「--permanent」オプションの有り無しで表示結果が異なるので確認の際は注意してください。
デフォルトゾーンの確認
「default」として設定されているゾーンを表示します。
# firewall-cmd --get-default-zone public
「default」として設定されているゾーンが「public」であることがわかります。
設定系コマンド
「firewalld」の設定に関するコマンドを説明します。
コマンド自体はまだまだたくさんあるのですが、まずは私が普段よく使っているものを記述させていただきます。
一時的設定と恒久的設定について
設定のコマンドを説明する前に一時的設定と恒久的設定について説明していきます。
一時的設定(--permanentオプション無し)
「firewall-cmd」コマンドで設定を行う際に、「--permanent」オプションを指定しなければその設定は一時的な設定となり、サーバや「firewalld」のサービスを再起動すると設定が消えてしまいます。
恒久的設定(--permanentオプションあり)
サーバの再起動や「firewalld」サービスの再起動で設定が消えてしまわないようにするためには、「--permanent」オプションを使用して設定を行う必要があります。
その際、「--permanent」オプションを指定して設定を行った場合は、そのままでは「firewalld」に設定が反映されないため「fiewall-cmd --reload」で設定を反映させる必要があります。
ゾーンへのサービス追加・削除
ゾーンに通信を許可するサービスの追加する方法と、削除する方法について説明します。
サービス追加
すでに定義されているサービスをゾーンに追加するためには「--add-service」でサービスの指定行います。
firewall-cmd [--permanent] --zone=ゾーン名 --add-service=サービス名
恒久的にゾーンにサービスを追加したい場合は「--permanent」オプションをつけて設定を行う必要があります。
一時的にサービスを追加する設定例
一時的に「public」ゾーンに「http」サービスを追加する例です。
# firewall-cmd --zone=public --add-service=http
恒久的にサービスを追加する設定例
「--permanent」オプションを指定して、「public」ゾーンに「http」サービスを追加する例です。
# firewall-cmd --permanent --zone=public --add-service=http success # firewall-cmd --reload success
設定を有効化するために「firewall-cmd --reload」で設定の反映を忘れずに行いましょう。
サービス削除
ゾーンに設定されているサービスを削除するには「--remove-service」を使用します。
firewall-cmd [--permanent] --zone=ゾーン名 --remove-service=サービス名
先ほど設定した「http」サービスを「public」ゾーンから削除してみます。
# firewall-cmd --permanent --zone=public --remove-service=http success # firewall-cmd --reload success
一時的に「http」サービスをゾーンから削除したい場合は「--permanent」オプションの指定を行わないでください。
ゾーンへのポート追加・削除
サービスとして追加されていない通信をゾーンに追加する場合は、ポート番号とプロトコルを指定して追加するという方法もあります。
ポートの追加
ゾーンへのポート追加は「--add-port」を使用して行います。
firewall-cmd [--permanent]--zone=ゾーン --add-port=ポート番号/プロトコル
設定例
「public」ゾーンにポート番号「10022」プロトコル「TCP」のルールを追加してみます。
# firewall-cmd --permanent --zone=public --add-port=10022/tcp success # firewall-cmd --reload success
設定内容を確認するとportsに「10022/tcp」が追加されていることが確認できます。
# firewall-cmd --zone=public --list-all public (default, active) interfaces: eno16777736 eno33554984 sources: services: dhcpv6-client ssh ports: 10022/tcp masquerade: no forward-ports: icmp-blocks: rich rules:
ポートの削除
ゾーンからポートを削除するには「--remove-port」を使用します。
firewall-cmd [--permanent]--zone=ゾーン --remove-port=ポート番号/プロトコル
設定例
先ほど追加した「public」ゾーンの「10022/tcp」ルールを削除します。
# firewall-cmd --permanent --zone=public --remove-port=10022/tcp success # firewall-cmd --reload success
設定内容を確認するとportsから「10022/tcp」が削除されていることが確認できます。
# firewall-cmd --zone=public --list-all public (default, active) interfaces: eno16777736 eno33554984 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
デフォルトゾーンの変更
「default」に設定されているゾーンを変更する場合は「--set-default-zone」を使用します。
firewall-cmd --set-default-zone=ゾーン名
デフォルトのゾーンを変更する場合は「--permanent」オプションを使用しなくても設定は恒久的となります。
設定例
「dmz」ゾーンをdefault設定に変更してみます。
# firewall-cmd --set-default-zone=dmz success
default設定のゾーンを確認すると「dmz」に変更されていることが確認できます。
# firewall-cmd --get-default-zone dmz
NICへ割り当てられているゾーンの変更
「default」に設定されているゾーン以外をNICに割り当てる場合の方法について説明します。
一時的にゾーンを変更
一時的にゾーンを変更する場合は「--change-interface」を使用します。
firewall-cmd --zone=ゾーン名 --change-interface=NIC名
設定例
「eno16777736」というNICに「trusted」ゾーンを割り当てる例となります。
# firewall-cmd --zone=trusted --change-interface=eno16777736 success
「trusted」ゾーンの情報を確認すると、interfacesに「eno16777736」が表示されているのが確認できます。
# firewall-cmd --zone=trusted --list-all trusted (active) interfaces: eno16777736 sources: services: ports: masquerade: no forward-ports: icmp-blocks: rich rules:
恒久的にゾーンを変更
NICに割り当てられているゾーンを恒久的に変更するためには「firewall-cmd」コマンドを使用せずに、NICの設定ファイルに下記内容を追加することでゾーンの割り当て設定します。
※NICの設定ファイルは「/etc/sysconfig/network-scripts/ifcfg-xxx」となります。
設定追加内容
ZONE=ゾーン名
設定例
「eno16777736」というNICに「trusted」ゾーンを割り当てる例となります。
# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736
NICの設定ファイルに下記内容を追加します。
ZONE=trusted
設定ファイルの編集が終わったら、ネットワークを再起動させて設定を反映させます。
# systemctl restart network
「trusted」ゾーンを確認するとinterfacesに「eno16777736」が表示されていることが確認できます。
# firewall-cmd --zone=trusted --list-all trusted (active) interfaces: eno16777736 sources: services: ports: masquerade: no forward-ports: icmp-blocks: rich rules:
ゾーンの割り当てには「--permanent」オプションが使えない
これまでゾーンにサービスやポートを追加する場合、恒久的な設定を行う場合は「--permanent」オプションを使っていましたが、NICにゾーンを割り当てる場合は「--permanent」が使用できません。
実際に「--permanent」を使用してゾーンの割り当てを行ってみると、「success」と表示されて設定が成功したようにみえます。
# firewall-cmd --permanent --zone=trusted --change-interface=eno16777736 success
ですが、「firewall-cmd --reload」を行ってもNICはdefaultのゾーンに割り当てられたままとなっています…
# firewall-cmd --reload success # firewall-cmlist-all public (default, active) interfaces: eno16777736 eno33554984 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
当然サーバの再起動を行ってもNICへの割り当てはそのままでした。
man firewall-cmd
設定方法が間違っているのかと思い、「man firewall-cmd」で確認すると下記のように記述されていました。
[--zone=zone] --change-interface=interface
Change zone the interface interface is bound to to zone zone. If
zone is omitted, default zone will be used. If old and new zone are
the same, the call will be ignored without an error. If the
interface has not been bound to a zone before, it will behave like
--add-interface.[--permanent] [--zone=zone] --query-interface=interface
Query whether interface interface is bound to zone zone. Returns 0
if true, 1 otherwise.[--permanent] [--zone=zone] --remove-interface=interface
Remove binding of interface interface from zone zone. If zone is
omitted, default zone will be used.
内容を確認すると、「--change-interface=interface」の項目には [--permanent]の記述がありません…
であれば、「--permanent」が使用できないのも当然なのですが、使えないはずのオプションを指定しているのにコマンドの実行結果で「success」と表示するはなぜでしょう?
出来ればエラーを返してほしかったですね。
起動・停止方法
「firewalld」は「systemd」で制御されているので、起動と停止には「systemctl」コマンドを使用します。
firewalldの起動
# systemctl start firewalld
firewalldの停止
# systemctl stop firewalld
自動起動設定
詳しくは下記のページで説明しているので、参考にしてみてください。
https://www.server-memo.net/centos-settings/centos7/firewalld-stop.html
コメント
CentOS7 MATE desktopを最近使い始めた初心者です。
非常に読みやすく、参考になりました。
技術的なものを書く場合はかくありたいと感じ入りました。
yama-chanさん
お褒めのコメントを頂きとても励みになります。
ありがとうございます。
私の記事が少しでもお役に立てたのであれば、とてもうれしく思います。
まだまだ力不足ですが、これからも役に立てるような記事を書いていきたいと思いますので、これからもよろしくお願いいたします。
はじめまして、自宅サーバーCentOS7 初心者の者です。ウェブアライザーの説明のページ とってもわかりやすくて大変助かりました。ありがとうございます!一発でうまくいきました^^すごく気分がいいです。本当にありがとうございます。
あの、2つ質問があるのですが、
1つめは、ここのFirewalld に関してです。特定の国からのアクセスを拒否するという設定はFirewalld でするのでしょうか?検索しても、iptableのことばかりで。。。私はCentOS7なので、Firewalldに変わったと聞きました。たとえば、中国とかから拒否したいという場合はどこでするのでしょうか?
2つめは、AWStats についてです。
実は、先日 AWStats のインストールを1日かけて頑張りましたが、結局うまくいきませんでした。それで Webalizerにした次第です。
Webalizerは以前レンタルサーバーで操作したことがあるので大体わかるのですが、AWStats との大きな違いというのはなんなのでしょうか?
ご利用されていたら教えてください^^
わかりやすいサイトで大変助かります!更新楽しみにしてます!
sushiさん
コメントありがとうございます。
Webalizerの記事お役に立ったようで良かったです!
ご質問いただいた件についてご回答させていただきますね。
(1) firewalldで特定の国からアクセスを拒否する方法
こちらは、firewalldに用意されている「drop」ゾーンに、アクセスを拒否したいネットワークアドレスを登録することでアクセスを拒否することが出来ます。
設定方法
# firewall-cmd –permanent –zone=drop –add-source=xxx.xxx.xxx.xxx/xx
# firewall-cmd –reload
確認方法
# firewall-cmd –get-active-zones
国別に割り当てられているネットワークアドレスは、下記のサイトなどで調べられます。
https://ipv4.fetus.jp/
※アクセス拒否設定の解除方法は下記のとおりとなります。
# firewall-cmd –permanent –zone=drop –remove-source=xxx.xxx.xxx.xxx/xx
# firewall-cmd –reload
(2)WebalizerとAWStatsのちがいについて
最近はAWStatsの方は使用していないので、あまり詳しくはないのですが
AWStatsの方がWebalizerよりも解析できる項目が多いというのが一番の違いとなります。
以上、よろしくお願いします。
tamohiko 様
Webalizerの記事、すごくわかりやすくて、見やすくて。
いろんな自宅サーバーを解説されているサイトがありますけど、
貴サイトは一番だと思いました^^
firewalldの設定方法についても、初心者の私にわかりやすく
説明していただいて大変ありがたいです!
早速設定をしてみます。
AWStatsは、Webalizerよりも 解析の項目が多いのですね。
ありがとうございます。
私は、tamohiko様から教えていただいた、Webalizerで好きなので
こちらを大事に今後も使っていきたいと思います^^
ありがとうございました。
ミシュラン5つ星のサイトですね^^
sushiさん
少しはお役にたったようで良かったです!
何か他にご不明な点がありましたら、またコメントお願いしますね。
firewalldでアクセス拒否設定について、あれから少し調べてみました。
国単位でのアクセス拒否設定となると、かなり多く(何百~何千)のルールを設定する必要があり、マシンのスペックにもよりますがfirewalldの動作がかなり重くなってしまうようです。
なので、このような場合は「ipset」と組み合わせて設定をするのが良いみたいです。
まだ検証を行っていないので詳しい手順はお知らせできませんが、後ほど手順をまとめて公開したいと思います。
>ミシュラン5つ星のサイトですね^^
お褒めの言葉ありがとうございます。
何よりの励みになります!
これからももっと分かりやすく、役に立つサイトを作っていこうと思いますので、今後ともよろしくお願いします!!