我已经使用firewalld转发了一个端口,一切正常。但是,“netstat”和“ss”命令不显示firewalld打开的端口,也不显示连接。由于转发是在内核级别处理的,因此“netstat”和“ss”不会显示连接或端口状态。我想知道如何在不依赖“nmap”的情况下列出连接并检查端口是否打开。如果您能解释一下,我将不胜感激。
答案1
从一般网络堆栈的角度来看,不涉及本地连接,因此没有关联的套接字(因此ss
不会报告任何内容),并且由于路由不需要关联状态,因此它不必是已知的,也不是。
但要进行 NAT,必须记住此类状态,以便所有后续数据包都得到相同的转换(包括“未转换”的回复数据包)。这是由网络过滤器和它的连线负责跟踪此类连接状态的设施。连线是其一部分网络过滤器是双方使用的设施iptables和nftables:无论使用什么后端防火墙NAT 始终被跟踪连线。
该命令(在大多数 Linux 发行版中,通常随软件包或软件包conntrack
一起提供)可以查询(内核内存)conntrack-tools
conntrack
连线桌子。使用足够的过滤器:--dst-nat
,它将仅显示经过 DNAT 转换的连接:回复源与查询目标不同的条目。
显示当前正在使用的所有此类跟踪连接(运行为根):
conntrack -L --dst-nat
要监视有关其状态更改的事件:
conntrack -E --dst-nat
此命令无法显示创建此类转换的规则,因为它们本身不是连线状态,但定义该状态的未来行为。这些规则是作为 NAT 挂钩的链中防火墙规则的一部分。根据防火墙的后端(iptables或者nftables),在默认设置下执行此命令的结果:
firewall-cmd --add-forward-port=port=5555:proto=tcp:toport=6666:toaddr=10.3.3.2
可以看到
和iptablesnat 表中的链中的后端:
# iptables -t nat -S | grep -w 5555 -A PRE_public_allow -p tcp -m tcp --dport 5555 -j DNAT --to-destination 10.3.3.2:6666
和nftables后端同样具有类似名称的链inet防火墙表,从与 nat 类型挂钩的基础链调用:
# nft list chain inet firewalld nat_PRE_public_allow table inet firewalld { chain nat_PRE_public_allow { meta nfproto ipv4 tcp dport 5555 dnat ip to 10.3.3.2:6666 } }
事实上,它实际上是“打开”的,这一事实将更难以检查:人们应该相信防火墙已完成为此所需的工作。目前实施防火墙通过查询以通用方式执行此操作连线设施:
和iptables在后端,这是通过将 DNAT 状态添加到每个也具有 DROP 规则的内置链中允许的状态来完成的。因此,这(与其他允许的状态一起)将显示为:
-A <built-in> -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPT
通常与nftables后端,这是通过在每个基础链中使用来完成的,该基础链也包含降低规则:
ct status dnat accept
两种情况的作用相同:如果数据包(以及其他可能性)经历了 DNAT 转换(这只能作为规则集的结果发生,因此是防火墙),然后接受它。无需再次重复允许哪个特定端口。
年长的防火墙版本可能使用过防火墙标记代替连线的状态充当内存做同样的事情。