為什麼關閉時 nmap 報告端口 80 (HTTP) 已打開?


一代 我最近設置了一個運行 Debian 9 的小型服務器。這台機器的目的是在端口 443 上運行 OpenVPN 服務器以繞過審查。運行以下服務,但僅此而已。

  1. 私有 IP 魷魚屬於 VPN 池 (10.8.0.1:3128)
  2. 私有 IP 的 SSH 屬於 VPN 池 (10.8.0.1:22)
  3. 私有 IP DNS 解析器屬於 VPN 池 (10.8.0.1:53)
  4. 公共 IP 端口 443 上的 OpneVPN (server_public_ip_address: 443)

設置完所有內容後,我決定運行 Nmap 來掃描服務器。令人驚訝的是,我發現 80 端口是開放的。
{macbookpro}$ sudo nmap ln.vpngatway

樣本輸出:

Starting Nmap 7.50 ( https://nmap.org ) at 2017-07-03 00:24 IST
Nmap scan report for ln.vpngatway (xxx.yyy.zzz.123)
Host is up (0.20s latency).
Not shown: 998 filtered ports
PORT    STATE  SERVICE
80/tcp  open   http
443/tcp closed https

Nmap done: 1 IP address (1 host up) scanned in 19.87 second

我還運行了以下 nc 命令並確認端口 80 沒有響應(但確實)。
{macbookpro}$ nc -zv ln.vpngatway 80

樣本輸出:

found 0 associations
found 1 connections:
     1:	flags=82
	outif en6
	src 192.168.2.5 port 51462
	dst xxx.yyy.zzz.123 port 80
	rank info not available
	TCP aux info available

Connection to ln.vpngatway port 80 [tcp/http] succeeded!

nmap 說端口是打開的,而 netstat 說服務器本身的端口 80 上沒有運行任何東西。
{ln.vpngatway}$ netstat -tulpn | grep :80

我一無所有。所以我做了以下事情:
{ln.vpngatway}$ ps aux | egrep -i 'httpd|nginx|apache|lighttpd'

樣本輸出:

root      4257  0.0  0.0  12784   992 pts/0    S+   19:06   0:00 grep -E -i httpd|nginx|apache|lighttpd

對 Nmap 輸出感到困惑。我重申了一切。結果相同。為什麼 Nmap 報告端口 80 (HTTP) 已打開? 在我開始使用 tcpdump 之前,我決定運行一個舊的 telnet / nc 會話。
{macbookpro}$ nc ln.vpngatway 80

我只是要求/記錄:

GET / HTTP/1.1
host: ln.vpngatway

片刻之後,屏幕上將顯示以下內容。

HTTP/1.1 503 Service Unavailable
Server: squid
Mime-Version: 1.0
Date: Sun, 02 Jul 2017 19:16:52 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3406
X-Squid-Error: ERR_CONNECT_FAIL 60
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from localhost
X-Cache-Lookup: MISS from localhost:3128
Connection: keep-alive
 
 
<html><head>
<meta type="copyright" content="Copyright (C) 1996-2017 The Squid Software Foundation and contributors">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ERROR: The requested URL could not be retrieved</title>
<style type="text/css"><!-- 
....
......
..
<script language="javascript">
if ('[unknown method]' != '[unknown method]') document.getElementById('missing-method').style.display = 'none';
if ('error:invalid-request' != '[no URL]') document.getElementById('missing-url').style.display = 'none';
if ('[unknown protocol]' != '[unknown protocol]') document.getElementById('missing-protocol').style.display = 'none';
</script>
 
<hr>
<div id="footer">
<p>Generated Sun, 02 Jul 2017 19:16:52 GMT by localhost (squid)</p>
<!-- ERR_INVALID_REQ -->
</div>
</body></html>

謎團已經解開了。發現攔截緩存/透明代理。攔截緩存只不過是在沒有任何知識或顯式配置的情況下將 HTTP 連接從遠程客戶端重定向到緩存服務器的過程。在這種情況下,默認情況下,所有 HTTP 連接都使用防火牆和 squid 服務器的組合重定向到代理服務器。