You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:35:56