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");

我运行的设备是三星Galaxy S2,我的目标是我的笔记本电脑,一台运行Fedora的Macbook Pro。两个设备都在同一个WiFi网络上。

从我的笔记本电脑上,我可以在安卓手机上检测并运行nmap扫描(192.168.0.3)。它绝对可以到达。

能否提供有关测试的更多详细信息

  • 你的源设备是什么(安卓手机)
  • 你想到达什么目的地并扫描?计算机是本地网络还是外部网络
  • 源设备和目标设备是否在同一网络上(可能是WiFi)

EHOSTUNLEACH-到主机的任何路径都不应该说它是

  • ISO/OSI第3层问题(不同专用IP网络上的设备没有彼此的路线)

  • 目标设备故障

  • ICMP协议/EHO回复在介于(或源或目标设备上的防火墙)

ECONNREFUSED-应该更清楚-目标设备上未打开此特定端口

也许您可以将代码逻辑分为两部分:

  1. 检查设备是否已启动并运行(PING-ICMP协议)
  2. 然后执行端口扫描
    • 如果isConnected==TRUE(端口打开)else(端口已关闭)

输出可以是:

  1. PING成功&isConnected==TRUE(设备为UP,端口为打开)
  2. PING成功&isConnected==FALSE(设备处于UP状态,但端口处于关闭)
  3. PING不成功&isConnected==TRUE(可能ICMP协议/EHO请求被阻止-设备已启动,端口已打开)
  4. PING不成功&isConnected==FALSE(设备可能DOWN或ICMP被阻止并且端口被关闭)

试着试一试。

谢谢。

相关内容

最新更新