CentOS7でFirewallDを使用してファイアウォールを設定する方法
序章
Firewalldは、多くのLinuxディストリビューションで利用可能なファイアウォール管理ソリューションであり、Linuxカーネルによって提供されるiptablesパケットフィルタリングシステムのフロントエンドとして機能します。 このガイドでは、サーバーにファイアウォールを設定する方法について説明し、ファイアウォールを使用してファイアウォールを管理するための基本を示します。 firewall-cmd
管理ツール(使用したい場合 iptables
CentOSの場合は、このガイドに従ってください)。
注:この記事の執筆時点で利用可能だったものよりも新しいバージョンのfirewalldを使用している可能性があります。または、サーバーがこのガイド全体で使用されているサンプルサーバーとは少し異なる設定になっている可能性があります。 。 このガイドで説明されている一部のコマンドの動作は、特定の構成によって異なる場合があります。
Firewalldの基本概念
実際に使用する方法について話し始める前に firewall-cmd
ファイアウォール構成を管理するためのユーティリティ。ツールが導入するいくつかの基本的な概念に精通している必要があります。
ゾーン
The firewalld
デーモンは、「ゾーン」と呼ばれるエンティティを使用してルールのグループを管理します。 ゾーンは基本的に、コンピューターが接続されているネットワークに対する信頼のレベルに応じて、どのトラフィックを許可するかを指示する一連のルールです。 ネットワークインターフェイスには、ファイアウォールが許可する動作を指示するゾーンが割り当てられます。
ネットワーク間を頻繁に移動する可能性のあるコンピューター(ラップトップなど)の場合、この種の柔軟性は、環境に応じてルールを変更するための優れた方法を提供します。 パブリックWiFiネットワークで動作しているときはほとんどのトラフィックを禁止し、ホームネットワークに接続しているときはより緩和された制限を許可するという厳格なルールがある場合があります。 サーバーの場合、ネットワーク環境が変更されることはめったにないため、これらのゾーンはすぐには重要ではありません。
ネットワーク環境がどれほど動的であるかに関係なく、事前定義された各ゾーンの背後にある一般的な考え方に精通していると便利です。 firewalld
. 最も信頼されていないから最も信頼されているの順に、 firewalld
それは:
- drop :最低レベルの信頼。 すべての着信接続は応答なしでドロップされ、発信接続のみが可能です。
- block :上記と同様ですが、単に接続をドロップするのではなく、着信要求が拒否されます。
icmp-host-prohibited
またicmp6-adm-prohibited
メッセージ。 - public :パブリックで信頼できないネットワークを表します。 他のコンピュータを信頼していませんが、ケースバイケースで選択された着信接続を許可する場合があります。
- external :ファイアウォールをゲートウェイとして使用している場合の外部ネットワーク。 内部ネットワークはプライベートのままですが到達可能であるように、NATマスカレード用に構成されています。
- internal :ゲートウェイの内部部分に使用される、外部ゾーンの反対側。 コンピュータはかなり信頼でき、いくつかの追加サービスが利用可能です。
- dmz :DMZにあるコンピューター(ネットワークの他の部分にアクセスできない分離されたコンピューター)に使用されます。 特定の着信接続のみが許可されます。
- work :作業機械に使用されます。 ネットワーク内のほとんどのコンピューターを信頼します。 さらにいくつかのサービスが許可される場合があります。
- home :ホーム環境。 これは通常、他のほとんどのコンピューターを信頼し、さらにいくつかのサービスが受け入れられることを意味します。
- trusted :ネットワーク内のすべてのマシンを信頼します。 利用可能なオプションの中で最もオープンであり、慎重に使用する必要があります。
ファイアウォールを使用するには、ルールを作成してゾーンのプロパティを変更してから、ネットワークインターフェイスを最も適切なゾーンに割り当てることができます。
ルールの永続性
Firewalldでは、ルールは永続的または即時のいずれかとして指定できます。 ルールが追加または変更されると、デフォルトで、現在実行中のファイアウォールの動作が変更されます。 次回の起動時に、変更が破棄され、古いルールが適用されます。
多くの firewall-cmd
操作は取ることができます --permanent
非エフェメラルファイアウォールをターゲットにする必要があることを示すフラグ。 これは、起動時に再ロードされるルールセットに影響します。 この分離は、アクティブなファイアウォールインスタンスでルールをテストし、問題が発生した場合にリロードできることを意味します。 また、使用することができます --permanent
フラグを立てて、時間の経過とともにルールのセット全体を構築します。これらのルールは、reloadコマンドが発行されたときに一度にすべて適用されます。
ファイアウォールをインストールして有効にし、起動時に開始する
firewalld
CentOS 7の多くのイメージを含む、一部のLinuxディストリビューションにデフォルトでインストールされます。 ただし、firewalldを自分でインストールする必要がある場合があります。
- sudo yum install firewalld
インストール後 firewalld
、サービスを有効にしてサーバーを再起動できます。 Firewalldを有効にすると、起動時にサービスが起動することに注意してください。 潜在的な問題を回避するために、ファイアウォールルールを作成し、この動作を構成する前にそれらをテストする機会を利用することをお勧めします。
- sudo systemctl enable firewalld
- sudo reboot
サーバーが再起動したら、ファイアウォールを起動し、ネットワークインターフェイスを構成したゾーンに配置し(または構成済みのデフォルトゾーンにフォールバックし)、ゾーンに関連付けられているルールを関連付けられたゾーンに適用します。インターフェイス。
次のように入力することで、サービスが実行され、到達可能であることを確認できます。
- sudo firewall-cmd --state
Outputrunning
これは、ファイアウォールがデフォルト構成で稼働していることを示しています。
現在のファイアウォールルールに精通する
変更を開始する前に、デーモンによって提供されるデフォルトの環境とルールをよく理解しておく必要があります。
デフォルトの調査
次のように入力すると、現在デフォルトとして選択されているゾーンを確認できます。
- firewall-cmd --get-default-zone
Outputpublic
与えていないので firewalld
デフォルトゾーンから逸脱するコマンドがあり、どのインターフェイスも別のゾーンにバインドするように構成されていない場合、そのゾーンは唯一の「アクティブ」ゾーン(インターフェイスのトラフィックを制御しているゾーン)にもなります。 次のように入力することで確認できます。
- firewall-cmd --get-active-zones
Outputpublic
interfaces: eth0 eth1
ここでは、サンプルサーバーにファイアウォールによって制御されている2つのネットワークインターフェイスがあることがわかります(eth0
と eth1
). どちらも現在、パブリックゾーンに定義されているルールに従って管理されています。
ただし、パブリックゾーンに関連付けられているルールをどのようにして知ることができますか? 次のように入力すると、デフォルトのゾーンの構成を印刷できます。
- sudo firewall-cmd --list-all
Outputpublic (default, active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
出力から、このゾーンがデフォルトでアクティブであり、 eth0
と eth1
インターフェイスはこのゾーンに関連付けられています(以前の問い合わせから、これらすべてをすでに知っています)。 ただし、このゾーンでは、DHCPクライアント(IPアドレス割り当て用)およびSSH(リモート管理用)に関連付けられた通常の操作が可能であることがわかります。
代替ゾーンの探索
これで、デフォルトゾーンとアクティブゾーンの構成についての良いアイデアが得られました。 他のゾーンに関する情報も見つけることができます。
使用可能なゾーンのリストを取得するには、次のように入力します。
- firewall-cmd --get-zones
Outputblock dmz drop external home internal public trusted work
ゾーンを含めることで、ゾーンに関連付けられた特定の構成を確認できます。 --zone=
私たちのパラメータ --list-all
指図:
- sudo firewall-cmd --zone=home --list-all
Outputhome
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
を使用して、すべてのゾーン定義を出力できます。 --list-all-zones
オプション。 見やすくするために、出力をページャーにパイプすることをお勧めします。
- sudo firewall-cmd --list-all-zones | less
インターフェイスのゾーンの選択
ネットワークインターフェイスを別の方法で構成していない限り、ファイアウォールの起動時に各インターフェイスはデフォルトゾーンに配置されます。
インターフェイスのゾーンの変更
を使用して、セッション中にゾーン間のインターフェイスを移行できます。 --zone=
パラメータと組み合わせて --change-interface=
パラメータ。 ファイアウォールを変更するすべてのコマンドと同様に、次を使用する必要があります sudo
.
たとえば、移行できます eth0
次のように入力して、「ホーム」ゾーンに接続します。
- sudo firewall-cmd --zone=home --change-interface=eth0
Outputsuccess
注:インターフェースを新しいゾーンに移行するときは常に、動作するサービスを変更している可能性があることに注意してください。 たとえば、ここではSSHを利用できる「ホーム」ゾーンに移動しています。 これは、接続が切断されてはならないことを意味します。 他の一部のゾーンでは、デフォルトでSSHが有効になっておらず、これらのゾーンの1つを使用しているときに接続が切断されると、再度ログインできない場合があります。
アクティブゾーンを再度要求することで、これが成功したことを確認できます。
- firewall-cmd --get-active-zones
Outputhome
interfaces: eth0
public
interfaces: eth1
デフォルトゾーンの調整
すべてのインターフェイスを単一のゾーンで最適に処理できる場合は、最適なデフォルトゾーンを選択して、それを構成に使用する方がおそらく簡単です。
デフォルトのゾーンは、 --set-default-zone=
パラメータ。 これにより、デフォルトでフォールバックしたインターフェイスがすぐに新しいゾーンに変更されます。
- sudo firewall-cmd --set-default-zone=home
Outputsuccess
アプリケーションのルールを設定する
利用可能にしたいサービスのファイアウォール例外を定義する基本的な方法は、かなり簡単です。 ここでは、基本的な考え方について説明します。
ゾーンへのサービスの追加
最も簡単な方法は、使用しているゾーンに必要なサービスまたはポートを追加することです。 繰り返しになりますが、利用可能なサービスのリストを取得できます。 --get-services
オプション:
- firewall-cmd --get-services
OutputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
注:これらの各サービスの詳細については、関連するサービスを確認してください。 .xml
内のファイル /usr/lib/firewalld/services
ディレクトリ。 たとえば、SSHサービスは次のように定義されます。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
を使用してゾーンのサービスを有効にできます --add-service=
パラメータ。 操作は、デフォルトゾーン、またはによって指定されたゾーンをターゲットにします。 --zone=
パラメータ。 デフォルトでは、これは現在のファイアウォールセッションのみを調整します。 を含めることで、永続的なファイアウォール構成を調整できます。 --permanent
国旗。
たとえば、従来のHTTPトラフィックを処理するWebサーバーを実行している場合、次のように入力することで、このセッションの「パブリック」ゾーンのインターフェイスにこのトラフィックを許可できます。
- sudo firewall-cmd --zone=public --add-service=http
あなたは省略できます --zone=
デフォルトゾーンを変更したい場合。 操作が成功したことを確認するには、 --list-all
また --list-services
オペレーション:
- sudo firewall-cmd --zone=public --list-services
Outputdhcpv6-client http ssh
すべてが正常に機能していることをテストしたら、再起動後もサービスを利用できるように、永続的なファイアウォールルールを変更することをお勧めします。 次のように入力することで、「パブリック」ゾーンの変更を永続的にすることができます。
- sudo firewall-cmd --zone=public --permanent --add-service=http
Outputsuccess
これが成功したことを確認するには、 --permanent
にフラグを立てる --list-services
手術。 あなたが使用する必要があります sudo
任意の --permanent
オペレーション:
- sudo firewall-cmd --zone=public --permanent --list-services
Outputdhcpv6-client http ssh
これで、「パブリック」ゾーンでポート80でHTTPWebトラフィックが許可されます。 WebサーバーがSSL/TLSを使用するように構成されている場合は、 https
サービス。 次のように入力することで、現在のセッションと永続的なルールセットに追加できます。
- sudo firewall-cmd --zone=public --add-service=https
- sudo firewall-cmd --zone=public --permanent --add-service=https
適切なサービスが利用できない場合はどうなりますか?
Firewalldインストールに含まれているファイアウォールサービスは、アクセスを許可する可能性のあるアプリケーションの最も一般的な要件の多くを表しています。 ただし、これらのサービスが要件に合わないシナリオが発生する可能性があります。
この状況では、2つのオプションがあります。
ゾーンのポートを開く
特定のアプリケーションのサポートを追加する1つの方法は、適切なゾーンで使用するポートを開くことです。 これは、ポートまたはポート範囲、および開く必要のあるポートに関連付けられたプロトコルを指定することによって行われます。
たとえば、アプリケーションがポート5000で実行され、TCPを使用している場合、これをこのセッションの「パブリック」ゾーンに追加するには、 --add-port=
パラメータ。 プロトコルはどちらでもかまいません tcp
また udp
:
- sudo firewall-cmd --zone=public --add-port=5000/tcp
Outputsuccess
これが成功したことを確認するには、 --list-ports
手術:
- sudo firewall-cmd --zone=public --list-ports
Output5000/tcp
範囲内の開始ポートと終了ポートをダッシュで区切ることにより、ポートの順次範囲を指定することもできます。 たとえば、アプリケーションがUDPポート4990〜4999を使用している場合、次のように入力して「パブリック」でこれらを開くことができます。
- sudo firewall-cmd --zone=public --add-port=4990-4999/udp
テスト後、これらを永続ファイアウォールに追加することをお勧めします。 次のように入力すると、次のように入力できます。
- sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
- sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
- sudo firewall-cmd --zone=public --permanent --list-ports
Outputsuccess
success
5000/tcp 4990-4999/udp
サービスの定義
ゾーンのポートを開くのは簡単ですが、各ゾーンの目的を追跡するのは難しい場合があります。 サーバー上のサービスを廃止した場合、開いているポートがまだ必要であるかどうかを思い出すのに苦労する可能性があります。 この状況を回避するために、サービスを定義することができます。
サービスは、名前と説明が関連付けられたポートのコレクションです。 サービスの使用はポートよりも管理が簡単ですが、少し前もって作業する必要があります。 開始するための良い方法は、既存のスクリプトをコピーすることです( /usr/lib/firewalld/services
)に /etc/firewalld/services
ファイアウォールが非標準の定義を探すディレクトリ。
たとえば、SSHサービス定義をコピーして、このような「サンプル」サービス定義に使用できます。 ファイル名から .xml
サフィックスは、ファイアウォールサービスリスト内のサービスの名前を示します。
- sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
これで、コピーしたファイルにある定義を調整できます。
- sudo vi /etc/firewalld/services/example.xml
まず、ファイルには、コピーしたSSH定義が含まれています。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
この定義の大部分は実際にはメタデータです。 内のサービスの短縮名を変更する必要があります <short>
タグ。 これは、サービスの人間が読める名前です。 また、サービスを監査する必要がある場合に詳細情報を入手できるように、説明を追加する必要があります。 サービスの機能に実際に影響を与えるために必要な唯一の構成は、開くポート番号とプロトコルを識別するポート定義である可能性があります。 これは複数回指定できます。
「例」のサービスでは、TCP用にポート7777を開き、UDP用に8888を開く必要があると想像してください。 を押してINSERTモードに入る i
、次のようなもので既存の定義を変更できます。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Example Service</short>
<description>This is just an example service. It probably shouldn't be used on a real system.</description>
<port protocol="tcp" port="7777"/>
<port protocol="udp" port="8888"/>
</service>
プレス ESC
、次に入力します :x
ファイルを保存して閉じます。
新しいサービスにアクセスするには、ファイアウォールをリロードします。
- sudo firewall-cmd --reload
これで、利用可能なサービスのリストに含まれていることがわかります。
- firewall-cmd --get-services
OutputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
これで、通常どおりにゾーンでこのサービスを使用できます。
独自のゾーンを作成する
事前定義されたゾーンはおそらくほとんどのユーザーにとって十分すぎるでしょうが、それらの機能をより説明する独自のゾーンを定義することは役立つ場合があります。
たとえば、「publicweb」と呼ばれるWebサーバー用のゾーンを作成したい場合があります。 ただし、プライベートネットワークで提供するDNSサービス用に別のゾーンを構成することをお勧めします。 そのために「privateDNS」と呼ばれるゾーンが必要になる場合があります。
ゾーンを追加するときは、永続的なファイアウォール構成に追加する必要があります。 その後、リロードして構成を実行中のセッションに取り込むことができます。 たとえば、次のように入力して、上記で説明した2つのゾーンを作成できます。
- sudo firewall-cmd --permanent --new-zone=publicweb
- sudo firewall-cmd --permanent --new-zone=privateDNS
次のように入力して、これらが永続的な構成に存在することを確認できます。
- sudo firewall-cmd --permanent --get-zones
Outputblock dmz drop external home internal privateDNS public publicweb trusted work
前に述べたように、これらはファイアウォールの現在のインスタンスではまだ利用できません。
- firewall-cmd --get-zones
Outputblock dmz drop external home internal public trusted work
ファイアウォールをリロードして、これらの新しいゾーンをアクティブな構成にします。
- sudo firewall-cmd --reload
- firewall-cmd --get-zones
Outputblock dmz drop external home internal privateDNS public publicweb trusted work
これで、ゾーンへの適切なサービスとポートの割り当てを開始できます。 通常は、アクティブインスタンスを調整し、テスト後にそれらの変更を永続的な構成に転送することをお勧めします。 たとえば、「publicweb」ゾーンの場合、SSH、HTTP、およびHTTPSサービスを追加できます。
- sudo firewall-cmd --zone=publicweb --add-service=ssh
- sudo firewall-cmd --zone=publicweb --add-service=http
- sudo firewall-cmd --zone=publicweb --add-service=https
- sudo firewall-cmd --zone=publicweb --list-all
Outputpublicweb
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
同様に、DNSサービスを「privateDNS」ゾーンに追加できます。
- sudo firewall-cmd --zone=privateDNS --add-service=dns
- sudo firewall-cmd --zone=privateDNS --list-all
OutputprivateDNS
interfaces:
sources:
services: dns
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
次に、インターフェイスをこれらの新しいゾーンに切り替えて、テストします。
- sudo firewall-cmd --zone=publicweb --change-interface=eth0
- sudo firewall-cmd --zone=privateDNS --change-interface=eth1
この時点で、構成をテストする機会があります。 これらの値が機能する場合は、永続的な構成に同じルールを追加することをお勧めします。 ルールを再適用することでそれを行うことができます --permanent
国旗:
- sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
- sudo firewall-cmd --zone=publicweb --permanent --add-service=http
- sudo firewall-cmd --zone=publicweb --permanent --add-service=https
- sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns
これらのルールを永続的に適用した後、ネットワークを再起動してファイアウォールサービスをリロードできます。
- sudo systemctl restart network
- sudo systemctl reload firewalld
正しいゾーンが割り当てられていることを確認します。
- firewall-cmd --get-active-zones
OutputprivateDNS
interfaces: eth1
publicweb
interfaces: eth0
そして、適切なサービスが両方のゾーンで利用可能であることを検証します。
- sudo firewall-cmd --zone=publicweb --list-services
Outputhttp https ssh
- sudo firewall-cmd --zone=privateDNS --list-services
Outputdns
独自のゾーンを正常に設定できました。 これらのゾーンの1つを他のインターフェースのデフォルトにしたい場合は、その動作を次のように構成することを忘れないでください。 --set-default-zone=
パラメータ:
sudo firewall-cmd --set-default-zone=publicweb
結論
これで、CentOSシステムでfirewalldサービスを日常的に使用するために管理する方法をかなりよく理解できたはずです。
Firewalldサービスを使用すると、ネットワーク環境を考慮した保守可能なルールとルールセットを構成できます。 これにより、ゾーンを使用してさまざまなファイアウォールポリシー間をシームレスに移行でき、管理者はポート管理をよりわかりやすいサービス定義に抽象化できます。 このシステムの実用的な知識を習得すると、このツールが提供する柔軟性とパワーを活用できるようになります。