CentOS 7のソースIPアドレスをホワイトリストに登録する


23

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

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

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

回答:


44

これを達成するには、ゾーンにソースを追加します。ゾーン用のソースを最初にチェックアウトします。

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'

答えてくれてありがとう。評判が不足しているため、投票できません。しかし、ソースを使用して追加したもの以外のすべてのIPを削除するにはどうすればよいですか?
クリシュナ

@KrishnanduSarkarに感謝します-その通りです。デフォルトではICMP拒否になります。しかし、パケットをドロップするための豊富なルールを追加できると思います。答えに例が追加されたので、うまくいくと思います。賛成票に感謝します。答えが機能する場合は、答えを受け入れることを検討してください。
dougBTV

すばらしい答え、私はこれまでiptablesを使用していました。
テンシー

(!)この回答は、現在のデフォルトFirewallD構成では期待どおりに機能しません(デフォルトでは、インターフェースはパブリックゾーンに割り当てられます)。
dess

24

回答が受け入れられて投票されたとしても、それが正しいものだとは思いません。ドキュメントで明確な説明を見つけることができませんが、実装された動作からは次のようになります。

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

答えは次のとおりです。

  1. 「パブリック」と言うデフォルトゾーンをロックダウン-ポートが開いていないか、利用可能なサービスがない
  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

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


4
これが最良の答えです。最も重要な部分は、インターフェイスを設定するとアクセスが広がるという説明です(ソースが設定されている場合)。sourcesホワイトリストを持っていても、ポートにアクセスできるという問題がありました。その理由は、ゾーンにインターフェースが割り当てられていたためです。
ピンキーン

1
正確publicに言えば、この答えは、もしあれば、ゾーンからすべてのデフォルトサービスを削除する必要があります(これらのサービスはpublic、デフォルトでインターフェースがゾーンに割り当てられるため、すべてのアドレスで利用可能になります)。または、デフォルトゾーンを別のゾーンに変更します:blockまたはdrop(これは一般的な方法です)。または変更publicするゾーンターゲットを%%REJECT%%DROP
dess

6

免責事項:私はここで提案していることを実際に試したことはありませんが、最後に行ったfirewalldセットアップにかなり近いので、ここから外します。Firewalldは、この目的のために、事前に構成されたいくつかのゾーンを提供します。入ってくるものをすべて落とす「ドロップ」と呼ばれるものと、すべての接続(つまり、個々のポートを開く必要さえないはずです)。トリックは、あなたが望むもののためにトリガーする適切なゾーンを得ることです。

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

  • ソース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も必要ありません)。


block(代わりにも使用することができdrop、あなたは彼らに話をされていないことを他のホストに伝えたい場合....)
ゲルトバンデンベルグ

5

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

# 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

2

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

最初の一歩

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

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


1

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

警告:リモートマシンからアクセスすると、ログインセッションが切断される場合があります。「作業」ゾーンのIP設定を正しく取得できなかった場合、サーバーに接続できません。

ファイアウォールをリロードするには:

$ sudo firewall-cmd --reload

「--add-rich-rule」で2つの異なるIPを追加する方法がわかりませんでした。


現在のデフォルトのFirewallD構成では、十分ではない場合があります。詳細については、ノーマンズの答えに対する私のコメントをご覧ください。
dess

複数のIPを使用する場合はipsetfirewall-cmd --permanent --new-ipset=blacklist --type=hash:ipにipsetに追加IPSをfirewall-cmd --ipset=blacklist --add-entry=192.168.1.4、あなたが使用することができますfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye

0

信頼できるゾーンの回答が選択された回答ではないことに驚いています。信頼ゾーンにはデフォルトの「ターゲット: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 / missing値を持つ行を削除しました。重要なことは、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.