解决java.net.UnknownHostException 问题小结
作者:奈-chann
本文主要介绍了解决java.net.UnknownHostException 问题小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、故障现象描述
环境信息
- 内网服务器:192.168.2.199
- 跳板机:192.168.2.202(具备公网网卡 eno4)
- 内网服务器通过跳板机访问外网
报错信息
Java 控制台抛出:
java.net.UnknownHostException: api.weixin.qq.com: 域名解析暂时失败
测试现象
- 执行
nslookup api.weixin.qq.comconnection timed out; no servers could be reached
- Ping 公网 DNS(如
119.29.29.29)无回显 - 跳板机访问外网正常
二、核心原因分析
查看路由表(ip route)发现:
内网服务器默认网关指向跳板机:
default via 192.168.2.202 dev enp2s0f1
故障根源
- 链路中断
内网服务器将数据包转发至跳板机,但跳板机未开启地址伪装(MASQUERADE/SNAT)。 - IP 无法回程
外网服务器收到内网私有 IP 请求包,无回程路由,无法响应。 - 规则失效
原有转发规则在修改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,使外网回包能正常返回跳板机,再转发至内网服务器。
五、验证结果
- 内网服务器执行 ping 114.114.114.114 —— 网络连通
- 内网服务器执行 nslookup api.weixin.qq.com —— 域名解析正常
- 重启 Java 应用,业务功能恢复正常
到此这篇关于解决java.net.UnknownHostException 问题小结的文章就介绍到这了,更多相关java.net.UnknownHostException 问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
