如何在不使用環回介面的情況下對主機進行埠掃描?
我正在嘗試審核主機上的防火牆規則。這通常使用 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 掃描數據包也將始終在環回介面上結束(並且實際上錯過了防火牆)。解決方案是創建一個命名空間虛擬網路來執行掃描。命名空間虛擬網路有自己的虛擬網路介面和路由表,與其他命名空間網路(包括根網路命名空間)分開。這意味著跨命名空間發送的數據包似乎來自外部網路,不被視為本地數據包。
我按照此處的指南創建了一個命名空間網路。最後,創建網路的腳本如下所示:
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 ~]$