CentOS 7でFirewallDを使用してファイアウォールを設定する方法

前書き

Firewalldは、多くのLinuxディストリビューションで利用可能なファイアウォール管理ソリューションであり、Linuxカーネルが提供するiptablesパケットフィルタリングシステムのフロントエンドとして機能します。 このガイドでは、サーバーにファイアウォールを設定する方法を説明し、firewall-cmd管理ツールを使用してファイアウォールを管理する基本を示します(CentOSでiptablesを使用する場合は、以下に従ってください)。 this guide)。

[.note]#Note:この記事の執筆時点で利用可能だったものよりも新しいバージョンのfirewalldを使用している可能性があります。または、サーバーが全体で使用されているサンプルサーバーとは少し異なる設定になっている可能性があります。このガイド。 したがって、このガイドで説明されている一部のコマンドの動作は、特定の構成によって異なる場合があります。

Firewalldの基本概念

firewall-cmdユーティリティを実際に使用してファイアウォール構成を管理する方法について説明する前に、ツールが導入するいくつかの基本的な概念について理解しておく必要があります。

ゾーン

firewalldデーモンは、「ゾーン」と呼ばれるエンティティを使用してルールのグループを管理します。 ゾーンは基本的に、コンピューターが接続されているネットワークでの信頼のレベルに応じて許可されるトラフィックを決定するルールのセットです。 ネットワークインターフェースには、ファイアウォールが許可する動作を指示するゾーンが割り当てられます。

ネットワーク間を頻繁に移動する可能性のあるコンピューター(ラップトップなど)の場合、この種の柔軟性は、環境に応じてルールを変更するための優れた方法を提供します。 パブリックWiFiネットワークでの操作時にはほとんどのトラフィックを禁止し、ホームネットワークへの接続時にはより緩和された制限を許可する厳格なルールが設定されている場合があります。 サーバーにとって、これらのゾーンはそれほど重要ではありません。なぜなら、ネットワーク環境はめったに変更されないからです。

ネットワーク環境がどれほど動的であるかに関係なく、firewalldの事前定義された各ゾーンの背後にある一般的な考え方に精通していると便利です。 least trustedからmost trustedの順に、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つのネットワークインターフェイス(eth0eth1)があることがわかります。 どちらも現在、パブリックゾーンに定義されたルールに従って管理されています。

しかし、どのようなルールがパブリックゾーンに関連付けられているかをどのようにして知るのでしょうか? 次のように入力して、デフォルトゾーンの構成を印刷できます。

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

--list-allコマンドに--zone=パラメータを含めることで、ゾーンに関連付けられた特定の構成を確認できます。

sudo firewall-cmd --zone=home --list-all
outputhome
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-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

Note

[.note]#インターフェースを新しいゾーンに移行するときは常に、操作可能なサービスを変更している可能性があることに注意してください。 たとえば、ここでは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

Note

[。注意]##

これらの各サービスの詳細については、/usr/lib/firewalld/servicesディレクトリ内の関連する.xmlファイルを参照してください。 たとえば、SSHサービスは次のように定義されます。

/usr/lib/firewalld/services/ssh.xml



  SSH
  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.
  
 +
You can enable a service for a zone using the `+--add-service=+` parameter. The operation will target the default zone or whatever zone is specified by the `+--zone=+` parameter. By default, this will only adjust the current firewall session. You can adjust the permanent firewall configuration by including the `+--permanent+` flag.

たとえば、従来の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

--list-services操作に--permanentフラグを追加することにより、これが成功したことを確認できます。 --permanent操作にはsudoを使用する必要があります。

sudo firewall-cmd --zone=public --permanent --list-services
outputdhcpv6-client http ssh

「パブリック」ゾーンは、ポート80でHTTP Webトラフィックを許可します。 WebサーバーがSSL / TLSを使用するように構成されている場合は、httpsサービスも追加する必要があります。 次のように入力して、現在のセッションと永続的なルールセットに追加できます。

sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https

適切なサービスが利用できない場合はどうなりますか?

firewalldインストールに含まれているファイアウォールサービスは、アクセスを許可するアプリケーションの最も一般的な要件の多くを表しています。 ただし、これらのサービスが要件に合わないシナリオが存在する可能性があります。

この状況では、2つのオプションがあります。

ゾーンのポートを開く

特定のアプリケーションのサポートを追加する最も簡単な方法は、適切なゾーンで使用するポートを開くことです。 これは、ポートまたはポート範囲、および開く必要があるポートに関連付けられたプロトコルを指定するのと同じくらい簡単です。

たとえば、アプリケーションがポート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

範囲内の開始ポートと終了ポートをダッシュ​​で区切ることにより、ポートの連続した範囲を指定することもできます。 たとえば、アプリケーションが4990〜4999のUDPポートを使用している場合、次のように入力して「パブリック」にこれらを開くことができます。

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定義が含まれます。

/etc/firewalld/services/example.xml



  SSH
  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.
  

この定義の大部分は、実際にはメタデータです。 <short>タグ内のサービスの短い名前を変更する必要があります。 これは、サービスの人間が読める名前です。 また、サービスを監査する必要がある場合により多くの情報が得られるように、説明を追加する必要があります。 実際にサービスの機能に影響を与える必要がある唯一の構成は、開きたいポート番号とプロトコルを識別するポート定義です。 これは複数回指定できます。

「サンプル」サービスの場合、TCP用にポート7777、UDP用に8888を開く必要があると想像してください。 iを押してINSERTモードに入ると、次のように既存の定義を変更できます。

/etc/firewalld/services/example.xml



  Example Service
  This is just an example service.  It probably shouldn't be used on a real system.
  
  

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サービスを「プライベートDNS」ゾーンに追加できます。

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サービスを使用すると、ネットワーク環境を考慮した保守可能なルールおよびルールセットを構成できます。 ゾーンを使用することで、異なるファイアウォールポリシー間をシームレスに移行でき、管理者はポート管理をよりわかりやすいサービス定義に抽象化できます。 このシステムの実用的な知識を習得すると、このツールが提供する柔軟性とパワーを活用できます。

Related