我在 VPS/网络服务器上运行 firwalld。
该public
区域是active
and 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 rules
或rich 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) 将目标设置default
为trusted
区域。
firewall-cmd --permanent --zone=trusted --set-target=default
firewall-cmd --reload