为什么centos 7上不在防火墙开放端口的端口可以从外部访问?

lil*_*ily 7 networking linux centos firewalld centos7

我有一个使用 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
Run Code Online (Sandbox Code Playgroud)

我运行一个带有 Spring Boot 程序的 Docker 容器,该程序监听端口 8080,该端口映射到主机的 9182,9182 不在开放端口列表中,但我仍然可以通过http://HOST_MACHINE_IP:9182访问 Web 服务器, 怎么了?


我添加eth0到公共区域

firewall-cmd --permanent --zone=home --add-interface=eth0
Run Code Online (Sandbox Code Playgroud)

现在

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


[root@ doer mydir]#  firewall-cmd --list-ports
3306/tcp
Run Code Online (Sandbox Code Playgroud)

我仍然可以通过http://HOST_MACHINE_IP:9182访问网络服务器。

    #  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:
Run Code Online (Sandbox Code Playgroud)

Bob*_*Bob 5

当您发布端口时,Docker 会直接将自己的防火墙规则安装到主机服务器的内核中,而无需使用抽象层用户友好的防火墙管理工具,例如firewalld 脚注 1和相关的firewall-cmd(或类似的ufw或 Shorewall 等)提供的工具。

\n

由于 docker 不使用它们, 当您仅使用这些工具检查防火墙时,docker 创建的任何规则通常不会显示

\n

要查看 Docker(或创建自己的规则的任何其他应用程序)实际在防火墙中创建的规则,您将需要使用更低级别iptables和/或iptables-save命令来显示内核中的实际实时配置。

\n

尝试

\n
 [sudo] iptables -L -v -n --line-numbers \n
Run Code Online (Sandbox Code Playgroud)\n

\n
[sudo] iptables -L -v -n -t nat --line-numbers\n
Run Code Online (Sandbox Code Playgroud)\n

或使用

\n
[sudo] iptables-save\n
Run Code Online (Sandbox Code Playgroud)\n

通常,Docker 创建的防火墙规则会有先例,因为它们被插入在用户友好的防火墙管理工具管理的规则之前。

\n
\n
\n

我运行一个带有 springboot 程序的 docker,监听端口 8080,该端口映射到主机的 9182,9182 不在开放端口列表中,但我仍然可以通过 访问 Web 服务器,有什么http://<HOST_MACHINE_IP>:9182问题吗?

\n
\n
\n

没有什么是错的。

\n

这正是您在创建已发布端口时指示 Docker 执行的操作:

\n
\n

已发布的端口
\n默认情况下,当您创建容器时,它不会向外界发布任何端口。要使端口可用于 Docker 外部的服务或未连接到容器\xe2\x80\x99s 网络的 Docker 容器,请使用 --publish 或 -p 标志。这将创建一条防火墙规则,将容器端口映射到 Docker 主机上的端口。

\n
\n
\n

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

\n
\n

要在 Docker 发布的端口上添加更多访问控制,需要在DOCKER-USERiptables 链中创建自己的规则,如下所示: https: //docs.docker.com/network/iptables/

\n
\n

脚注 1自 docker 20.10.0 起,docker 应根据此处的文档与 firewalld 集成:https ://docs.docker.com/network/iptables/#integration-with-firewalld

\n


小智 0

使用firewall-cmd --list-all-zone,查看“home”区域,您的接口已连接到该区域。如果您还有其他问题,请发布完整的结果。