improved whois

This commit is contained in:
Joern Muehlencord
2022-02-25 13:13:27 +01:00
parent e82a4cadd4
commit d427956422
5 changed files with 680 additions and 214 deletions

View File

@ -1,4 +1,4 @@
/* /*
* Copyright 2019 Joern Muehlencord (joern@muehlencord.de). * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -24,131 +24,136 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
*
* @author Joern Muehlencord (joern@muehlencord.de) * @author Joern Muehlencord (joern@muehlencord.de)
*/ */
public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser { public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser {
/** /**
* logger object * logger object
*/ */
private static final Logger logger = LoggerFactory.getLogger(ArinWhoisParser.class); private static final Logger logger = LoggerFactory.getLogger(ArinWhoisParser.class);
private static final String START_STRING = "# start"; private static final String START_STRING = "# start";
private static final String END_STRING = "# end"; private static final String END_STRING = "# end";
private static final String NET_RANGE = "NetRange:"; private static final String NET_RANGE = "NetRange:";
private static final String ORG_NAME = "OrgName:"; private static final String ORG_NAME = "OrgName:";
/** /**
* information to be returned * information to be returned
*/ */
private WhoisInformation whoisInformation; private WhoisInformation whoisInformation;
@Override @Override
public WhoisInformation parseWhoIsString(String whoisString) throws WhoisException { public WhoisInformation parseWhoIsString(String whoisString) throws WhoisException {
whoisInformation = new WhoisInformation(); whoisInformation = new WhoisInformation();
whoisInformation.setResponseString(whoisString);
if (whoisString.contains(START_STRING)) {
String multipleWhoisString = whoisString; // if re-allocated just return empty whoisInformation because this RIR is not responsible
if (whoisString.contains("Allocated to LACNIC")) {
throw new WhoisException("Allocated to LACNIC");
}
while (multipleWhoisString.contains(START_STRING)) { whoisInformation.setResponseString(whoisString);
String whoisPartString; if (whoisString.contains(START_STRING)) {
try {
whoisPartString = getValueBetweenKeywords(multipleWhoisString, START_STRING, END_STRING);
} catch (ParseException ex) {
throw new WhoisException("Error while reading whois part elements. Reason: " + ex.getMessage(), ex);
}
analyse(whoisPartString);
multipleWhoisString = multipleWhoisString.substring(multipleWhoisString.indexOf(END_STRING) + 4);
}
String multipleWhoisString = whoisString;
while (multipleWhoisString.contains(START_STRING)) {
String whoisPartString;
try {
whoisPartString = getValueBetweenKeywords(multipleWhoisString, START_STRING, END_STRING);
} catch (ParseException ex) {
throw new WhoisException("Error while reading whois part elements. Reason: " + ex.getMessage(), ex);
}
analyse(whoisPartString);
multipleWhoisString = multipleWhoisString.substring(multipleWhoisString.indexOf(END_STRING) + 4);
}
} else {
analyse(whoisString);
}
whoisInformation.validate();
return whoisInformation;
}
private void analyse(String whoisString) throws WhoisException {
String[] blocks;
if (whoisString.contains("\r\n")) {
blocks = whoisString.split("\r\n\r\n");
} else {
blocks = whoisString.split("\n\n");
}
for (String block : blocks) {
analyseBlock(block);
}
}
private void analyseBlock(String block) throws WhoisException {
logger.debug("Start analysing block");
logger.debug("\n---\n{}\n---\n", block);
if ((block == null) || (!block.contains(" "))) {
logger.debug("Skipping empty block");
return;
}
String startString = block.substring(0, block.indexOf(" "));
if (startString.equals("%")) {
startString = block.substring(0, block.indexOf(" ", 2));
}
while (startString.startsWith("\n")) {
startString = startString.substring(1, startString.length());
}
Map<String, String> valueMap = getValueMap(block);
switch (startString) {
case NET_RANGE:
if (valueMap.containsKey(NET_RANGE)) {
String netRange = valueMap.get(NET_RANGE);
// convert inetnum to CDIR
// TODO - what happens if not 3 parts are found
String[] ipAddresses = netRange.split(" ");
// FIXME add CDIR notation support
String startIpAddress = ipAddresses[0];
String endIPAddress = ipAddresses[2];
whoisInformation.addNetwork(rangeToCidrList(startIpAddress, endIPAddress));
logger.info("Network: {}", whoisInformation.getNetwork());
} else { } else {
analyse(whoisString); throw new WhoisException("Cannot identify netrange value");
} }
break;
whoisInformation.validate(); case ORG_NAME:
String orgName = getValue(ORG_NAME, valueMap);
String orgId = getValue("OrgId:", valueMap);
String country = getValue("Country:", valueMap);
return whoisInformation; if ((orgName == null) || (country == null)) {
} throw new WhoisException("Cannot identify OrgName and/or country value");
}
private void analyse(String whoisString) throws WhoisException { if (orgId == null) {
String[] blocks; orgId = orgName;
if (whoisString.contains("\r\n")) { }
blocks = whoisString.split("\r\n\r\n"); whoisInformation.setNetworkInformation(new NetworkInformation(orgName, orgId, country));
} else { logger.info("Networkinformation: {}", whoisInformation.getNetworkInformation());
blocks = whoisString.split("\n\n"); break;
}
for (String block : blocks) { case "OrgAbuseHandle:":
analyseBlock(block); // TODO add abuse handler
} logger.info("Skipping OrgAbuseHandle block");
} break;
case "OrgTechHandle:":
private void analyseBlock(String block) throws WhoisException { // admin person of network server belongs to
logger.debug("Start analysing block"); logger.info("Skipping OrgTechHandle block");
logger.debug("\n---\n{}\n---\n", block); break;
if ((block == null) || (!block.contains(" "))) { case "#":
logger.debug("Skipping empty block"); logger.info("Skipping comment block");
return; break;
} default:
logger.info("Unknown block found");
String startString = block.substring(0, block.indexOf(" "));
if (startString.equals("%")) {
startString = block.substring(0, block.indexOf(" ", 2));
}
while (startString.startsWith("\n")) {
startString = startString.substring(1, startString.length());
}
Map<String, String> valueMap = getValueMap(block);
switch (startString) {
case NET_RANGE:
if (valueMap.containsKey(NET_RANGE)) {
String netRange = valueMap.get(NET_RANGE);
// convert inetnum to CDIR
// TODO - what happens if not 3 parts are found
String[] ipAddresses = netRange.split(" ");
// FIXME add CDIR notation support
String startIpAddress = ipAddresses[0];
String endIPAddress = ipAddresses[2];
whoisInformation.addNetwork(rangeToCidrList(startIpAddress, endIPAddress));
logger.info("Network: {}", whoisInformation.getNetwork());
} else {
throw new WhoisException("Cannot identify netrange value");
}
break;
case ORG_NAME:
String orgName = getValue(ORG_NAME, valueMap);
String orgId = getValue("OrgId:", valueMap);
String country = getValue("Country:", valueMap);
if ((orgName == null) || (country == null)) {
throw new WhoisException("Cannot identify OrgName and/or country value");
}
if (orgId == null) {
orgId = orgName;
}
whoisInformation.setNetworkInformation(new NetworkInformation(orgName, orgId, country));
logger.info("Networkinformation: {}", whoisInformation.getNetworkInformation());
break;
case "OrgAbuseHandle:":
// TODO add abuse handler
logger.info("Skipping OrgAbuseHandle block");
break;
case "OrgTechHandle:":
// admin person of network server belongs to
logger.info("Skipping OrgTechHandle block");
break;
case "#":
logger.info("Skipping comment block");
break;
default:
logger.info("Unknown block found");
}
} }
}
} }

