2015-04-05 82 views
0

我在寫一個簡單的TCP端口掃描器。這是我的代碼:TCP掃描:意外的套接字異常

for (int port : portList) { 
    Socket socket = new Socket(); 

    try { 
     socket.connect(new InetSocketAddress(targetIP, port), 5000); 

     // If we get to this point, port is open 
     Log.d(DEBUG_TAG, "Port " + port + " open"); 

    } catch (Exception e) { 
     Log.d(DEBUG_TAG, e.toString()); 
    } finally { 
     // Try to close 
     try { 
      socket.close(); 
     } catch (Exception e) {} 
    } 
} 

這裏是調試輸出。我已經多次運行掃描,並使用相同的端口ECONNREFUSED獲得完全相同的輸出,而其他人則使用EHOSTUNREACH

D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 21) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host) 
D/TCPSCAN﹕ java.net.ConnectException: failed to connect to /192.168.0.10 (port 22) after 5000ms: isConnected failed: ECONNREFUSED (Connection refused) 
D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 23) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host) 
D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 80) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host) 
D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 443) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host) 

我正在運行的Android設備可以成功地運行ping -c 1 -W 1 192.168.0.10。我的手機檢測到遠程主機爲在線,這就是爲什麼我不明白爲什麼我得到EHOSTUNREACH。更讓人好奇的是,22號端口(目標上未打開)獲得ECONNREFUSED

目標上實際打開的唯一端口是FTP端口21(通過nmap確認)。

我讀過類似問題的一些答案。主要的修復似乎是重新啓動手機的WiFi連接,這並不適合我。

爲清楚起見我沒有張貼我的整個代碼在這裏,但我檢查的緣故目標主機192.168.0.10與在線:

Process process = runtime.exec("/system/bin/ping -c 1 -W 1 192.168.0.10"); 
// Wait until the process finishes and check exit code (0 for success) 
int exitCode = process.waitFor(); 
if (exitCode == 0) 
    Log.d(DEBUG_TAG, "Online"); 

設備I運行的是三星Galaxy S2,我瞄準我的筆記本電腦,一臺運行Fedora的Macbook Pro。這兩款設備都在同一個WiFi網絡上。

從我的筆記本電腦我可以檢測到並運行Android手機上的nmap掃描(192.168.0.3)。這絕對可以到達。

+0

對於從未打開的端口獲取ECONNREFUSED有什麼好奇?這正是你應該期待的。 – EJP 2015-04-05 23:37:24

+0

@EJP好奇的是,其他端口正在報告無法到達目的地。如果無法到達目的地,那麼將報告第一個錯誤,即每個端口。如果首先無法達到目標,則無法建立連接。拒絕連接意味着目標發送了一個'RST'標記的數據包來響應'SYN',IE:他已經到達。 – Juicy 2015-04-06 01:07:02

回答

1

您能否提供關於您的測試的更多細節?

  • 什麼是你的源設備(Android手機)?
  • 你想要達到和掃描什麼目的地?計算機在本地或外部網絡?
  • 同一網絡上的源設備和目標設備(可能是WiFi)?

EHOSTUNREACH - 沒有到主機的路由應該說是要麼

  • ISO/OSI第3層的問題(在不同的私有IP網絡 設備,而路由對方)

  • 目標設備關閉

  • ICMP協議/ ECHO回覆被阻止在某個位置EEN(或源或目標設備 防火牆)

ECONNREFUSED - 更應該清楚 - 這個特殊的端口是不是目標設備上打開

也許你可以分割你的代碼邏輯成兩個部分:

  1. 檢查設備是啓動和運行(PING - ICMP協議)
  2. 然後進行端口掃描
    • 如果isConnected == TRUE(端口是開放的) 其他(端口關閉)

輸出可能是:

  1. ping成功& & isConnected == TRUE(設備已啓動,端口爲 OPEN)
  2. ping成功& & isConnected == FALSE(設備是UP但端口是 CLOSED)
  3. PING不成功& & isConnected == TRUE(可能ICMP協議/ ECHO請求被阻塞 - 裝置是UP和端口被打開)
  4. ping失敗& & isConnected == FALSE(設備可能是 DOWN或ICMP被阻止,端口是關閉的)

嘗試給它一個嘗試。

謝謝。

+0

嗨達米安,感謝您的幫助,我已經更新了一些希望解釋一些事情的更多信息。我的筆記本電腦肯定可以訪問手機,它們位於同一個子網上。我懷疑'主機不可達'錯誤不是「合法的」。 – Juicy 2015-04-05 22:12:34

+0

嗨Juicy,不客氣 - 你有Wireshark安裝在目的地(fedora)電腦上嗎?你可以啓動數據包捕獲,同時運行你的android端口掃描程序的應用程序(我們可以檢查網絡上發生了什麼): ip.addr == 192.168.0.10 – damian1baran 2015-04-05 22:29:36

+0

嘿達米安!這絕對是一些網絡問題,我只是試圖掃描谷歌,並得到預期的結果(打開80和443)。我現在認爲它可能是Fedora的防火牆?無論哪種方式,我將不得不稍後離開調查並繼續工作。再次感謝! – Juicy 2015-04-05 22:34:42