这是我的防火墙配置:
firewall-cmd --zone=abc --list-all
abc (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: eth0
sources:
services:
ports:
protocols:
masquerade: no
forward-ports: port=162:proto=udp:toport=9162:toaddr=
sourceports:
icmp-blocks:
rich rules:
rule family="ipv4" source NOT address="127.0.0.1" port port="2181" protocol="tcp" reject
rule family="ipv6" source NOT address="::1" port port="2181" protocol="tcp" reject
我有独立的 hbase,其中 zookeeper 正在监听 :::2181
netstat -tulnp | grep 2181
tcp6 0 0 :::2181 :::* LISTEN 3400/java
当我尝试使用 ipv4 地址登录 zookeeper shell 时,连接被拒绝。而如果我使用 ipv6 地址登录,连接就会被接受。
sudo /usr/lib/zookeeper/bin/zkCli.sh -server 1.2.3.4:2181 # connection refused
sudo /usr/lib/zookeeper/bin/zkCli.sh -server fe80::87:6cf2:fe35:1234:2181 # connection accepted
我的防火墙配置哪里出了问题?如果我删除了丰富的规则,那么 ipv4 和 ipv6 连接都会被接受。为什么只有一条规则成功应用?
我是系统配置新手,我猜我基本上是在做与防火墙使用方式相反的事情。也就是说,只允许特定连接并阻止其余连接。但由于这是在云环境中使用的,因此外部防火墙会处理所有其他连接。这是一个特殊要求。
任何帮助都将受到赞赏。
TIA,尼基尔
答案1
哇,我很惊讶!我刚开始使用防火墙,这是我的第一个问题之一。这篇文章和https://superuser.com/questions/1723751/firewalld-open-all-ports-except-one是谷歌针对这个问题显示的唯一两个,但都没有答案。
假设您希望所有 LAN 用户都能使用他们喜欢的互联网端口,但您需要阻止他们使用路由器上在端口 22 上运行的 ssh 服务器。因此,除了 OP 要求的一个端口外,其他端口均禁止访问。
经过一番挖掘,我终于搞明白了。归根结底,就是在区域被遵守priority
之前,使用丰富的规则来锁定端口。ACCEPT
如果你看这里。
https://firewalld.org/2018/12/rich-rule-priorities
您会看到
If priority < 0, the rule goes into a chain with the suffix _pre.
,尽管它没有说明这意味着在整体区域设置之前会处理负优先级,但根据我的测试,它确实如此。
When priority < 0, the rich rule will be placed in the zone_pre chain.
When priority == 0 Then all logging rules will be placed in the zone_log chain. All reject and drop rules will be placed in the zone_deny chain, which will be walked after the log chain. All accept rules will be placed in the zone_allow chain, which will be walked after the deny chain. If a rule contains log and also deny or allow actions, the parts are placed in the matching chains.
When priority > 0, the rich rule will be placed in the zone_post chain.
因此,例如,在打开所有其他端口之前,仅关闭路由器上所有人的 ssh 端口,如下所示。(假设您的 LAN 网关位于 10.3.0.1)
firewall-cmd --zone home --add-rich-rule='rule priority=-1 destination address="10.3.0.1" service name="ssh" drop' --permanent
<zone target="ACCEPT">
<short>Home</short>
<description>Home Lan with Access to Internet via policy</description>
<rule priority="-1">
<destination address="10.3.0.1"/>
<service name="ssh"/>
<drop/>
</rule>
<interface name="home"/>
</zone>
firewall-cmd --zone=home --list-all
home (active)
target: ACCEPT
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces: home
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule priority="-1" family="ipv4" destination address="10.3.0.1" service name="ssh" drop
Starting Nmap 7.94 ( https://nmap.org ) at 2024-04-21 16:45 PDT
Nmap scan report for 10.3.0.1
Host is up (0.0014s latency).
PORT STATE SERVICE
22/tcp filtered ssh
我还确认我可以访问上游 ssh 服务器的 ssh 端口,所以是的,这仅阻止了目标集(即路由器)。
如果你使用 NOT 和 source,那么你可以屏蔽除某些可能位于静态或保留 IP 上的管理计算机之外的所有人
<zone target="ACCEPT">
<short>Home</short>
<interface name="home"/>
<description>Home Lan with Access to Internet via policy</description>
<rule family="ipv4" priority="-1">
<source address="10.3.0.21" invert="True"/>
<destination address="10.3.0.1"/>
<service name="ssh"/>
<drop/>
</rule>
</zone>
所以现在每个人都可以做任何事情,除了路由器上的端口 22,而“管理员”计算机仍然可以访问路由器上的端口 22。太棒了!
请注意,NOT
命令转换为invert="True"
xml