log4shell 促使我们改进了某些服务器的安全性。我们现在还希望(尽可能)阻止传出流量。当前的防火墙规则是:
/> firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client https smtp ssh
ports: 143/tcp 3000/tcp 4949/tcp 8080/tcp 12999/tcp 25/tcp 1194/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
因此,在示例中,目前可以通过 ssh 连接到服务器(将来应该仍然可行)。现在,我们希望阻止除通过 https (443) 的连接之外的所有传出连接。为此,我们添加了一些防火墙规则(另请参阅https://serverfault.com/a/624474/145652):
/> firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp -m tcp --dport=443 -j ACCEPT
success
/> firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j DROP
success
/> firewall-cmd --reload
但执行完这些命令后,我们将失去与服务器的所有连接:没有 ping,没有 ssh,服务器不接受任何连接。可能是firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j DROP
阻塞全部传出流量,包括服务器对传入 (ssh-) 请求的应答?是否缺少允许发送传入请求应答数据的规则?
答案1
我只是启动一个实例进行测试,但我怀疑这是因为您不允许相关/已建立的出站规则,所以内核正在终止您现有的连接。
更新:我确定这就是问题所在。我刚刚通过在 EC2 实例上启动 Centos 7、安装 FirewallD,然后粘贴不带标志的第一条规则进行了测试permanent
。一切正常。
我一粘贴规则DROP
,连接就断开了。
在您提供的链接中,他们添加的第一条规则是ESTABLISHED,RELATED
规则。这意味着允许进入的连接也允许出去(因此防火墙是有状态的)。如果没有该规则,您就没有有状态的规则,您的 SSH 连接也无法建立。
因此,您的实际规则列表需要如下:
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp -m tcp --dport 443 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp -m tcp --dport 53 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp --dport 53 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 2 -j DROP
注意,我还包含了 HTTP、HTTPS 和 DNS - 否则将无法建立与 DNS 名称的连接,因为服务器无法解析它们......