我正在我的服务器上运行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 规则。
这里有一个简单的流程图网络过滤器表。 图像提取自http://www.iptables.info/en/struct-of-iptables.html