node-opcua在Debian Linux下连接OPC UA服务器失败求助
OPC UA客户端在Debian下连接失败排查
问题背景
在Windows 10系统运行node-opcua-sample的simple_client_es8.js脚本,配置如下,连接OPC UA服务器完全正常:
const { OPCUAClient, AttributeIds, TimestampsToReturn, StatusCodes, DataType, SecurityPolicy, MessageSecurityMode } = require("node-opcua"); const endpointUrl = "opc.tcp://10.192.244.11:4840"; const nodeId = "ns=7;i=11"; async function main() { try { const client = OPCUAClient.create({ endpointMustExist: false, securityPolicy: SecurityPolicy.Basic256Sha256, securityMode: MessageSecurityMode.SignAndEncrypt, connectionStrategy: { maxRetry: 2, initialDelay: 2000, maxDelay: 10 * 1000, }, });
但在Debian Linux系统运行完全相同的客户端(已确认Node版本一致、4840端口开放、可ping通远程服务器)时,持续触发backoff事件并重试连接,最终抛出错误:
19:15:25.725Z :client_base_impl :109 无法连接到opc.tcp://10.192.244.11:4840服务器以获取服务器证书(在findEndpoint中) ... (err =premature disconnection 4) Error !!! Error: 无法连接到opc.tcp://10.192.244.11:4840服务器以获取服务器证书(在findEndpoint中) (err =premature disconnection 4) at /home/nodeapp/node-opcua-sample/node_modules/node-opcua-client/dist/private/client_base_impl.js:1410:67 at TmpClient._handleUnrecoverableConnectionFailure (/n
Linux下服务器证书已正确放置在目录:
/home/username/.config/node-opcua-default-nodejs/PKI/trusted/certs
后续更新
更新1:修改权限后静默崩溃
修改Linux目录权限后,客户端脚本在client.withSessionAsync处静默崩溃,执行的权限命令如下:
chmod 644 /home/username/.config/node-opcua-default-nodejs/PKI/trusted/certs/* chmod 755 /home/username/.config/node-opcua-default-nodejs/PKI/trusted chmod 755 /home/username/.config/node-opcua-default-nodejs/PKI
更新2:tcpdump抓包数据(已翻译)
另一客户端open64521的tcpdump数据:
编号 时间 源地址 目标地址 协议 长度 信息 1 0.000000 192.168.193.132 10.192.244.11 TCP 74 41716 → 4840 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=308740843 TSecr=0 WS=128 2 0.004702 10.192.244.11 192.168.193.132 TCP 60 4840 → 41716 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1380 3 0.004732 192.168.193.132 10.192.244.11 TCP 54 41716 → 4840 [ACK] Seq=1 Ack=1 Win=64240 Len=0 4 0.004939 192.168.193.132 10.192.244.11 OpcUa 114 Hello消息 5 0.215841 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 6 0.639420 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 7 1.503417 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 8 3.199436 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 9 6.751429 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 10 13.663426 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 11 27.231413 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 12 55.391446 192.168.193.132 10.192.244.11 TCP 114 [TCP重传] 41716 → 4840 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=60 13 55.391716 10.192.244.11 192.168.193.132 TCP 60 4840 → 41716 [RST, ACK] Seq=1 Ack=61 Win=64240 Len=0 14 75.719886 192.168.193.132 10.192.244.11 TCP 74 49644 → 4840 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=308816563 TSecr=0 WS=128 15 75.725514 10.192.244.11 192.168.193.132 TCP 60 4840 → 49644 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1380 16 75.725542 192.168.193.132 10.192.244.11 TCP 54 49644 → 4840 [ACK] Seq=1 Ack=1 Win=64240 Len=0 17 75.725731 192.168.193.132 10.192.244.11 OpcUa 114 Hello消息
可能的原因及解决方向
- MTU不匹配:抓包显示客户端MSS为1460,服务器返回MSS为1380,说明两端网络MTU不一致。Debian默认MTU为1500,服务器所在网络MTU更小,导致Hello消息无法正常传输。可尝试在Debian上临时降低MTU测试:
ip link set dev eth0 mtu 1400 - 证书目录权限遗漏:虽然修改了PKI相关目录权限,但可能遗漏了
/home/username/.config的执行权限,导致node-opcua无法遍历路径读取证书。补全权限:chmod 755 /home/username/.config chown -R username:username /home/username/.config/node-opcua-default-nodejs - 防火墙拦截应用层数据:即使能ping通,Debian的iptables或ufw可能拦截了OPC UA的应用层报文。检查并添加规则允许4840端口双向通信:
ufw allow 4840/tcp - 显式指定PKI路径:Linux下node-opcua可能存在默认路径识别问题,在客户端配置中显式指定PKI目录:
const client = OPCUAClient.create({ // 原有配置 pkiFolder: "/home/username/.config/node-opcua-default-nodejs/PKI" }); - TLS版本兼容性:Debian默认SSL库配置可能与服务器不兼容,尝试指定TLS版本:
const client = OPCUAClient.create({ // 原有配置 secureOptions: require("constants").SSL_OP_NO_TLSv1_3 });
内容的提问来源于stack exchange,提问作者user2132190
相关产品推荐
相关产品推荐

