本帖最后由 宝塔用户_bkolhc 于 2025-2-27 11:59 编辑
基本信息问题类型:功能性 BUG 影响模块:Java 项目管理 影响版本:9.4.0 问题等级:中等 环境依赖:纯 IPv6 网络环境
问题描述在纯 IPv6 网络环境下,宝塔面板的 Java 项目管理功能无法正常使用,会出现网络不可达错误。这是由于面板在进行网络检测时仅使用 IPv4 地址(8.8.8.8),导致在纯 IPv6 环境下无法建立连接。 环境信息错误日志
REQUEST_DATE: 2025-02-17 07:26:11
VERSION: Ubuntu 20.04.1 LTS (Focal Fossa) x86_64(Py3.7.9) - 9.4.0
REMOTE_ADDR: 2409:895a:2437:11ab:c856:5147:f685:9efb
REQUEST_URI: POST /mod/java/project/project_list?
REQUEST_FORM: {'data': '{"search":"","p":1,"limit":10,"type_id":""}'}
USER_AGENT: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0
Traceback (most recent call last):
File "/www/server/panel/BTPanel/__init__.py", line 2541, in publicObject
res = run_obj.run(toObject, defs, get)
File "/www/server/panel/BTPanel/__init__.py", line 2488, in run
result = getattr(toObject, get.action)(get)
File "/www/server/panel/mod/modController.py", line 89, in model
raise public.PanelError(result['msg'])
public.PanelError: OSError: [Errno 101] Network is unreachable
问题定位错误触发位置:
根本原因:
网络检测方法仅支持 IPv4 在纯 IPv6 环境下无法建立 IPv4 连接 缺少 IPv6 备选方案
建议改进
def get_network_ip():
try:
# 优先尝试 IPv6 连接
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
s.connect(('2001:4860:4860::8888', 80))
ip = s.getsockname()[0]
s.close()
return ip
except:
try:
# 回退到 IPv4
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
s.close()
return ip
except:
return '::1' # 返回 IPv6 回环地址
影响范围
受影响的用户群:
使用纯 IPv6 网络的服务器用户 运行在 IPv6 优先网络环境的用户
受影响的功能:
Java 项目管理模块 可能影响其他依赖网络检测的功能
|