CentOS 7 ファイアウォールを設定して、ホワイトリストに登録した発信元 IP アドレス以外のすべての着信要求をブロックしたいと考えています。また、ホワイトリストに登録した IP アドレスについては、すべてのポートにアクセスできるようにする必要があります。
については、いくつかの解決策(機能するかどうかはわかりません)が見つかりましたiptables
が、CentOS 7 では が使用されます。コマンドfirewalld
で実現できる同様のものが見つかりません。firewall-cmd
インターフェースはパブリック ゾーンにあります。また、すべてのサービスをすでにパブリック ゾーンに移動しました。
答え1
これを実現するには、ゾーンにソースを追加します。まず、ゾーンにどのようなソースがあるかを確認します。
firewall-cmd --permanent --zone=public --list-sources
ない場合は、追加を開始できます。これが「ホワイトリスト」です。
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
/24
(サブネットと単一の IP の両方を参照できるように、全体と単一の IP を追加します)
開きたいポートの範囲を設定します。
firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp
これはポート 1 から 22 までのみを実行します。必要に応じて、これを拡張できます。
さて、これまでに行った操作をリロードします。
firewall-cmd --reload
作業内容を確認してください:
firewall-cmd --zone=public --list-all
補足/編集: 重要ではありませんが、firewalld のホワイトリスト IP セットの「信頼できる」ゾーンが気に入っています。さらに評価するには、以下をお読みください。ゾーンの選択に関するRedHatの提案。
参照:
- RHEL 7 ファイアウォールの使用に関する記事
- Fedora FirewallD ドキュメント(かなり良いです。Fedora はしばらくの間、firewalld を使用しています)
このソースの外側のパケットをドロップしたい場合は、先ほど例として使用したDROP
外側のパケットをドロップする例を示します。/24
これにはリッチルールを使用できますだと思います。これは概念的なもので、テストはしていません(Centos 7 がコマンドを受け入れることを確認しただけですが)が、pcap を実行して期待どおりに動作するかどうかを確認するのは簡単なはずです。
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
答え2
たとえ回答が受け入れられ、賛成投票されたとしても、それが正しいとは思えません。ドキュメントには明確な説明が見つかりませんが、実装された動作から見ると次のようになります。
- インターフェースとソースは、どのゾーンをアクティブにするかを選択するセレクタとして使用されます。
- デフォルトゾーンでは両方とも無視されます(常にアクティブ)
したがって答えは次のようになります。
- デフォルトのゾーンをロックダウンします。たとえば、「パブリック」です。ポートは開いておらず、サービスも利用できません。
- 別のゾーンで「work」と入力し、送信元と開いているポートを定義します。
たとえば、デフォルトのゾーンがパブリックで、開いているポートがないと仮定すると、ソースとポート範囲を「work」ゾーンに追加します。
$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp
アクティブゾーンを確認します (デフォルトゾーンは常にアクティブです)。
$ sudo firewall-cmd --get-active-zones
次のようなものが手に入ります:
work
sources: 192.168.0.0/24
したがって、「作業」ゾーンのルールは特定のサブネットに適用されます。「ホワイトリスト」には、開いているポートの範囲があります =サブネット要求どおりです。そしてもちろん、動作を固定するためにステートメント--permanent
でオプションを使用します。--add-xxx
次に、「パブリック」(デフォルト) ゾーンにあるポートまたはサービスは、すべてのインターフェースと送信元アドレスに適用されます。
$ sudo firewall-cmd --list-all-zones
public (default)
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
work (active)
interfaces:
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
同じシステムがインターフェースにも適用されます。たとえば、インターフェース「ens3」を「work」ゾーンに追加するとします。
$ sudo firewall-cmd --zone=work --add-interface=ens3
特定のインターフェースからのすべてのリクエストに対して、「作業」ゾーン ルールを使用します。これは、「ソース」よりも大まかなセレクターです。
答え3
免責事項: ここで提案していることは実際に試したわけではありませんが、これは私が最後に行ったfirewalldの設定にかなり近いので、それを参考にしています。firewalldは、この目的のためにいくつかの事前設定されたゾーンを提供しています。「drop」と呼ばれるゾーンは、入ってくるものをすべてドロップし、「trusted」と呼ばれるゾーンは、どれでも接続します (つまり、個々のポートを開く必要すらないはずです)。秘訣は、必要なものをトリガーする適切なゾーンを取得することです。
Firewalld は、次の優先順位に基づいてゾーンのルールを適用します。
- 送信元 IP がゾーンにバインドされた送信元 IP と一致する場合は、それが使用されます。
- 送信元IPが特定のゾーンと一致しない場合は、そのIPに設定されているゾーンがあるかどうかを確認します。インターフェースパケットが到着したポート。ポートがある場合は、それを使用します。
- 最後に、他に一致するものがない場合、デフォルトのゾーンが使用されます。
まず最初に、信頼できる IP を「信頼できる」ゾーンにバインドします。
firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4
次に、デフォルト ゾーンを「ドロップ」に設定するか、インターフェイスをそれにバインドします。
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0
その後、変更を有効にします (警告: ネットワーク経由で実行し、ソース IP を信頼済みゾーンに追加していない場合、接続が切断される可能性があります)。
firewall-cmd --reload
もちろん、「--permanent」を省略してこれらを一時的にテストすることもできます (その場合、--reload も必要ありません)。
答え4
信頼ゾーンの回答が選択された回答ではないことに驚きました。信頼ゾーンのデフォルトは「ターゲット: ACCEPT」ですが、残りは「ターゲット: デフォルト」です。実際には問題ではありませんが、名前とデフォルトのターゲット値から、意図された方法であるように見えます。
自分だけがアクセスできるようにボックスをすばやくロックする方法:
firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones
すべてのゾーンを一覧表示すると、次のような表示になります。
trusted (active)
target: ACCEPT
icmp-block-inversion: no
sources: 1.2.3.4 5.6.7.8/24
masquerade: no
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: eth1
masquerade: no
注: null/欠損値のある行は削除しました。重要なのは、trusted と drop が両方とも (アクティブ) であり、drop にパブリック インターフェイスがあることです。
デモのために、これが iptables に何をもたらすかを示します。
Chain INPUT_ZONES_SOURCE (1 references)
target prot opt source destination
IN_trusted all -- 1.2.3.4 0.0.0.0/0
IN_trusted all -- 5.6.7.8/24 0.0.0.0/0
Chain INPUT_ZONES (1 references)
target prot opt source destination
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0