View File

@ -1,4 +1,4 @@
/* /*
* Copyright 2019 Joern Muehlencord (joern@muehlencord.de). * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -22,108 +22,112 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
*
* @author Joern Muehlencord (joern@muehlencord.de) * @author Joern Muehlencord (joern@muehlencord.de)
*/ */
public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisParser { public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisParser {
/** /**
* logger object * logger object
*/ */
private static final Logger logger = LoggerFactory.getLogger(DefaultWhoisParser.class); private static final Logger logger = LoggerFactory.getLogger(DefaultWhoisParser.class);
/** /**
* information to be returned * information to be returned
*/ */
private WhoisInformation whoisInformation; private WhoisInformation whoisInformation;
@Override @Override
public WhoisInformation parseWhoIsString(String whoisString) throws WhoisException { public WhoisInformation parseWhoIsString(String whoisString) throws WhoisException {
whoisInformation = new WhoisInformation(); // if re-allocated just return empty whoisInformation because this RIR is not responsible
whoisInformation.setResponseString(whoisString); if (whoisString.contains("Allocated to LACNIC")) {
// split by blank lines to identify blocks throw new WhoisException("Allocated to LACNIC");
String[] blocks; }
if (whoisString.contains("\r\n")) {
blocks = whoisString.split("\r\n\r\n"); whoisInformation = new WhoisInformation();
whoisInformation.setResponseString(whoisString);
// split by blank lines to identify blocks
String[] blocks;
if (whoisString.contains("\r\n")) {
blocks = whoisString.split("\r\n\r\n");
} else {
blocks = whoisString.split("\n\n");
}
for (String block : blocks) {
analyseBlock(block);
}
whoisInformation.validate();
return whoisInformation;
}
private void analyseBlock(String block) throws WhoisException {
logger.debug("Start analysing block");
logger.debug("\n---\n{}\n---\n", block);
if ((block == null) || (!block.contains(" "))) {
logger.debug("Skipping empty block");
return;
}
String startString = block.substring(0, block.indexOf(" "));
if (startString.equals("%")) {
startString = block.substring(0, block.indexOf(" ", 2));
}
Map<String, String> valueMap = getValueMap(block);
switch (startString) {
case "inetnum:":
String inetnum = getValue("inetnum:", valueMap);
String country = getValue("country:", valueMap);
String netname = getValue("netname:", valueMap);
String descr = getValue("descr:", valueMap);
if ((inetnum == null) || (country == null)) {
throw new WhoisException("Cannot identify inetnum and/or country value");
}
if (inetnum.contains(" ")) {
// convert inetnum to CDIR
// TODO - what happens if not 3 parts are found
String[] ipAddresses = inetnum.split(" ");
// FIXME add CDIR notation support
String startIpAddress = ipAddresses[0];
String endIPAddress = ipAddresses[2];
whoisInformation.addNetwork(rangeToCidrList(startIpAddress, endIPAddress));
} else { } else {
blocks = whoisString.split("\n\n"); whoisInformation.addNetwork(inetnum);
}
for (String block : blocks) {
analyseBlock(block);
} }
whoisInformation.validate(); logger.info("Network: {}", whoisInformation.getNetwork());
whoisInformation.setNetworkInformation(new NetworkInformation(netname, descr, country));
return whoisInformation; break;
} case "route:":
// get information on level-2 network
private void analyseBlock(String block) throws WhoisException { String route = getValue("route:", valueMap);
logger.debug("Start analysing block"); whoisInformation.addRootNetwork(route);
logger.debug("\n---\n{}\n---\n", block); logger.info("Root network: {}", whoisInformation.getRootNetwork());
break;
if ((block == null) || (!block.contains(" "))) {
logger.debug("Skipping empty block"); case "role:":
return; // admin company of network server belongs to
} logger.info("Skipping role block");
break;
String startString = block.substring(0, block.indexOf(" ")); case "person:":
if (startString.equals("%")) { // admin person of network server belongs to
startString = block.substring(0, block.indexOf(" ", 2)); logger.info("Skipping person block");
} break;
case "% Information":
Map<String, String> valueMap = getValueMap(block); case "% Note:":
case "% This":
switch (startString) { case "%":
logger.info("Skipping comment block");
case "inetnum:": break;
String inetnum = getValue("inetnum:", valueMap); default:
String country = getValue("country:", valueMap); logger.info("Unknown block found");
String netname = getValue("netname:", valueMap); logger.error(block);
String descr = getValue("descr:", valueMap);
if ((inetnum == null) || (country == null)) {
throw new WhoisException("Cannot identify inetnum and/or country value");
}
if (inetnum.contains(" ")) {
// convert inetnum to CDIR
// TODO - what happens if not 3 parts are found
String[] ipAddresses = inetnum.split(" ");
// FIXME add CDIR notation support
String startIpAddress = ipAddresses[0];
String endIPAddress = ipAddresses[2];
whoisInformation.addNetwork(rangeToCidrList(startIpAddress, endIPAddress));
} else {
whoisInformation.addNetwork(inetnum);
}
logger.info("Network: {}", whoisInformation.getNetwork());
whoisInformation.setNetworkInformation(new NetworkInformation(netname, descr, country));
break;
case "route:":
// get information on level-2 network
String route = getValue("route:", valueMap);
whoisInformation.addRootNetwork(route);
logger.info("Root network: {}", whoisInformation.getRootNetwork());
break;
case "role:":
// admin company of network server belongs to
logger.info("Skipping role block");
break;
case "person:":
// admin person of network server belongs to
logger.info("Skipping person block");
break;
case "% Information":
case "% Note:":
case "% This":
case "%":
logger.info("Skipping comment block");
break;
default:
logger.info("Unknown block found");
logger.error(block);
}
} }
}
} }

