我正在构建一个简单的客户端 - 服务器应用程序,我想对它实施某种黑名单验证。
目前我有一个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;
}
}
然后将输出发送到客户端,关闭套接字,终止连接。
我想知道是否有任何简单的方法可以做我上面所说的。
非常感谢帮助。
答案 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();
}