为什么 ANY proto 的 iptables 规则只允许 ICMP 流量?

为什么 ANY proto 的 iptables 规则只允许 ICMP 流量?

基本上,我有一个 Linux 盒子(Ubuntu Focal)配置为网关:

sysctl net.ipv4.ip_forward = 1   #Enable ipv4 forwarding
iptables -t nat -A POSTROUTING -o ens160 -s 192.168.1.0/24 -j MASQUERADE  #NAT 192.168.1.x to internet behind interface ens160

完成此操作后,我可以成功 ping 通: 成功 ping

我看到伪装规则的点击次数增加了(在本例中从 1 增加到 2): 命中数增加

该规则在上一张图片中重复,因为我在截取屏幕截图时尝试了所有内容,但我认为在这个示例中它并不真正重要。

所以我可以 ping 8.8.8.8 就好,但如果我尝试做其他事情,例如 DNS 查找,

dig @8.8.8.8 www.google.com

此操作失败,并且规则的命中计数不会增加。

我还尝试使用 telnet 通过 IP 地址(而不是名称)打开 HTTP(而不是 HTTPS)网站,这也失败了,点击次数没有增加。

我真的不知道是什么原因造成的,因为这个过程通常有效,并且规则本身表明它适用于所有协议,而不仅仅是 ICMP,但似乎我可以通过 IP ping 任何协议地址,但 DNS 查找 (UDP) 和 TCP 连接失败,因为网关未将它们发送出去。

我也做了一个 tcpdump,你可以看到数据包以 192.168.1.x 的形式传入,对于 ICMP,你还可以看到 NAT 数据包离开,但对于 UDP/TCP,你看不到任何东西离开。

这里可能有什么问题?


编辑:根据评论的一些反馈添加更多信息

filter和表raw似乎没有任何东西在那里。我不确定我是否使用正确的命令来检查这些,但我认为是这样: 过滤器和原始表

iptables-save -c除了我期望的内容之外,也没有显示任何内容。(由于反复试验,我添加了一些规则的重复项,但我认为这些规则没有任何影响):

sudo iptables-save -c
# Generated by iptables-save v1.8.4 on Tue May  2 18:59:25 2023
*raw
:PREROUTING ACCEPT [290378:642993821]
:OUTPUT ACCEPT [26621:1727859]
COMMIT
# Completed on Tue May  2 18:59:25 2023
# Generated by iptables-save v1.8.4 on Tue May  2 18:59:25 2023
*filter
:INPUT ACCEPT [290051:642964315]
:FORWARD ACCEPT [140:11615]
:OUTPUT ACCEPT [26631:1728900]
COMMIT
# Completed on Tue May  2 18:59:25 2023
# Generated by iptables-save v1.8.4 on Tue May  2 18:59:25 2023
*nat
:PREROUTING ACCEPT [72935:11925313]
:INPUT ACCEPT [72704:11903229]
:OUTPUT ACCEPT [1643:146886]
:POSTROUTING ACCEPT [1643:146886]
[11:924] -A POSTROUTING -s 192.168.1.0/24 -o ens160 -j MASQUERADE
[0:0] -A POSTROUTING -s 192.168.1.0/24 -o ens160 -j MASQUERADE
[0:0] -A POSTROUTING -s 192.168.1.0/32 -o ens160 -j MASQUERADE
COMMIT
# Completed on Tue May  2 18:59:25 2023

我自己确实无法从这个输出中获得任何额外的见解,有什么建议吗?


编辑2:根据评论添加更多信息

我不相信 NFtables 曾经安装过,但nft list chains没有提供任何信息,并且 icmp 和 udp 的路由似乎是相同的: NFtables 链和路由

这确实很奇怪,因为源自网关 VM 本身内部的 DNS 请求(系统 DNS 未设置为 8.8.8.8)似乎被 SNAT 处理并且出去没有问题,甚至得到响应,但无论出于何种原因入站 DNS 请求从专用 LAN 到达后就死掉了: tcp转储

相关内容