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:
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/
答えのどれも本当に原因を説明していません。
HermanBが言ったように、Dockerは独自のルールを作成します...しかしどこにもありません!
フィルタテーブルが入力トラフィックにとって重要なチェーンは、INPUT
とFORWARD
の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
)。
iptables -vL -t filter
Firewall-cmd --list-all-zoneを使用して、「ホーム」ゾーンを確認します。インターフェースはそのゾーンに接続されています。他の問題がある場合は、完全な結果を投稿してください。