Java如何实现IP地址转换为对应域名(非主机名)
Java中IP地址转域名相关问题说明与解决方案
反向解析结果不符合预期的根本原因
调用InetAddress相关API拿到bom12s21-in-f14.1e100.net而非google.com,是DNS协议本身的设计决定的,和代码写法无关:
- 正向解析是「域名→IP」的映射,同一个IP可以被无数个域名做正向解析指向,比如谷歌旗下各站点、同CDN节点承载的其他业务域名,都可能解析到142.251.42.78这个地址。
- 反向解析是「IP→域名」的PTR记录查询,也就是
getHostName()、getCanonicalHostName()的底层实现,一个IP通常只会配置1条PTR记录,指向服务方给节点分配的内部主机名,你拿到的1e100.net后缀域名就是谷歌给该CDN节点配置的合法PTR记录,不存在通用方法能通过IP反向查出所有正向指向它的公网域名。
接口请求报错的解决方案
遇到的两个请求错误分别对应不同原因,可按如下方式处理:
- 8080端口连接超时:谷歌公开HTTP/HTTPS服务不会监听8080端口,该端口无服务响应,访问对应服务请使用80(HTTP)、443(HTTPS)端口。
- 443端口SSL证书校验失败:HTTPS握手时会校验证书绑定的域名与请求地址是否匹配,直接用IP发起请求时,服务器返回的证书未将IP写入主题备用名称列表,必然校验失败。正确的做法是请求IP时携带
Host请求头指定目标域名,测试阶段可临时关闭主机名校验,示例代码如下:
import org.apache.http.client.HttpClient; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.impl.client.HttpClients; import org.springframework.http.*; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; public class IpRequestTest { public static void main(String[] args) { // 测试用:关闭SSL主机名校验,生产环境请配置合规信任库,不要使用该配置 HttpClient httpClient = HttpClients.custom() .setSSLHostnameVerifier(new NoopHostnameVerifier()) .build(); RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient)); HttpHeaders headers = new HttpHeaders(); // 明确指定目标域名的Host头 headers.set("Host", "google.com"); HttpEntity<String> requestEntity = new HttpEntity<>(headers); try { ResponseEntity<String> response = restTemplate.exchange( "https://142.251.42.78:443", HttpMethod.GET, requestEntity, String.class ); System.out.println("响应状态:" + response.getStatusCode()); } catch (Exception e) { System.out.println("请求错误:" + e.getMessage()); } } }
生产环境直接使用目标域名发起请求即可,不需要手动解析IP再构造请求,能自然规避证书校验、Host匹配类问题。
关于“通过IP获取对应公网域名”的补充说明
DNS体系本身不存储所有正向指向某IP的域名列表,没有公开的通用接口可以实现该需求:
- 如果是内部业务场景,可提前批量做正向解析,自行维护IP-域名的映射关系表,查询时做匹配即可。
- 公网场景下只能通过被动DNS数据库查询历史上解析到该IP的所有域名,这类服务大多为商业付费服务,数据存在一定延迟。
内容的提问来源于stack exchange,提问作者Satya Prakash
相关产品推荐
相关产品推荐

