我正在尝试审核主机上的防火墙规则。使用 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 时看不到这些结果呢?这是由于路由器配置(不幸的是我无权访问)造成的,还是我在某个地方犯了错误?
答案1
问题在于,如果本地系统有一个侦听目标 IP 地址的网络接口,Linux 路由表始终通过环回接口在本地路由流量,并且不会将其放在物理网络上。您可以看到本地路由表ip route show table local
- 所有与本地路由表中的规则匹配的数据包都会被环回。此外,本地路由表是自动维护的(在打开/关闭接口时添加/删除规则)并且无法手动更改。因此,即使明确指定要绑定的接口,nmap 扫描数据包也将始终在环回接口上结束(并且实际上会错过防火墙)。
解决方案是创建一个命名空间虚拟网络来运行扫描。命名空间虚拟网络拥有自己的虚拟网络接口和路由表,与其他命名空间网络(包括根网络命名空间)分开。这意味着跨命名空间发送的数据包似乎来自外部网络,并且不被视为本地数据包。
我跟着导游这里创建命名空间网络。最后,创建网络的脚本如下所示:
test_source_ip='5.5.5.5'
test_dest_ip='5.5.5.6'
ip netns add testns
ip netns exec testns ip link set dev lo up
ip link add veth0 type veth peer name veth1
ip link set veth1 netns testns
ip netns exec testns ifconfig veth1 ${test_source_ip}/24 up
ifconfig veth0 ${test_dest_ip}/24 up
testns
是虚拟命名空间网络的名称;你可以随意称呼你的。
源IP和目标IP可以是任意IP地址,这意味着您在运行扫描时可以欺骗任意源IP地址,这非常有帮助。但请注意,不要掩盖系统可能想要与之通信的任何真实 IP 地址。
最后,运行 nmap 扫描需要确保它在命名空间网络内运行。您还需要扫描根命名空间中配对虚拟以太网适配器的 IP 地址(不是系统的实际 IP 地址):
ip netns exec testns nmap -sA -n ${test_dest_ip}
您应该看到您的扫描运行就像它实际上来自 5.5.5.5 一样。
[vagrant@2d33f851-838c-4 ~]$ sudo ip netns exec testns nmap -sA -n 5.5.5.6
Starting Nmap 6.40 ( http://nmap.org ) at 2020-02-05 17:41 MST
Nmap scan report for 5.5.5.6
Host is up (0.000066s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp unfiltered ssh
1234/tcp unfiltered hotline
5678/tcp unfiltered rrac
MAC Address: FE:64:90:7E:51:81 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 5.13 seconds
[vagrant@2d33f851-838c-4 ~]$