firewalld – 开放除一个端口之外的所有端口

firewalld – 开放除一个端口之外的所有端口

这是我的防火墙配置:

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 上的管理计算机之外的所有人

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/configuring_complex_firewall_rules_with_the_rich-language_syntax

<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

相关内容