实验 1 - 无活动区域

实验 1 - 无活动区域

我不太熟悉firewalld,但我想在Ubuntu20.04上尝试一下。我遇到的问题是每次我尝试添加新区域时都会被阻止port=80/tcpzone=public

所以我的问题是:如何添加一个新区域而不被port=80/tcp阻塞zone=public

下面我描述了我所做的事情。

编辑- 我在这些问题的最后解释说,这些相同的操作在 ubuntu 18.04 和 centos 8 中成功,但在 ubuntu 20.04 中失败)

首先,我在 VPS 上安装了一个干净的 Ubuntu 20.04 实例。然后我以 root 用户身份从终端运行以下命令:

# make sure ufw is not used
systemctl stop ufw && systemctl disable ufw;

# install a webserver so I can test port 80 will give me a web page
apt-get install -y apache2;

# install firewalld and configure
apt-get install -y firewalld;
systemctl start firewalld;
firewall-cmd --permanent --zone=public --add-port=80/tcp;
firewall-cmd --reload;

现在,当我使用 Web 浏览器访问我的服务器的 IP 地址时,我可以看到默认的 apache 网页。

接下来,事情变得不寻常了。我将按照执行的确切顺序列出我的实验:

实验 1 - 无活动区域

我运行命令firewall-cmd --get-active-zones

结果是:终端什么都没有显示。

实验 2 - 添加 zone=john,无规则

我运行以下三个命令:

firewall-cmd --new-zone=john --permanent;
firewall-cmd --reload;
firewall-cmd --get-active-zones;

结果是:

网页呈现正确。

但我的终端仍然没有打印任何活动区域。

实验 3 - 为 zone=john 添加规则

我运行以下三个命令:

# replace 1.1.1.1 with my home's ip address
firewall-cmd --zone=john --add-source=1.1.1.1/24 --permanent;
firewall-cmd --reload;
firewall-cmd --get-active-zones;

结果是:

端口 80 被阻止,网页现在超时且无法访问

我的终端打印:

john
  sources: 1.1.1.1/24

实验 4-删除 zone=john

我运行以下命令:

firewall-cmd --delete-zone=john --permanent;
firewall-cmd --reload;

结果是:

我的网页能够再次重新加载。

实验 5 - 将 interface=eth0 添加到 zone=public

我尝试用以下命令激活我的公共区域:

firewall-cmd --zone=public --permanent --add-interface=eth0;
firewall-cmd
firewall-cmd --reload;
firewall-cmd --get-active-zones;

结果是:

我的网页仍可加载。

我的终端显示:

public
  interfaces: eth0

实验 6 - 重新添加 zone=john

我运行以下命令:

firewall-cmd --new-zone=john --permanent;
firewall-cmd --reload;
firewall-cmd --zone=john --add-source=1.1.1.1/24 --permanent;
firewall-cmd --reload;
firewall-cmd --get-active-zones;

结果是:

端口 80 被阻止,网页现在超时且无法访问

我的终端打印:

john
  sources: 1.1.1.1/24
public
  interfaces: eth0

最后结果

因此,经过所有这些实验,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
  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:


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:


john (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 1.1.1.1/24
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports: 80/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


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


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


附加信息

我使用 Ubuntu 18.04 重建了这台 VPS 机器,并运行了上面完全相同的脚本。结果是成功。我可以添加一个新区域而无需port=80/tcp阻塞zone=public

我使用 CentOS 8 重建了这台 VPS 机器。然后我把上面的脚本替换apt-getyumdnf。结果是成功。我可以添加一个新区域而无需port=80/tcp阻塞zone=public

我再次用 Ubuntu 20.04 重建了这台 VPS 机器,并运行了完全相同的脚本。结果是失败。新区域正在port=80/tcp阻止zone=public

我不明白为什么在 Ubuntu 18.04 和 CentOS 8 上成功却在 Ubuntu 20.04 上失败了。

答案1

查看AllowZoneDrifting在所有系统上:

grep AllowZoneDrifting /etc/firewalld/firewalld.conf

将其设置为no(并运行systemctl reload firewalldUbuntu 18.04CentOS 7系统将产生相同的行为Ubuntu 20.04。事实上,如果你检查 CentOS 上的日志,你可能会看到如下消息:

firewalld: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option.

为了解决您的问题,一旦添加1.1.1.1/24到源列表,您就可以添加http服务(或端口80/tcp)。例如:

firewall-cmd --new-zone=john --permanent
firewall-cmd --zone=john --add-source=1.1.1.1/24 --permanent
firewall-cmd --zone=john --add-service=http --permanent
firewall-cmd --reload

要检查,您可以运行:

firewall-cmd --zone=john --list-all

答案2

这让我困惑了一段时间,因为我认为区域也是根据启用的服务进行过滤的,但这里的另一个答案和本文事实并非如此:

一个源(或重叠源)不能分配给多个区域。

换句话说,如果你定义了一个源 IP,全部来自该 IP 的流量将被该区域捕获,无论相关服务是否启用。

在这种情况下,来自的 HTTP(S) 流量1.1.1.1/24不是回到区域public,即使仅有的ssh在区域上处于活动状态john

你需要定义全部如果您通过 IP 进行过滤,则需要为区域启用服务。

# Make sure the public zone has HTTP(S) access
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https

# Remove public SSH access
firewall-cmd --permanent --zone=public --remove-service=ssh

# Add SSH *and* HTTP(S) access for the john zone
firewall-cmd --permanent --zone=john --add-service=http
firewall-cmd --permanent --zone=john --add-service=https
firewall-cmd --permanent --zone=john --add-service=ssh

相关内容