【问题标题】:Firewalld And Container Published Ports防火墙和容器发布的端口
【发布时间】:2020-12-29 22:48:35
【问题描述】:

在我的 RHEL8 主机的 KVM 来宾上,其 KVM 来宾运行 CentOS7,我希望 firewalld 默认阻止外部访问由运行 nginx 的 Docker 容器发布到的临时端口。令我惊讶的是,访问没有被阻止。

同样,主机 (myhost) 运行 RHEL8,并且它有一个运行 CentOS7 的 KVM 来宾 (myguest)。

myguest 上的 firewalld 配置是标准的,没什么花哨的:

[root@myguest ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

以下是防火墙公共区域下的 eth0 和 eth1 接口:

[root@myguest ~]# ip a s dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:96:9c:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.111/24 brd 192.168.100.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe96:9cfc/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@myguest ~]# ip a s dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:66:6c:a1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.111/24 brd 192.168.1.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe66:6ca1/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

在 myguest 上,我正在运行 Docker,而 nginx 容器正在将其端口 80 发布到临时端口:

[me@myguest ~]$ docker container ps
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                   NAMES
06471204f091   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49154->80/tcp   focused_robinson

请注意,在之前的 firewall-cmd 输出中,我不允许通过这个临时 TCP 端口 49154(或任何其他临时端口)进行访问。所以,我期待除非我这样做,否则对 nginx 的外部访问将被阻止。但令我惊讶的是,我能够从运行 Windows 的家庭网络中的另一台主机访问它:

C:\Users\me>curl http://myguest:49154
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
.
.etc etc

如果容器将其容器端口发布到主机上的临时端口(在本例中为 myguest),主机防火墙实用程序不应该以与标准端口相同的方式保护对该端口的访问吗?我错过了什么吗?

但我也注意到实际上 nginx 容器正在侦听 TCP6 套接字:

[root@myguest ~]# netstat -tlpan | grep 49154
tcp6       0      0 :::49154                :::*                    LISTEN      23231/docker-proxy

看来,firewalld 可能没有阻塞 tcp6 套接字?我很困惑。

这显然不是生产问题,也不是什么需要失眠的问题。我只是想弄明白它。谢谢。

【问题讨论】:

    标签: docker firewalld


    【解决方案1】:

    多年来,docker 和 firewalld 之间的集成发生了变化,但是根据您的操作系统版本和 CLI 输出,我认为您可以通过在 RHEL-8 上设置 AllowZoneDrifting=no it /etc/firewalld/firewalld.conf 1 来获得您期望的行为主持人。

    由于zone drifting,在带有--set-target=default 的区域(例如public 区域)中接收的数据包可能会漂移到带有--set-target=accept 的区域(例如trusted 区域)。这意味着在区域public 中接收到的转发数据包将被转发到区域trusted。如果您的 docker 容器使用的是真正的桥接接口,那么此问题可能适用于您的设置。 Docker 默认使用 SNAT,所以通常这个问题是隐藏的。

    较新的 firewalld 2 版本已完全删除此行为,因为您发现它既是意外的,也是安全问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      相关资源
      最近更新 更多