はじめに
Firewalldは、Linuxカーネルが提供するiptablesパケットフィルタリングシステムのフロントエンドとして機能する多くのLinuxディストリビューションで利用可能なファイアウォール管理ソリューションです。 このガイドでは、サーバーのファイアウォールを設定する方法と、firewall-cmd
管理ツールを使用してファイアウォールを管理する基本を示します(CentOSでiptables
を使用する場合は、こ
: この記事の執筆時点で利用可能であったよりも新しいバージョンのfirewalldで作業している可能性があるか、サーバーがこのガイドで使用されているサーバーの例と したがって、このガイドで説明されているいくつかのコマンドの動作は、特定の構成によって異なる場合があります。
Firewalldの基本的な概念
実際にfirewall-cmd
ユーティリティを使用してファイアウォール構成を管理する方法について説明する前に、ツールが導入するいくつかの基本的な概念に精通している必要があります。
Zones
firewalld
デーモンは、”zones”と呼ばれるエンティティを使用してルールのグループを管理します。 ゾーンは基本的に、コンピュータが接続されているネットワークでの信頼のレベルに応じて、どのトラフィックを許可するかを決定するルールのセッ ネットワークインターフェイスには、ファイアウォールで許可する動作を指定するゾーンが割り当てられます。
ネットワーク間を頻繁に移動する可能性のあるコンピュータ(ラップトップなど)では、この種の柔軟性は、環境に応じてルールを変更する良い方法を提 あなたのホームネットワークに接続したときに、よりリラックスした制限を可能にしながら、あなたは、公共のWiFiネットワーク上で動作するとき、ほとんどの サーバーの場合、これらのゾーンは、ネットワーク環境がほとんど変更されないため、すぐには重要ではありません。
ネットワーク環境がどのように動的であるかにかかわらず、firewalld
の事前定義された各ゾーンの背後にある一般的な考え方に精通していると便利です。 最も信頼されていないゾーンから最も信頼されているゾーンへの順に、firewalld
内の事前定義されたゾーンは次のとおりです:
- ドロップ: 信頼の最低レベル。 すべての着信接続は応答なしで削除され、発信接続のみが可能です。
- ブロック:上記と同様ですが、単に接続を切断するのではなく、着信要求は
icmp-host-prohibited
またはicmp6-adm-prohibited
メッセージで拒否されます。 - public:信頼されていないパブリックネットワークを表します。 他のコンピュータは信頼しませんが、選択した着信接続をケースバイケースで許可することがあります。
- external:ファイアウォールをゲートウェイとして使用している場合の外部ネットワーク。 NATマスカレード用に構成されているため、内部ネットワークはプライベートなままですが到達可能です。
- 内部:外部ゾーンの反対側で、ゲートウェイの内部部分に使用されます。 コンピュータはかなり信頼でき、いくつかの追加サービスが利用可能です。
- dmz:DMZにあるコンピュータ(ネットワークの残りの部分にアクセスできない分離されたコンピュータ)に使用されます。 特定の着信接続のみが許可されます。
- 仕事:仕事機械のために使用される。 ネットワーク内のほとんどのコンピュータを信頼します。 いくつかのより多くのサービスが許可される場合があります。
- ホーム:ホーム環境。 それは一般的に、他のコンピュータのほとんどを信頼し、さらにいくつかのサービスが受け入れられることを意味します。
- trusted:ネットワーク内のすべてのマシンを信頼します。 利用可能なオプションの中で最も開いており、控えめに使用する必要があります。
ファイアウォールを使用するには、ルールを作成してゾーンのプロパティを変更し、最も適切なゾーンにネットワークインターフェイスを割り当てることができます。
ルールの永続性
firewalldでは、ルールは永続的または即時のいずれかとして指定することができます。 ルールが追加または変更された場合、既定では、現在実行中のファイアウォールの動作が変更されます。 次の起動時に、古いルールが元に戻ります。
ほとんどのfirewall-cmd
操作は、一時的でないファイアウォールを対象とする必要があることを示すために--permanent
フラグを取ることができます。 これは、起動時に再ロードされるルールセットに影響します。 この分離は、アクティブなファイアウォールインスタンスでルールをテストし、問題がある場合はリロードできることを意味します。 また、--permanent
フラグを使用して、reloadコマンドが発行されたときに一度に適用されるルールセット全体を時間の経過とともに構築することもできます。
起動時にファイアウォールをインストールして起動できるようにする
firewalld
は、CentOS7の多くのイメージを含む一部の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 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
インターフェイスを”home”ゾーンに移行するには、次のように入力します:
- sudo firewall-cmd --zone=home --change-interface=eth0
outputsuccess
インターフェイスを新しいゾーンに移行するときは常に、運用されるサービスを変更している可能性があることに注意してください。 たとえば、ここではSSHが利用可能な”ホーム”ゾーンに移動しています。 これは、接続が切断されるべきではないことを意味します。 これらのゾーンのいずれかを使用している間に接続が切断された場合、ログインできなくなる可能性があります。
アクティブゾーンを再度要求することで、これが成功したことを確認できます:
- firewall-cmd --get-active-zones
outputhome interfaces: eth0public 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
これらの各サービスの詳細については、/usr/lib/firewalld/services
ディレクトリ内の関連する.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>
ゾーンのサービスを有効にするには、--add-service=
パラメーターを使用します。 この操作は、既定のゾーンまたは--zone=
パラメーターで指定されたゾーンを対象とします。 デフォルトでは、これは現在のファイアウォールセッションのみを調整します。 永続的なファイアウォール構成は、--permanent
フラグを含めることで調整できます。
たとえば、従来のHTTPトラフィックを提供するwebサーバーを実行している場合、次のように入力することで、このセッションの”public”ゾーン内のインターフェイス:
- 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
操作に追加します。 すべての--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=
パラメータを使用して、このセッションの”public”ゾーンにこれを追加できます。 プロトコルはtcp
または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を使用している場合、次のように入力して”public”でこれらを開くことができます:
- 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
outputsuccesssuccess5000/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を開く必要があるとします。 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: eth1publicweb interfaces: eth0
両方のゾーンで適切なサービスが利用可能であることを検証します:
- sudo firewall-cmd --zone=publicweb --list-services
outputhttp https ssh
- sudo firewall-cmd --zone=privateDNS --list-services
outputdns
あなたは正常に独自のゾーンを設定しました! これらのゾーンのいずれかを他のインターフェイスの既定値にする場合は、--set-default-zone=
パラメーターを使用してその動作を構成することを忘れないでくださ:
sudo firewall-cmd --set-default-zone=publicweb
結論
これで、CentOSシステムでfirewalldサービスを日常的に使用するために管理する方法をかなりよく理解できるようになりました。
firewalldサービスを使用すると、ネットワーク環境を考慮した保守可能なルールとルールセットを設定できます。 これにより、ゾーンを使用して異なるファイアウォールポリシー間をシームレスに移行することができ、管理者はポート管理をより使いやすいサービス定義に抽象化することができます。 このシステムの実用的な知識を得ることはこの用具が提供する力および柔軟性を利用することを可能にする。