Firewalld - 特定のIPにトラフィックを制限します。

Firewalld - 特定のIPにトラフィックを制限します。

CentOS7サーバーへのアクセスを特定のIP(192.168.10.5および167.165.100.22)に着信および発信するトラフィックに制限するためにファイアウォールを設定しようとしています。

ネットワークインタフェース enp0s01 は 1 つだけです。

"ssh"サービスが有効になっているカスタム領域にファイアウォールを切り替えました。

firewall-cmd --zone=customlist --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces: enp0s01
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

たとえば、IPアドレスを追加してテストしました。

firewall-cmd --permanent --zone=external --add-source=192.168.10.5

ただし、ネットワーク内の他のIPはまだSSHを介してサーバーにアクセスできます。

アクセスを制限する方法は?ソースを追加して明示的にホワイトリストに追加しない限り、ファイアウォールはすべてのトラフィックをブロックするようです。

答え1

背景

調査によると、基本的なファイアウォールコマンドを使用して発信トラフィックを制限することはできません。複数のソースでこれをサポートします。

唯一の手段はコマンドを使用することですが、これは便宜のためのルールfirewall-cmd --direct ...です。iptablesこれを考えると、Firewalldを介してこれを行うことを選択するか、iptables

メモ:直接ルールは次のとおりです。

$ firewall-cmd --direct --remove-rule ipv4 filter OUTPUT 0 -d 74.125.136.99/32 -p tcp -m tcp --dport=80 -j DROP

潜在的なソリューション

ホストからの通信を許可しないように要件を軽減できる場合は、以下のようにfirewall-cmd基本コマンドを使用して必要なもののほとんどを取得できます。

メモ:私の例には3つのノードがあります。

  • 192.168.56.101 - VM #1 - ファイアウォールルールを持つサーバー
  • 192.168.56.102 - VM #2
  • 192.168.56.1 - 私のラップトップ
ファイアウォールコマンド:
$ firewall-cmd --permanent --zone=internal --add-source=192.168.56.101/32
$ firewall-cmd --permanent --zone=internal --add-source=192.168.56.1/32
$ firewall-cmd --permanent --zone=internal --add-port=8080/tcp
$ firewall-cmd --zone=public --set-target=DROP

この設定では、ラップトップからVM#1にアクセスできますが、他の場所(VM#2など)からはアクセスできません。

基本領域
$ firewall-cmd --get-default-zone
public
活動エリア
$ firewall-cmd --get-active-zones
internal
  sources: 192.168.56.101/32 192.168.56.1/32
public
  interfaces: eth0 eth1
公開ゾーンの設定
$ firewall-cmd --zone=public --list-all
public (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
内部領域の設定
$ firewall-cmd --zone=internal --list-all
internal (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.56.101/32 192.168.56.1/32
  services: ssh mdns samba-client dhcpv6-client
  ports: 8080/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
公共の場の基本対象
$ firewall-cmd --permanent --get-target
DROP

テスト

この設定をテストするには、nc(ncat)を使用してポート8080に「リスナーデーモン」を作成し、コマンドをcurl -v telnet://...使用してこれらのリスナーに接続するクライアントとして機能します。

メモ:これは、純粋にすべてが期待どおりに機能し、後で削除できることを説明するためのものです。

VM#1から:
$ nc -4 -l -p 8080 -k
これでVM#2では接続できません。
$ timeout 1 curl -v telnet://192.168.56.101:8080
* About to connect() to 192.168.56.101 port 8080 (#0)
*   Trying 192.168.56.101...
$
ノートブックでは、次のことができます。
$ timeout 1 curl -v telnet://192.168.56.101:8080
* Rebuilt URL to: telnet://192.168.56.101:8080/
*   Trying 192.168.56.101...
* Connected to 192.168.56.101 (192.168.56.101) port 8080 (#0)
$

このアプローチの唯一の問題は、VM#1ノードがまだ送信できることです。

$ timeout 2 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=26.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=25.6 ms
$

$ timeout 1 curl -v telnet://www.google.com:80
* About to connect() to www.google.com port 80 (#0)
*   Trying 216.58.217.164...
* Connected to www.google.com (216.58.217.164) port 80 (#0)
$

引用する

関連情報