ウェブサイト検索

Linuxにおけるfirewalldとfirewall-cmdコマンドの紹介


目的

firewalldの基本概念と、firewall-cmdユーティリティを使ってそれにどのように対話するかを学びましょう。

要件

  • ルート権限

難しさ

簡単

協定

  • # – ルート権限で実行する必要がある Linux コマンドは、直接ルートユーザーとして、または sudo コマンドを使用して実行される必要があります。
  • $ – 一般的な非特権ユーザーとして実行される必要があるLinuxコマンドを要求します

紹介

ゾーンに基づくファイアウォール

Firewalldはゾーンベースのファイアウォールです。各ゾーンは、特定のサービスやポートを受け入れたり拒否したりするように構成できるため、異なるセキュリティレベルを持ちます。ゾーンは1つまたは複数のネットワークインターフェースに関連付けることができます。通常、firewalldには一連のプリコンフィグされたゾーンが付属しています。これらのゾーンをリストするために、そして一般的にファイアウォールと対話するために、firewall-cmdユーティリティを使用します。私はFedora 27システム上で実行しているので、利用可能なゾーンが何かを確認してみましょう。

firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work

ご覧のとおり、上記のコマンドは私のシステム内のすべての利用可能なインターフェースのリストを返します。それらの名前はその目的を示唆していますが、私たちはそれらを通じて利用できるサービスやポートを知る必要があります:一般的なデフォルトルールは、すべてのサービスまたはポートは拒否されるということです。各インターフェースは、その許可される必要があるサービスに応じていくつかの例外で構成されます。ゾーンに関連するすべてのサービスのリストを取得したい場合は、firewall-cmdを--get-servicesオプションで実行することができます。ゾーンがコマンドに明示的に渡されない場合、デフォルトゾーンが照会されます。

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens5f5
  sources:
  services: ssh mdns dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

コマンドはゾーンの状態の要約を返しました(この場合はデフォルトの「public」ゾーンです)。他のことの中に、このゾーンに関連付けられているネットワークインターフェース(この場合はens5f5)と、そのゾーンで許可されているサービス(ssh、mdns、dhcpv6-client)を明確に見ることができます。特定の非デフォルトゾーンに関する情報を取得したい場合は、ゾーン名を--zoneオプションの引数として渡す必要があります。例えば、externalゾーンに関する情報を取得するには、次のように実行します:

firewall-cmd --zone=external --list-all
external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

ゾーンの操作

前述のように、firewall-cmdツールを使用する場合、ゾーンが指定されていないと、デフォルトのゾーンが参照されます。デフォルトのゾーンを変更したい場合があります。たとえば、外部ゾーンをデフォルトとして設定したい場合:

firewall-cmd --set-default=external

簡単ですよね?では、特定のゾーンにサービスやポートを追加または削除する方法を見てみましょう。まず最初に、サービスは特定のプロトコルに関連付けられたあらかじめ設定されたポートのセットです。例えば、sshサービスはTCPポート22を含み、sambaサービスは139および445 TCP、および137および138 UDPのポートのセットを包含します。サービスを使用することで、毎回特定のポートを覚える必要がなくなります。外部ゾーンにsambaサービスを追加したいとしましょう。私たちがすることはただこれだけです:

firwall-cmd --zone=external --add-service=samba
success

firewalld デーモンが 成功 で応答したということは、実行が成功したことを意味します。それを確認するために、ゾーンサービスを確認しましょう:

sudo firewall-cmd --zone=external --list-services
ssh samba

ご覧のように、目的のために --list-services オプションを使用しました。コマンドの結果は、samba サービスがゾーンに追加されたことを明確に示しています。しかし、この方法で行われた変更は一時的であり、firewalld デーモンの再起動では持続しません。それを確認しましょう。まず、サービスを再読み込みします:

 # firewall-cmd --reload

それでは、externalゾーンで許可されているサービスを再確認します:

firewall-cmd --zone=external --list-services
ssh

ご覧の通り、externalゾーンで許可されている唯一のサービスはsshです。ゾーンに永続的な変更を加えるには、--permanentオプションを使用する必要があります:

 # firewall-cmd --permanent --zone=external --add-service=samba

恒久的な変更には、効果を発揮するためにファイアウォールの再読み込みが必要です。

