我正在尝试审核主机上的防火墙规则。这通常使用 nmap 或类似的扫描工具非常简单。问题是我只能在主机本身上运行审计。通常,如果您使用 nmap 对当前主机运行端口扫描,nmap 将使用环回接口。这是一个问题,因为我关心的主机上的防火墙允许环回接口上的所有流量:
[my-host ~][I]% sudo iptables -vL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[...snip...]
2364K 123M ACCEPT all -- lo any anywhere anywhere
[...snip...]
因此,当我扫描主机时,防火墙似乎允许所有端口:
[my-host ~][I]% sudo nmap -sA my-host
Starting Nmap 6.40 ( http://nmap.org ) at 2020-01-28 13:53 MST
Nmap scan report for my-host (172.20.48.30)
Host is up (0.000015s latency).
rDNS record for 172.20.48.30: my-host
All 1000 scanned ports on my-host (172.20.48.30) are unfiltered
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
所以我尝试指定要使用的接口,希望强制扫描通过主机的正常网络接口路由流量。但是 nmap 找不到任何开放的端口:
[my-host ~][I]% sudo nmap -sA my-host -e ens192 -Pn
Starting Nmap 6.40 ( http://nmap.org ) at 2020-01-28 13:54 MST
Nmap done: 1 IP address (0 hosts up) scanned in 0.44 seconds
但是,我知道,在其防火墙中,主机至少允许来自同一网络上任何其他主机的端口 22。当我从同一网络上的另一台主机扫描它时,我看到的是:
[my-other-host ~][I]% sudo nmap -sA my-host -Pn
Starting Nmap 6.40 ( http://nmap.org ) at 2020-01-28 13:55 MST
Nmap scan report for my-host (172.20.48.30)
Host is up (0.00021s latency).
rDNS record for 172.20.48.30: my-host
Not shown: 999 filtered ports
PORT STATE SERVICE
22/tcp unfiltered ssh
MAC Address: 00:50:56:A0:34:4D (VMware)
Nmap done: 1 IP address (1 host up) scanned in 4.51 seconds
那么为什么我从自身扫描 my-host 时看不到这些结果呢?这是由于路由器配置(不幸的是我无权访问),还是我在某处犯了错误?
问题是 Linux 路由表总是通过环回接口在本地路由流量,如果本地系统有一个网络接口侦听目标 IP 地址,则不会将其放在物理网络上。您可以看到本地路由表
ip route show table local
- 所有匹配本地路由表中规则的数据包都被环回。此外,本地路由表是自动维护的(在启动/关闭接口时添加/删除规则)并且不能手动更改。因此,即使明确指定要绑定的接口,nmap 扫描数据包也将始终在环回接口上结束(并且实际上错过了防火墙)。解决方案是创建一个命名空间虚拟网络来运行扫描。命名空间虚拟网络有自己的虚拟网络接口和路由表,与其他命名空间网络(包括根网络命名空间)分开。这意味着跨命名空间发送的数据包似乎来自外部网络,不被视为本地数据包。
我按照此处的指南创建了一个命名空间网络。最后,创建网络的脚本如下所示:
testns
是虚拟命名空间网络的名称;你可以随心所欲地调用你的。源 IP 和目标 IP 可以是任意 IP 地址,这意味着您可以在运行扫描时欺骗任意源 IP 地址,这非常有用。但是请注意,不要掩盖系统可能想要与之通信的任何真实 IP 地址。
最后,运行 nmap 扫描是确保它从命名空间网络中运行的问题。您还需要扫描根命名空间中配对的虚拟以太网适配器的 IP 地址(不是系统的实际 IP 地址):
您应该看到您的扫描运行,就好像它实际上来自 5.5.5.5。