源代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* @author chunyang.leng
* @date 2022-04-02 10:17 AM
*/
public class NetCheck {
/**
* 监控的ip段
*/
private static final Set<String> monitorRange = new HashSet<>();
static {
monitorRange.add("113.107.238.0/24");
monitorRange.add("183.222.96.0/24");
monitorRange.add("116.55.250.0/24");
monitorRange.add("111.202.98.0/24");
monitorRange.add("111.13.147.0/24");
monitorRange.add("122.228.238.0/24");
monitorRange.add("1.31.128.0/24");
monitorRange.add("113.207.76.0/24");
monitorRange.add("117.23.61.0/24");
monitorRange.add("118.212.233.0/24");
monitorRange.add("111.47.226.0/24");
monitorRange.add("116.211.155.0/24");
monitorRange.add("118.143.194.0/24");
monitorRange.add("168.80.175.0/24");
monitorRange.add("119.39.205.0/25");
monitorRange.add("120.72.45.128/25");
monitorRange.add("59.63.226.0/25");
monitorRange.add("175.6.201.128/25");
monitorRange.add("42.81.219.0/25");
monitorRange.add("42.202.155.128/25");
monitorRange.add("185.254.242.0/24");
}
private static Pattern pattern = Pattern.compile("^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$");
public static void main(String[] args) throws IOException, InterruptedException {
Set<String> ipSet = new HashSet<>();
String[] cmd = {"/bin/sh","-c","netstat -ntu | grep tcp | awk '{print $5}' | cut -d: -f1 | uniq -c "};
while(true){
try{
Process exec = Runtime.getRuntime().exec(cmd);
exec.waitFor();
InputStream inputStream = exec.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
Set<String> newIpSet = bufferedReader
.lines()
.filter(Objects::nonNull)
.map(lineData -> {
String[] split = lineData.split(" ");
for (String str : split) {
if (pattern.matcher(str).matches()) {
return str;
}
}
return null;
}).filter(Objects::nonNull).collect(Collectors.toSet());
if(ipSet.isEmpty()){
ipSet.addAll(newIpSet);
}else{
LocalDateTime now = LocalDateTime.now();
boolean b = newIpSet.removeAll(ipSet);
if(b){
Set<String> monitorSet = new HashSet<>();
for (String ip : newIpSet) {
for (String range : monitorRange) {
if(isInRange(ip,range)){
monitorSet.add(ip);
}
}
}
String join = String.join(",", monitorSet);
if(!monitorSet.isEmpty()){
System.out.println(now + " 新增访问ip数量:"+newIpSet.size() +",其中:关注范围:" + monitorSet.size() + "个,IP地址为:"+join);
}
}
ipSet.addAll(newIpSet);
}
}catch (Exception e){
e.printStackTrace();
}finally {
Thread.sleep(5 * 1000);
}
}
}
public static boolean isInRange(String ip, String cidr) {
String[] ips = ip.split("\\.");
int ipAddr = (Integer.parseInt(ips[0]) << 24)
| (Integer.parseInt(ips[1]) << 16)
| (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);
int type = Integer.parseInt(cidr.replaceAll(".*/", ""));
int mask = 0xFFFFFFFF << (32 - type);
String cidrIp = cidr.replaceAll("/.*", "");
String[] cidrIps = cidrIp.split("\\.");
int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)
| (Integer.parseInt(cidrIps[1]) << 16)
| (Integer.parseInt(cidrIps[2]) << 8)
| Integer.parseInt(cidrIps[3]);
return (ipAddr & mask) == (cidrIpAddr & mask);
}
}
使用方式
编译
需要jdk8或者8以上版本
javac NetCheck.java
启动
cd ${文件所在目录}
java NetCheck