web-dev-qa-db-ja.com

Centos 7のファイアウォールで開いているポートではないのに、ポートに外部からアクセスできるのはなぜですか?

CentOS 7で動作するリモートvpsがあります。関連するfirewalld情報は次のとおりです。firewalldはアクティブに実行されています。

[root@doer mydir]# firewall-cmd --get-zone-of-interface=eth0
no zone
[root@ doer mydir]# firewall-cmd --list-ports
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'home' (see --get-active-zones)
You most likely need to use --zone=home option.

3306/tcp

ホストマシンの9182にマップされているポート8080でリッスンするSpring BootプログラムでDockerコンテナーを実行します。9182は開いているポートのリストにありませんが、 http://Host_MACHINE_IP:9182 、何が問題になっていますか?


追加した eth0パブリックゾーンへ

firewall-cmd --permanent --zone=home --add-interface=eth0

そして今

[root@ doer mydir]#  firewall-cmd --get-zone-of-interface=eth0
public


[root@ doer mydir]#  firewall-cmd --list-ports
3306/tcp

それでも、 http:// Host_MACHINE_IP:9182 を介してWebサーバーにアクセスできます。

    #  firewall-cmd --list-all-zones
    block
      target: %%REJECT%%
      icmp-block-inversion: no
      interfaces:
      sources:
      services:
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:


    dmz
      target: default
      icmp-block-inversion: no
      interfaces:
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:


    drop
      target: DROP
      icmp-block-inversion: no
      interfaces:
      sources:
      services:
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:


    external
      target: default
      icmp-block-inversion: no
      interfaces:
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: yes
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:


    home (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth1
      sources:
      services: dhcpv6-client mdns samba-client ssh
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:


    internal
      target: default
      icmp-block-inversion: no
      interfaces:
      sources:
      services: dhcpv6-client mdns samba-client ssh
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:
1
lily

Dockerは、ポートを公開するときに、独自のファイアウォールルールをホストサーバーのカーネルに直接インストールします。firewalldや関連するfirewall-cmd(または同様にufwまたはShorewallなど)が提供します。

Dockerはそれらを使用しないためこれらのツールを使用してファイアウォールを検査するだけの場合、dockerが作成するルールは通常表示されません。

Docker(または独自のルールを作成するその他のアプリケーション)が実際にファイアウォールで作成するルールを確認するには、より低レベルのiptablesおよび/またはiptables-saveコマンドを使用して、カーネル内の実際のライブ構成。

試す

 [Sudo] iptables -L -v -n --line-numbers 

そして

[Sudo] iptables -L -v -n -t nat --line-numbers

または使用

[Sudo] iptables-save

通常、Dockerが作成するファイアウォールルールは、ユーザーフレンドリーなファイアウォール管理ツールによって管理されるルールの前に挿入されるため、前例があります。

ホストマシンの9182にマップされているポート8080でリッスンするspringbootプログラムでdockerを実行します。9182は開いているポートのリストにありませんが、http://<Host_MACHINE_IP>:9182を介してWebサーバーにアクセスできます?

何も悪いことはありません。

これは、公開ポートを作成したときにDockerに指示したとおりです。

公開ポート
デフォルトでは、コンテナを作成するとき、コンテナはポートを外部に公開しません。 Dockerの外部のサービス、またはコンテナーのネットワークに接続されていないDockerコンテナーがポートを使用できるようにするには、-publishまたは-pフラグを使用します。 これにより、コンテナーポートをDockerホストのポートにマップするファイアウォールルールが作成されます。

https://docs.docker.com/config/containers/container-networking/

Dockerによって公開されたポートにさらにアクセス制御を追加するには、ここに記載されているようにDOCKER-USER iptablesチェーンに独自のルールを作成する必要があります: https://docs.docker.com/network/iptables/

2
HermanB

答えのどれも本当に原因を説明していません。

HermanBが言ったように、Dockerは独自のルールを作成します...しかしどこにもありません!

フィルタテーブルが入力トラフィックにとって重要なチェーンは、INPUTFORWARDの2つです。

  • Firewalldは、ルールにINPUTフィルターテーブルを使用します。

  • Dockerは、PREROUTINGチェーンのDNATテーブルにルーティングを作成します。その結果、パケットはFORWARDチェーンではなくINPUTチェーンにルーティングされます。

したがって、Dockerコンテナーによって消費されるはずのすべてのトラフィックは、ファイアウォールを「バイパス」します。

Serverfaultで「firewalld docker」を検索すると、数十の同様の質問が表示されます。

解決:

iptablesルールを手動で追加する必要があると、Firewalldの目的が無効になります。 DockerがFirewalldで正しく動作できないのは残念です。それでも、Firewalldに同じルールをFORWARDチェーンに適用し、FirewalldのカスタムチェーンをDockerのチェーンの前に配置するように指示することで、もっとクリーンなことができると思います。 。

現在、Firewalldカスタムチェーン(FORWARD_direct, FORWARD_IN_ZONES, FORWARD_OUT_ZONES)Dockerカスタムチェーンの後に来る(DOCKER-USER, DOCKER-ISOLATION-STAGE-1, DOCKER)。

1
Alexis

Firewall-cmd --list-all-zoneを使用して、「ホーム」ゾーンを確認します。インターフェースはそのゾーンに接続されています。他の問題がある場合は、完全な結果を投稿してください。

0
Giorgio Binazzi