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)
$