View File

@ -48,6 +48,7 @@ public class Whois {
WHOIS_SERVERS.add("whois.afrinic.net"); WHOIS_SERVERS.add("whois.afrinic.net");
WHOIS_SERVERS.add("whois.apnic.net"); WHOIS_SERVERS.add("whois.apnic.net");
WHOIS_SERVERS.add("whois.arin.net"); WHOIS_SERVERS.add("whois.arin.net");
WHOIS_SERVERS.add("whois.lacnic.net");
} }
/** /**
@ -79,7 +80,7 @@ public class Whois {
} }
/** /**
* reads and parses the inforomation for the given ip address from the given whoisserver * reads and parses the information for the given ip address from the given whoisserver
* *
* @param whoIsServer the whoisClient server to use * @param whoIsServer the whoisClient server to use
* @param ip the ip to query whoisClient data for * @param ip the ip to query whoisClient data for

View File

@ -15,11 +15,12 @@
*/ */
package de.muehlencord.shared.network.whois; package de.muehlencord.shared.network.whois;
import de.muehlencord.shared.network.BaseTest;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import de.muehlencord.shared.network.BaseTest;
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -76,8 +77,8 @@ public class WhoisTest extends BaseTest {
} }
@Test @Test
@Disabled // @Disabled
public void testUnkown() throws WhoisException { public void testUnknown() throws WhoisException {
Whois whoIsClient = new Whois(); Whois whoIsClient = new Whois();
// whoIsClient.execute("whois.arin.net", "174.139.180.10"); // whoIsClient.execute("whois.arin.net", "174.139.180.10");
// whoIsClient.execute("whois.twnic.net", "60.250.38.39"); // whoIsClient.execute("whois.twnic.net", "60.250.38.39");
@ -86,7 +87,10 @@ public class WhoisTest extends BaseTest {
// whoIsClient.execute("whois.apnic.net", "182.72.111.26"); // whoIsClient.execute("whois.apnic.net", "182.72.111.26");
// whoIsClient.execute("whois.ripe.net", "213.55.95.62"); // Transferred to Afrinic // whoIsClient.execute("whois.ripe.net", "213.55.95.62"); // Transferred to Afrinic
// whoIsClient.execute("whois.afrinic.net", "213.55.95.62"); // whoIsClient.execute("whois.afrinic.net", "213.55.95.62");
whoIsClient.execute("whois.arin.net", "32.64.68.229"); // whoIsClient.execute("whois.arin.net", "32.64.68.229");
// WhoisInformation info = whoIsClient.execute("whois.lacnic.net", "179.43.168.126");
WhoisInformation info = whoIsClient.execute("179.43.168.126");
System.out.println (info);
} }
@Test @Test

View File

@ -0,0 +1,452 @@
% Joint Whois - whois.lacnic.net
% This server accepts single ASN, IPv4 or IPv6 queries
% LACNIC resource: whois.lacnic.net
% Copyright LACNIC lacnic.net
% The data below is provided for information purposes
% and to assist persons in obtaining information about or
% related to AS and IP numbers registrations
% By submitting a whois query, you agree to use this data
% only for lawful purposes.
% 2022-02-25 08:42:23 (-03 -03:00)
inetnum: 179.43.128.0/18
status: allocated
aut-num: AS51852
owner: PRIVATE LAYER INC
ownerid: PA-PLIN-LACNIC
responsible: Milciades Garcia
address: Torres De Las Americas, Torre C, 0, Suite 1404, Floor 14
address: 00000 - Panama -
country: PA
phone: +41 43 5082295
owner-c: MIG23
tech-c: MIG23
abuse-c: MIG23
inetrev: 179.43.128.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.129.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM [lame - not published]
nsstat: 20220224 QREFUSED
nslastaa: 20191008
inetrev: 179.43.130.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.131.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM [lame - not published]
nsstat: 20220224 QREFUSED
nslastaa: 20191008
inetrev: 179.43.132.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.133.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.134.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.140.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.141.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.144.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.142.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM [lame - not published]
nsstat: 20220224 QREFUSED
nslastaa: 20191008
inetrev: 179.43.143.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.150.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.151.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.145.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.155.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.157.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.182.0/24
nserver: NS1.CURTIR.ME [lame - not published]
nsstat: 20220225 UH
nslastaa: 20190327
nserver: NS2.CURTIR.ME [lame - not published]
nsstat: 20220225 UH
nslastaa: 20190327
inetrev: 179.43.183.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.187.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.188.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.190.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.191.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.161.0/24
nserver: DNS01.PRIVATELAYER.COM [lame - not published]
nsstat: 20220225 NOT SYNC ZONE
nslastaa: 20210211
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.146.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.160.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.148.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.152.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.162.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.169.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.178.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.139.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.163.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.165.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM [lame - not published]
nsstat: 20220225 QREFUSED
nslastaa: 20150617
inetrev: 179.43.166.0/24
nserver: NS-160.AWSDNS-20.COM [lame - not published]
nsstat: 20220224 QREFUSED
nslastaa: 20150425
nserver: NS-1647.AWSDNS-13.CO.UK [lame - not published]
nsstat: 20220224 QREFUSED
nslastaa: 20150425
inetrev: 179.43.167.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.168.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.176.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.149.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.181.0/24
nserver: NS1.LEADSPLANOSDESAUDE.COM.BR [lame - not published]
nsstat: 20220224 UH
nslastaa: 20150727
nserver: NS2.LEADSPLANOSDESAUDE.COM.BR [lame - not published]
nsstat: 20220224 UH
nslastaa: 20150727
inetrev: 179.43.154.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.184.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.185.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.186.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.172.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.170.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
inetrev: 179.43.156.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.189.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.164.0/24
nserver: NS-437.AWSDNS-54.COM [lame - not published]
nsstat: 20220224 QREFUSED
nslastaa: 20150424
nserver: NS-1214.AWSDNS-23.ORG [lame - not published]
nsstat: 20220224 QREFUSED
nslastaa: 20150424
inetrev: 179.43.171.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.177.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.180.0/24
nserver: DNS01.PRIVATELAYER.COM [lame - not published]
nsstat: 20220225 NOT SYNC ZONE
nslastaa: 20201124
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.158.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.159.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220221 AA
nslastaa: 20220221
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220221 AA
nslastaa: 20220221
inetrev: 179.43.147.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220223 AA
nslastaa: 20220223
inetrev: 179.43.173.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220225 AA
nslastaa: 20220225
inetrev: 179.43.174.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.175.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220222 AA
nslastaa: 20220222
inetrev: 179.43.179.0/24
nserver: DNS01.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
nserver: DNS02.PRIVATELAYER.COM
nsstat: 20220224 AA
nslastaa: 20220224
created: 20131112
changed: 20151101
nic-hdl: MIG23
person: Milciades Garcia
e-mail: support@privatelayer.com
address: Edif. Ocean Business Plaza, 1404, Marbella
address: 00000 - Panama City -
country: PA
phone: +41 43 5082295
created: 20151023
changed: 20220206
% whois.lacnic.net accepts only direct match queries.
% Types of queries are: POCs, ownerid, CIDR blocks, IP
% and AS numbers.