web-dev-qa-db-ja.com

CentOS 7の送信元IPアドレスをホワイトリストに登録する

CentOS 7ファイアウォールをセットアップして、ホワイトリストに登録した発信元IPアドレス以外のすべての受信リクエストがブロックされるようにしたいと思います。また、ホワイトリストIPアドレスの場合、すべてのポートにアクセスできる必要があります。

iptablesの解決策はいくつかありますが(それらが機能するかどうかはわかりません)、CentOS 7はfirewalldを使用しています。 firewall-cmdコマンドで実現できる類似のものが見つかりません。

インターフェースはパブリックゾーンにあります。また、すべてのサービスをすでにパブリックゾーンに移動しています。

26

ソースをゾーンに追加することでこれを実現します。最初に、ゾーンのソースを確認します。

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'
51
dougBTV

回答が承認され、投票されたとしても、正しいとは思いません。ドキュメントに明確な説明はありませんが、実装された動作からは次のようになります。

  1. インターフェースとソースはセレクターとして使用されます-アクティブにするゾーン
  2. デフォルトゾーンでは両方とも無視されます(常にアクティブ)

したがって、答えは次のようになります。

  1. デフォルトゾーンをロックし、「public」と言います-開いているポートや利用可能なサービスはありません
  2. 別のゾーンで「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

特定のインターフェースからのリクエストには「ワーク」ゾーンルールを使用します。「ソース」よりも大まかなセレクタです。

25

免責事項:ここでは実際に提案したことは試していませんが、最後に行ったファイアウォール設定にかなり近いので、それをやめます。 Firewalldは、この目的のためだけにいくつかの事前設定されたゾーンを提供します。入ってくるものをすべて落とす "drop"と呼ばれるものとany接続を許可する "trusted"と呼ばれるものがあります(つまり、個々のポートを開く必要さえないはずです)。トリックはあなたが望むもののためにトリガーするための正しいゾーンを取得することです。

Firewalldは、次の優先順位に基づいてゾーンのルールを適用します。

  • ソースIPがゾーンにバインドされたソースIPと一致する場合は、それを使用します。
  • ソースIPが特定のゾーンと一致しない場合は、パケットが到着したinterfaceに対して構成されたゾーンがあるかどうかを確認します。ある場合はそれを使用します。
  • 最後に、他に一致するものがなければ、デフォルトのゾーンを使用します。

したがって、最初に、信頼できる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も不要です)。

6
Jemenake

私はこの方法でファイアウォールを操作しています。ここにあなたが望むものを達成するための私の好ましい方法があります。

# 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
5
Sagaponack FX

リッチルールで簡単に管理できます。

最初のステップ

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'
2
Ranjeet Ranjan

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のリロードで記憶されるようにします。

2
devhen

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を追加する方法を理解できませんでした。

1
SongLiAtDuke

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
0
Kirin