Firewalld:如何将两个 IP 地址列入白名单,而不是在同一子网上

Firewalld:如何将两个 IP 地址列入白名单,而不是在同一子网上

我在 VPS/网络服务器上运行 firwalld。

public区域是activeand default(我不想改变它)。我如何允许仅有的这两个外部 IP 地址用于访问 VPS(即我在该区域中定义的所有服务public):

   IP1:  11.22.33.44/24
   IP2:  55.66.77.88/24

这些都是假IP地址并注意到他们是故意的不在同一子网上

我想我明白为什么以下不起作用(它锁定了一个或另一个IP)。

user$ sudo firewall-cmd --zone=public --permanent --add-source=11.22.33.44/24
user$ sudo firewall-cmd --zone=public --permanent --add-source=55.66.77.88/24

user$ sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="11.22.33.44/24" invert="True" drop' 
user$ sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="55.66.77.88/24" invert="True" drop'
user$ sudo firewall-cmd --reload

我需要修改什么才能使其正常工作(这样它就不会锁定一个 IP 或另一个 IP 或两者)?

谢谢你! :)

编辑:我还尝试了/32上述所有四个命令的位掩码。遗憾的是这没有帮助。仍在寻找解决方案。

我认为逻辑可能听起来像:if IP1 or IP2, allow it and stop processing the chain.else Continue processing the chain, where the very next rule would be to DROP.。类似的事情。

编辑2:发布下面的输出sudo firewall-cmd --list-all-zones。请注意,我删除了上面提到的所有规则,因为它们不起作用。所以下面又回到了第一点。

user$ sudo 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: 
  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: 
  ports: 
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 


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


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


public (active)
  target: default
  icmp-block-inversion: no
  interfaces: venet0:0 venet0
  sources: 
  services: ssh-vps http https
  ports: 8080/tcp 8080/udp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: echo-reply echo-request timestamp-reply timestamp-request
  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: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

答案1

这个问题问得好。firewalld与 交互,iptables而 又与 交互netfilter。因此iptables比firewalld具有更大的灵活性。但这并不意味着您必须切换回 iptables,而是您仍然可以使用firewalld 进行高级数据包过滤。在firewalld中一个很酷的选项是使用direct rulesrich rules

在这种情况下,direct rules选项将满足您的需求。

首先,将所有firewalld规则擦除为默认(不用担心,擦除后SSH访问或TCP-22将保持打开状态)

$ sudo rm -rf /etc/firewalld/zones/*
$ sudo rm -rf /usr/etc/firewalld/zones/*
$ sudo firewall-cmd --complete-reload

使用直接规则(INPUT 和 FORWARD 链)允许 ISP-1 和 ISP-2 访问您的 VPS

$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 11.22.33.44/32 -j ACCEPT
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 55.66.77.88/32 -j ACCEPT
$ sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -s 11.22.33.44/32 -j ACCEPT
$ sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -s 55.66.77.88/32 -j ACCEPT

允许返回流量(换句话说,开启状态检查。默认情况下,firewalld 是 statefu)

$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -m state --state RELATED,ESTABLISHED -j ACCEPT

然后阻止不属于 ISP-1 或 ISP-2 的任何其他 IP

$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -j DROP
$ sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -j DROP

重新加载规则

$ sudo firewall-cmd --reload

验证规则

$ sudo firewall-cmd --direct --get-all-rules

答案2

这里有2个问题:

1) 您正在尝试访问该public区域,interface zone因为它分配了 2 个接口。该区域的目标default是接受icmp数据包并拒绝其他所有数据包。

2) 您需要一个特权区域(称为源区域),允许特定 IP 访问系统服务。该特权区域将具有目标ACCEPT并且优先于该public区域。

所以我的答案是这样的。

1) 让trusted区域处理您的源 IP(来自的流量)。例如:

firewall-cmd --permanent --zone=trusted --add-source=11.22.33.44 --add-source=55.66.77.88
firewall-cmd --reload

trusted区域会将流量传递到该public区域。该区public将办理ssh-vps http https服务。这是配置firewalld 的推荐方法。

2) 将目标设置defaulttrusted区域。

firewall-cmd --permanent --zone=trusted --set-target=default
firewall-cmd --reload

相关内容