(找到解决方案,见下文......)
服务器(CentOS 7)有多个公共 IP,这些 IP 是通过常用ifcfg-eth0:0
配置文件设置的,并且运行良好。我正在尝试适应防火墙(来自 iptables)。我喜欢能够为每个 IP 别名指定开放端口 - 使用 iptables,只需将目标 IP 设置为与需要端口的任何别名相匹配即可。
我想法使用firewalld,我可以对每个接口应用不同的区域来实现相同的效果,但是似乎我无法这样做。
我们首先要说的是:
# firewall-cmd --get-active-zones
public
interfaces: eth0 eth0:0
trusted
interfaces: eth1
我创建了一个新区域public_web
,用于eth0:0
# firewall-cmd --permanent --new-zone=public_web
success
# firewall-cmd --permanent --zone=public_web --add-service=http
success
# firewall-cmd --permanent --zone=public_web --add-interface=eth0:0
success
# firewall-cmd --reload
success
但...
# firewall-cmd --get-active-zones
public
interfaces: eth0 eth0:0
trusted
interfaces: eth1
我尝试了--remove-interface
,--change-interface
以及各种其他命令,但eth0:0
没有任何效果。我似乎找不到任何关于使用别名的文档,所以我不确定这是否是实现我想要的正确方法?
谢谢大家。
解决方案:
解决方案是在服务文件中使用标签destination
,每个服务只能使用一次。
假设你想要 87.98.256.512 上的端口 443,请复制该https.xml
文件(建议不要触碰原件)/etc/firewalld/services
,在这里我将使用https-admin.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>HTTPS for 87.98.256.512</short>
<description>...</description>
<port protocol="tcp" port="443"/>
<destination ipv4="87.98.256.512" />
</service>
然后
# firewall-cmd --permanent --zone=public --add-service=https-admin
success
# firewall-cmd --reload
success
# firewall-cmd --zone=public --list-services
http https-admin
最后用 iptables 确认一下
Chain IN_public_allow (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 87.98.256.512 tcp dpt:443 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW
请记住:destination
每个服务只有一个标签,因此如果您有要求,只需创建多个服务即可。
答案1
整个接口别名功能都是过去遗留下来的。它实际上并没有创建一个单独的接口。很长时间以来,您都不需要使用别名将多个 IP 分配给单个接口。由于它不是“真实”接口,因此您的防火墙软件无法将其视为真实接口。如果您使用该ip addr
命令,您将看到所有地址都分配给主接口,并且eth0:0
仅被视为该地址的标签。
考虑到所有这些,我并不完全确定您需要做什么来调整防火墙。我怀疑您可能需要通过 IP 指定端口,而不是通过 IP 地址和别名。