使用firewalld/iptables阻止已建立的连接

使用firewalld/iptables阻止已建立的连接

我正在我的服务器上运行firewalld,并尝试设置fail2ban(使用firewalld)以提高安全性。问题是:我无法让它终止已建立的连接。

Firewalld 具有默认配置,仅添加了一些服务(ssh 等)。

我想我知道问题出在哪里: iptables -L INPUT给我这个:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination      
ACCEPT     all  --  anywhere             anywhere        ctstate RELATED,ESTABLISHED   
ACCEPT     all  --  anywhere             anywhere            
INPUT_direct  all  --  anywhere             anywhere            
INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
INPUT_ZONES  all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere        reject-with icmp-host-prohibited

根据我对 iptables 的理解,这意味着无论如何,相关的和已建立的连接都会被接受,因为这是第一条规则(我不知道为什么第二条规则存在,同时只有指定的端口打开,但让我们忽略它目前)。

我尝试的是删除第一条规则iptables -D INPUT 1,但这给我留下了一个根本没有网络的系统,既没有网络,也没有网络。所以我再次添加了该规则,但作为倒数第二个。iptables -I INPUT 7 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination      
ACCEPT     all  --  anywhere             anywhere            
INPUT_direct  all  --  anywhere             anywhere            
INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
INPUT_ZONES  all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere    
ACCEPT     all  --  anywhere             anywhere        ctstate RELATED,ESTABLISHED           
REJECT     all  --  anywhere             anywhere        reject-with icmp-host-prohibited

这似乎达到了预期的效果。现在,当进行fail2ban条目时,已建立的连接将被终止,并且网络的其余部分似乎可以工作。

问题:我如何使用firewalld来保留这个?我知道我可以通过对firewalld进行永久性更改,并且我知道我可以通过andfirewall-cmd --permanent做一些更底层的事情,但我还没有找到一种深入操作INPUT链的方法。--direct--xxx-rich-rule

编辑:我发现,您可以使用它--passthrough来操纵 INPUT 链。但是,如果我尝试使其永久化:

firewall-cmd --direct --passthrough ipv4 -I INPUT 7 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
firewall-cmd --direct --passthrough ipv4 -D INPUT 1
systemctl restart firewalld

插入有效,但删除无效。在此之后iptables -L INPUT产生:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
INPUT_direct  all  --  anywhere             anywhere            
INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
INPUT_ZONES  all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

编辑:

我仍然没有找到一种方法来使其与fail2ban的firewalld操作一起工作,所以在这一点上我认为这是不可能的。

如果我使用fail2ban 的 iptables 操作来代替,尽管它有效,所以我会坚持这样做。

答案1

似乎firewalld希望阻止PREROUTING上的请求碾压之前检查过的表筛选您尝试添加规则的表。

简单禁令

为了阻止已建立的会话,简单的选择是添加源规则降低区。

firewall-cmd --zone=drop --add-source=192.168.1.xx

这将在 PREROUTING_ZONES_SOURCE 链中添加源 IP碾压桌子。

# iptables -L PREROUTING_ZONES_SOURCE -nv --line -t mangle
Chain PREROUTING_ZONES_SOURCE (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1       23  1656 DROP       all  --  *      *       192.168.1.xx        0.0.0.0/0

PREROUTING_ZONES_SOURCE被叫进预路由处理任何之前的所有流量的链输入链入筛选或者碾压

# iptables -L PREROUTING -nv --line -t mangle
Chain PREROUTING (policy ACCEPT 1809 packets, 90324 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     227K   22M PREROUTING_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0
2     227K   22M PREROUTING_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0
3     226K   22M PREROUTING_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0

自定义禁止规则

如果您需要添加更具体的规则,请使用--直接--添加规则添加规则损坏/输入之后执行mangle/预路由。这里有一个阻止特定 IP 的端口 443 的示例:

# firewall-cmd --direct --add-rule ipv4 mangle INPUT 0 -p tcp --dport 443 -s 192.168.1.xx -j DROP

其中格式如下:

--direct --add-rule { ipv4 | ipv6 | eb } table chain priority args

在示例中是:

  • { ipv4 | ipv4 IPv6 | eb } ->ipv4:指定IPv4协议
  • 表->碾压:为了在收到数据包后并在检查任何规则之前立即执行筛选表,就像允许来自 ESTABLISHED 连接的数据包的表一样。
  • 链->输入:此 INPUT 链在 PREROUTING 之后检查,但请注意此 INPUT 与碾压桌子。
  • 优先级->0:规则优先级,其中 0 是最高优先级。
  • 参数->-p tcp --dport 443 -s 192.168.1.xx -j 删除:与传递给 iptables 的参数相同。

那么,就是这样mangle/INPUT_direct好像:

# iptables -L INPUT_direct -nv --line -t mangle
Chain INPUT_direct (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1       30  1888 DROP       tcp  --  *      *       192.168.1.181        0.0.0.0/0            tcp dpt:443

一些笔记

请注意,第一个例子将阻止来自源 IP 的任何数据包,但第二个示例将在 PREROUTING 规则之后执行,因此,如果在到达 INPUT 之前修改数据包或数据包被路由到 FORWARD 表,则数据包将不会达到您的 DROP 规则。

这里有一个简单的流程图网络过滤器表。 netfilter数据包处理流程 图像提取自http://www.iptables.info/en/struct-of-iptables.html

相关内容