iptables ESTABLISHED,RELATED 与 DNS 规则结合

iptables ESTABLISHED,RELATED 与 DNS 规则结合

iptables我正在阅读《小型网络的网络安全》(Seth Enoka)第 3 章,并在 Ubuntu 22.04.1 虚拟机中添加了以下规则:

# Generated by iptables-save v1.8.7 on Fri Sep 30 12:58:31 2022
*filter
:INPUT DROP [454:44400]
:FORWARD DROP [0:0]
:OUTPUT DROP [129:7740]
-A INPUT -m state --state INVALID -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
COMMIT
# Completed on Fri Sep 30 12:58:31 2022

VM 运行桥接适配器,主机连接到路由器。该书现在声称,如果要将输出连接到 80/443,则需要其他规则:

iptables -A OUTPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

但是我无法确认这一说法,或者只能部分确认。当不使用上述 80/443 规则时,与 IP 地址的 HTTP 连接确实会超时。但是,当将它们与 DNS 一起使用时,它们会被接受:

$ curl ip.me
<ipv6 address given>
$ curl 212.102.35.236  # resolved by dig
<times out>

在我看来,这些 HTTP 请求被标记为 RELATED,因此规则隐式允许RELATED,ESTABLISHED。由于目标是仅允许某些端口和服务,在这种情况下是否应该删除此包罗万象的规则?或者还有其他解决方案吗?

注意:应用规则后,我会conntrack -F刷新所有现有连接。

答案1

在我看来,这些 HTTP 请求被标记为 RELATED,因此被 RELATED、ESTABLISHED 规则隐式允许

这不是真正的原因(iptables 没有用于 DNS 检查的 conntrack 助手),但验证此问题的简单方法是将规则拆分为两个单独的-m state规则 - 一个允许 RELATED,另一个允许 ESTABLISHED。然后,您可以注释掉 RELATED 规则(同时保留 ESTABLISHED),并检查是否不再允许连接。

$ curl ip.me
<ipv6 address given>

这意味着 HTTP 连接是使用 IPv6 而不是 IPv4 建立的,因此它首先没有根据任何 iptables 规则进行检查 - IPv6 数据包是根据ip6tables规则,您尚未定义,因此一切仍然被允许。

这两个协议的表和链是完全分开的,因此在双栈机器上,您需要在 iptables 和 ip6tables 上手动复制整个规则集。

(执行此操作时,您必须更改-p icmp-p ipv6-icmpip6tables 版本,并且如果您的网络使用 DHCPv6 数据包,则可能添加允许 DHCPv6 数据包的新规则。其他一切实际上都相同。)


轻松维护双栈 iptables 规则的一种方法是使用手写的 .rules 文件作为“源”,并避免直接添加规则。然后,和 都可以加载相同的 .rules 文件iptables-restoreip6tables-restore并使用-4-6选项来确保某些规则被“错误”工具忽略。例如,允许从本地子网进行 SSH 的规则应写为,-A INPUT -4 -s 192.168.1.0/24 ...并且将附带一条允许从 IPv6 子网进行 SSH 的“-6”规则。

不过,我建议使用 ferm 或 nftables – 前者会自动将单个规则集加载到两者中,而后者对组合的 v4/v6“table inet”系列具有本机支持。(在最新的 Ubuntu 上,您的所有 iptables 规则很可能实际上都被转换为 nftables 规则。)

相关内容