我不太熟悉firewalld,但我想在Ubuntu20.04上尝试一下。我遇到的问题是每次我尝试添加新区域时都会被阻止port=80/tcp
。zone=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-get
为yum
或dnf
。结果是成功。我可以添加一个新区域而无需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 firewalld
)Ubuntu 18.04和CentOS 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