0

我正在构建一个简单的客户端-服务器应用程序,我想对其实施某种黑名单验证。

目前我有一个 IP 黑名单验证工作,它从文件(blacklist.txt)中读取一个字符串,并将其与套接字 IP 地址进行比较。如果相等,则客户端被拒绝。

我现在想要实现的是某种网络黑名单验证,而不是 IP。

假设我的“blacklist.txt”上有 192.168.1.0/24。我需要阻止从 192.168.1.1 到 192.168.1.255 的任何连接。

这是我目前用于 IP 黑名单验证的代码:

        BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Joao\\git\\ProjectoRedes\\lists\\blacklist.txt"));
        String line = null;
        socket = server.accept();

        // Blacklist verification - Do in single thread
        while ((line = reader.readLine()) != null) {
            if (line.equals(socket.getInetAddress().toString())) {
                System.out.println("IP Blacklisted: " + socket.getInetAddress().toString());
                System.out.println("Closing connection to " + socket.getInetAddress().toString());
                PrintStream checkBlack = new PrintStream(socket.getOutputStream(),true);
                checkBlack.println("***BLACKLISTED***");
                reader.close();

                socket.close();
                break; 
            }
        }

然后将输出发送到客户端,客户端关闭套接字,终止连接。

我想知道是否有任何简单的方法来做我上面所说的。

帮助表示赞赏。

4

1 回答 1

0

我会做这样的事情

int ip = ip2int(socket.getInetAddress().getHostName());

// iterate over black list, split item into subnet and bits
String line = "192.168.1.0/24";
String[] a = line.split("/");
int subnet = ip2int(a[0]);
// make a mask
int bits = a.length == 1 ? 0 : Integer.parseInt(a[1]);
int mask = 0xFFFFFFFF << 32 - bits;
// mask client ip and compare
if ((ip & mask) == subnet) {
// match
}

这是 ip -> int func

int ip2int(String ip) throws UnknownHostException {
    InetAddress a = InetAddress.getByName(ip);
    return  new BigInteger(a.getAddress()).intValue();
}
于 2013-06-19T02:38:58.673 回答