简单的客户端 - 服务器应用程序,具有网络黑名单验证

时间:2013-06-19 02:18:48

标签: java sockets networking client-server

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

目前我有一个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; 
            }
        }

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

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

非常感谢帮助。

1 个答案:

答案 0 :(得分: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 - &gt; int func

int ip2int(String ip) throws UnknownHostException {
    InetAddress a = InetAddress.getByName(ip);
    return  new BigInteger(a.getAddress()).intValue();
}