解决java.net.UnknownHostException 问题小结

 更新时间:2026年07月29日 09:23:32   作者:奈-chann  
本文主要介绍了解决java.net.UnknownHostException 问题小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、故障现象描述

环境信息

  • 内网服务器:192.168.2.199
  • 跳板机:192.168.2.202(具备公网网卡 eno4)
  • 内网服务器通过跳板机访问外网

报错信息

Java 控制台抛出:

java.net.UnknownHostException: api.weixin.qq.com: 域名解析暂时失败

测试现象

  1. 执行 nslookup api.weixin.qq.com
    connection timed out; no servers could be reached
  2. Ping 公网 DNS(如 119.29.29.29)无回显
  3. 跳板机访问外网正常

二、核心原因分析

查看路由表(ip route)发现:
内网服务器默认网关指向跳板机:

default via 192.168.2.202 dev enp2s0f1

故障根源

  1. 链路中断
    内网服务器将数据包转发至跳板机,但跳板机未开启地址伪装(MASQUERADE/SNAT)
  2. IP 无法回程
    外网服务器收到内网私有 IP 请求包,无回程路由,无法响应。
  3. 规则失效
    原有转发规则在修改 iptables 或系统重启后被覆盖/丢失。

三、解决方案:开启 NAT 地址转换

步骤一:开启跳板机内核转发功能

允许 Linux 系统转发数据包。

# 尝试执行
sysctl net.ipv4.ip_forward
# 返回结果不为1 临时开启
sysctl -w net.ipv4.ip_forward=1
# 永久开启
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

步骤二:配置 iptables 出口 NAT 规则

方案 A:允许整个内网网段上网(推荐)

# -s 指定内网网段,-o 指定公网网卡
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eno4 -j MASQUERADE

方案 B:仅允许指定服务器上网(精细化控制)

# 仅允许 192.168.2.199 访问外网
iptables -t nat -A POSTROUTING -s 192.168.2.199/32 -o eno4 -j MASQUERADE

步骤三:持久化 iptables 规则

防止重启失效。

# CentOS / RHEL
iptables-save > /etc/sysconfig/iptables
# Ubuntu / Debian
iptables-save > /etc/iptables/rules.v4

四、技术知识点科普

CIDR 子网说明

  • /24
    子网掩码 255.255.255.0,覆盖 192.168.2.0 ~ 192.168.2.255 整个网段。
  • /32
    子网掩码 255.255.255.255,精确匹配单个 IP 地址。

MASQUERADE(地址伪装)

动态 SNAT,将内网源 IP 临时替换为跳板机公网 IP,使外网回包能正常返回跳板机,再转发至内网服务器。

五、验证结果

  1. 内网服务器执行 ping 114.114.114.114 —— 网络连通
  2. 内网服务器执行 nslookup api.weixin.qq.com —— 域名解析正常
  3. 重启 Java 应用,业务功能恢复正常

到此这篇关于解决java.net.UnknownHostException 问题小结的文章就介绍到这了,更多相关java.net.UnknownHostException 问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java全排列算法字典序下的下一个排列讲解

    Java全排列算法字典序下的下一个排列讲解

    今天小编就为大家分享一篇关于Java全排列字典序下的下一个排列,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • JFinal 调用存储过程的步骤

    JFinal 调用存储过程的步骤

    这篇文章主要介绍了JFinal 调用存储过程的步骤,帮助大家更好的理解和学习使用JFinal,感兴趣的朋友可以了解下
    2021-03-03
  • Java中Random类常用方法及注意事项总结大全

    Java中Random类常用方法及注意事项总结大全

    Java Random类是Java中生成随机数的一个重要工具类,它提供了丰富的方法来生成不同类型的随机数,这篇文章主要介绍了Java中Random类常用方法及注意事项的相关资料,需要的朋友可以参考下
    2025-07-07
  • MyBatis OGNL 表达式的避坑指南

    MyBatis OGNL 表达式的避坑指南

    本文主要介绍了MyBatis OGNL 表达式的避坑指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • @PostConstruct、@Autowired与构造函数的执行顺序详解

    @PostConstruct、@Autowired与构造函数的执行顺序详解

    这篇文章主要介绍了@PostConstruct、@Autowired与构造函数的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-08-08
  • SpringBoot浅析缓存机制之Redis单机缓存应用

    SpringBoot浅析缓存机制之Redis单机缓存应用

    在上文中我介绍了Spring Boot使用EhCache 2.x来作为缓存的实现,本文接着介绍使用单机版的Redis作为缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • springboot读取resource配置文件生成容器对象的示例代码

    springboot读取resource配置文件生成容器对象的示例代码

    这篇文章主要介绍了springboot读取resource配置文件生成容器对象的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

    Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

    这篇文章主要介绍了Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java中的stream流分组示例详解

    Java中的stream流分组示例详解

    Java8 Stream API以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16 record定义键,并获取数量、属性集合、极值等信息,本文给大家介绍Java中的stream流分组,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • SpringBoot升级后Hystrix没了以及3个替代方案分享

    SpringBoot升级后Hystrix没了以及3个替代方案分享

    这篇文章主要介绍了SpringBoot升级后Hystrix没了以及3个替代方案分享,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-04-04

最新评论