CentOS 7ファイアウォールをセットアップして、ホワイトリストに登録した発信元IPアドレス以外のすべての受信リクエストがブロックされるようにしたいと思います。また、ホワイトリストIPアドレスの場合、すべてのポートにアクセスできる必要があります。
iptables
の解決策はいくつかありますが(それらが機能するかどうかはわかりません)、CentOS 7はfirewalld
を使用しています。 firewall-cmd
コマンドで実現できる類似のものが見つかりません。
インターフェースはパブリックゾーンにあります。また、すべてのサービスをすでにパブリックゾーンに移動しています。
ソースをゾーンに追加することでこれを実現します。最初に、ゾーンのソースを確認します。
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の提案 を読んで、さらに評価することができます。
以下も参照してください。
この送信元の外に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'
回答が承認され、投票されたとしても、正しいとは思いません。ドキュメントに明確な説明はありませんが、実装された動作からは次のようになります。
したがって、答えは次のようになります。
たとえば、デフォルトゾーンがパブリックであり、開いているポートがない場合、ソースとポートの範囲を「作業」ゾーンに追加します。
$ 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
特定のインターフェースからのリクエストには「ワーク」ゾーンルールを使用します。「ソース」よりも大まかなセレクタです。
免責事項:ここでは実際に提案したことは試していませんが、最後に行ったファイアウォール設定にかなり近いので、それをやめます。 Firewalldは、この目的のためだけにいくつかの事前設定されたゾーンを提供します。入ってくるものをすべて落とす "drop"と呼ばれるものとany接続を許可する "trusted"と呼ばれるものがあります(つまり、個々のポートを開く必要さえないはずです)。トリックはあなたが望むもののためにトリガーするための正しいゾーンを取得することです。
Firewalldは、次の優先順位に基づいてゾーンのルールを適用します。
したがって、最初に、信頼できる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も不要です)。
私はこの方法でファイアウォールを操作しています。ここにあなたが望むものを達成するための私の好ましい方法があります。
# firewall-cmd --list-all
デフォルトのゾーンがパブリックで、有効なサービスがdhcpv6-clientとsshであることがわかります。公共サービスを利用したくありませんよね?ホワイトリストに登録されたIPのみが承認されます。それでは、2つの公共サービスを削除しましょう。
# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
次に、任意のポートへのアクセスを許可する特定のIPをホワイトリストに登録しましょう。
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'
次に、別のIPをホワイトリストに登録します。SSH、http、およびhttpsアクセスへのアクセスのみを許可します。他のポートはありません。
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'
SSH経由で接続している場合は、新しいルールセットを適用する前に、必ずIPを承認してください。新しいルールを適用する準備ができたら。
#firewall-cmd --reload
リッチルールで簡単に管理できます。
最初のステップ
firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0
2番目のステップ-リッチルールの追加
firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'
リッチルールを追加し、他のソースからのすべてのポートをブロックすると、すべてのポートに192.168.2.2でアクセスできます。
以下のコマンドでポートまたはサービスを追加する場合、すべてのソースからアクセスできます。
firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080
以下のコマンドよりも特定のIPの特定のポートを開きたい場合
firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'
DougBTVからの一番上の答えは間違っています。必要な担当者ポイントがまだないので、彼の回答には返信できません。ここで説明します。
彼はデフォルトのゾーン「public」を使用しています。彼はネットワークをそのゾーンに結び付け、そのゾーンのポートを開いています。ただし、デフォルトの構成では、すべてのトラフィックは、接続しているソースネットワークだけでなく、デフォルトのゾーンを通過します。したがって、彼の--add-sourceコマンドは違いがなく、彼の--add-portコマンドは、全世界がこれらのポートにアクセスできるようになりました。
Normunds Kalnberzinsによる2番目の答えは正しいです。別のゾーンを作成し、ネットワーク/ IPをそのゾーンに関連付けて、そのゾーンのポートを開きます。
または、デフォルトゾーンにすべてを残し、firewalldの豊富なルールを使用して特定のIPからのアクセスを許可することもできます。
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
これにより、192.168.2.2からすべてのポートへのすべてのトラフィックが許可されます。ゾーンを指定していないため、これはデフォルトゾーン「public」に適用されます(--get-default-zoneを使用してデフォルトゾーンを確認し、- get-active-zonesを使用して、現在使用されているゾーンを確認します。
このIPから特定のポートへのアクセスのみを許可するには、次のようにします。
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'
ベストプラクティスは、現在実行中のファイアウォールに影響を与える--permanent(または略して--perm)なしでこれらのコマンドを実行することです。ルールが機能していることをテストした後、-permを追加して再度実行し、後続のfirewalldのリロードで記憶されるようにします。
Normundsの回答に追加するだけです:
$ Sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ Sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp
他のすべてのトラフィックをブロックするには:
$ Sudo firewall-cmd --set-default-zone=drop
警告:リモートマシンからアクセスすると、ログインセッションが切断される可能性があります。 「work」ゾーンのIP設定を正しく取得していない場合、サーバーに接続できません。
ファイアウォールをリロードするには:
$ Sudo firewall-cmd --reload
「--add-rich-rule」で2つの異なるIPを追加する方法を理解できませんでした。
Trusted Zoneの回答が選択した回答ではないことに驚いています。信頼ゾーンにはデフォルトの「ターゲット: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