もし逆の操作を行い、ゾーンからサービスを削除したい場合は、次のように実行します:

 # firewall-cmd --permanent --zone=external --remove-service=samba

文法は非常に直感的で、これ以上の説明は必要ありません。しかし、サービスの代わりに特定のポートを追加したい場合は、文法が少し変わります:

 # firewall-cmd --permanent --zone=external --add-port=139/tcp

ポートがゾーンに追加されたことを確認するには:

firewall-cmd --zone=external --list-ports
139/tcp

手術は成功しました。同様に、ポートを削除するには以下のようにします:

firewall-cmd --permanent --zone=external --remove-port=139/tcp

カスタムゾーンの作成

今まで、既存のゾーンを修正する方法のみを見てきました。新しいゾーンを作成することも可能で、同じくらい簡単です。では、linuxconfigというカスタムゾーンを作成すると仮定しましょう:

firewall-cmd --permanent --new-zone=linuxconfig

新しい空のゾーンが作成されました: デフォルトでは、サービスやポートは何も許可されていません。また、設定ファイルを読み込むことでゾーンを作成することも可能です:

firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig

ここでfileはゾーン定義を含むファイルのパスです。ゾーンを作成または削除する際に--permanentオプションが必須であることに注意してください。提供されない場合はエラーが発生します。

インターフェースにゾーンを関連付ける

ゾーンを作成することは最初のステップに過ぎません。次に、それをネットワークインターフェースに関連付ける必要があります。新しく作成したゾーンを ens5f5 イーサネットインターフェースに関連付けるとしましょう。これを達成するためのコマンドは次のとおりです:

firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5

ゾーンに割り当てられたインターフェースを照会すると、以下のように表示されるはずです:

firewall-cmd --zone=linuxconfig --list-interfaces
ens5f5

ゾーンからインターフェースを削除するのは、次のように簡単です:

firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig

豊かなルール

特定の状況では、ゾーン内のポートやサービスを単に許可するだけでなく、より複雑なルールを作成する必要があるかもしれません。たとえば、特定のマシンからの特定の種類のトラフィックをブロックするルールを作成したい場合があります。それが リッチルール の役割です。ルールは基本的に二つの部分から成り立っています:最初の部分では、ルールが適用されるために満たさなければならない条件を指定し、二番目の部分では実行されるアクションを指定します: accept 、 drop 、または reject です。

例えば、ローカルネットワーク内のIPアドレス192.168.0.37を持つマシンからのトラフィックをブロックしたいとします:以下は、ルールを作成する方法です。

firewall-cmd --zone=linuxconfig --add-rich-rule="rule \
    family="ipv4" \
    source address=192.168.0.37 \
    service name=ssh \
    reject \

リッチルールを追加するには、--add-rich-ruleオプションを使用し、ルールをその引数として説明しました。ルールはruleキーワードで始まります。familyを使用して、このルールがipv4パケットのみに適用されることを指定しました:このキーワードが提供されない場合、ルールはipv4とipv6の両方に適用されます。次に、ルールがトリガーされるためにパケットが持つべきソースアドレスをsource addressという形で提供しました。serviceを使用して、ルールのサービスの種類を指定しました。この場合はsshです。最後に、パケットがルールに一致した場合に実行するアクションを提供しました。この場合、rejectです。これで、192.168.0.37のIPを持つマシンからssh接続を確立しようとすると、以下のメッセージが表示されます:

ssh 192.168.0.35
ssh: connect to host 192.168.0.35 port 22: Connection refused

上のものは本当にシンプルですが、ルールは非常に複雑になる可能性があります。ファイアウォールの設定とオプションの全範囲を確認するには、firewalldのドキュメントをチェックするべきです。

パニックモード

パニックモードは、ネットワーク環境に本当に深刻な問題がある場合にのみ使用すべきモードです。このモードが有効な場合、すべての既存の接続が破棄され、送受信されるすべてのパケットが破棄されます。このモードは、以下のコマンドを実行することで有効にできます。

firewall-cmd --panic-on

パニックモードを解除するには、コマンドは次のとおりです:

firewall-cmd --panic-off

コードの panic mode ステータスを照会することも可能です。実行するには:

firewall-cmd --query-panic

これらのオプションは runtime のみで有効であり、 --permanent では使用できません。

関連記事: