防火墙和容器发布的端口

  • 本文关键字:防火墙 docker firewalld
  • 更新时间 :
  • 英文 :


在我的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:

以下是属于firewalld公共区域的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容器正在将其Port80发布到一个临时端口:

[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

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

C:Usersme>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之间的集成多年来发生了变化,但根据您的操作系统版本和CLI输出,我认为您可以通过在RHEL-8主机上设置AllowZoneDrifting=noit/etc/firewalld/firewalld.conf1来获得预期的行为。

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

较新的firewalld 2版本已经完全删除了这种行为,因为正如您所发现的,这既是意外的,也是一个安全问题。

相关内容

  • 没有找到相关文章

最新更新