检查网络流量

目标:捕获并检查原始 ROS 2 网络流量。

教程级别:高级

时间:20 分钟

概述

ROS 2 通信安全就是保护节点之间的通信。 之前的教程启用了安全性,但您如何**真正**知道流量是否被加密? 在本教程中,我们将研究捕获实时网络流量以显示加密和未加密流量之间的差异。

rmw_fastrtps_cpp 使用 Shared Memory Transport by default to improve the performance in the transport layer when the endpoints are in the same host system. 安全区域仍然适用,数据将被加密。 但是,由于数据不在网络接口上,因此您无法捕获实时网络流量。 如果您使用的是``rmw_fastrtps_cpp``,则需要完成本教程并在发布者和订阅者之间使用不同的主机系统,或者使用`启用 UDP 传输 <https://fast-dds.docs.eprosima.com/en/latest/fastdds/transport/udp/udp.html#enabling-udp-transport>`_ 和`如何设置 Fast-DDS XML 配置 <https://github.com/ros2/rmw_fastrtps#full-qos-configuration>`_ 禁用共享内存传输。

先决条件

本指南仅在 Linux 上运行,并假设您已经 installed ROS 2.

运行演示

安装“tcpdump”

在新的终端窗口中开始安装 tcpdump, 用于捕获和显示网络流量的命令行工具。 虽然本教程描述了“tcpdump”命令,但您也可以使用 Wireshark, 用于捕获和分析流量的类似图形工具。

sudo apt update
sudo apt install tcpdump

通过多个 ssh 会话在一台机器上运行以下命令。

启动谈话者和侦听者

再次启动谈话者和侦听者,每个都在各自的终端中。 未设置安全环境变量,因此未为这些会话启用安全性。

# Disable ROS Security for both terminals
unset ROS_SECURITY_ENABLE

# In terminal 1:
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

# In terminal 2:
ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

显示未加密的发现数据包

在通话器和侦听器运行时,打开另一个终端并启动“tcpdump”以查看网络流量。

您需要使用“sudo”,因为读取原始网络流量是一项特权操作。

以下命令使用“-X”选项打印数据包内容,使用“-i”选项侦听任何接口上的数据包,并仅捕获“UDP <https://en.wikipedia.org/wiki/User_Datagram_Protocol>”端口 7400 流量。

sudo tcpdump -X -i any udp port 7400

您应该看到如下数据包:

20:18:04.400770 IP 8_xterm.46392 > 239.255.0.1.7400: UDP, length 252

0x0000: 4500 0118 d48b 4000 0111 7399 c0a8 8007 E…..@…s….. 0x0010: efff 0001 b538 1ce8 0104 31c6 5254 5053 …..8….1.RTPS … 0x00c0: 5800 0400 3f0c 3f0c 6200 1c00 1800 0000 X…?.?.b……. 0x00d0: 2f74 616c 6b65 725f 6c69 7374 656e 6572 /talker_listener 0x00e0: 2f74 616c 6b65 7200 2c00 2800 2100 0000 /talker.,.(.!… 0x00f0: 656e 636c 6176 653d 2f74 616c 6b65 725f enclave=/talker_ 0x0100: 6c69 7374 656e 6572 2f74 616c 6b65 723b listener/talker; 0x0110: 0000 0000 0100 0000 ……..

这是一个发现数据报——谈话者正在寻找订阅者。 如您所见,节点名称(“/talker_listener/talker”)和 enclave(也是“/talker_listener/talker”)以纯文本形式传递。 您还应该看到来自“listener”节点的类似发现数据报。 典型发现数据包的一些其他特征:

  • 目标地址是 239.255.0.1,这是一个多播 IP 地址;ROS 2 默认使用多播流量进行发现。

  • UDP 7400 是目标端口,符合“DDS-RTPS 规范 <https://www.omg.org/spec/DDSI-RTPS/About-DDSI-RTPS/>”的规定。

  • 数据包包含“RTPS”标签,也符合 DDS-RTPS 规范的定义。

显示未加密的数据包

使用“tcpdump”通过过滤 7400 以上的 UDP 端口来捕获未发现的 RTPS 数据包:

sudo tcpdump -i any -X udp portrange 7401-7500

您将看到几种不同类型的数据包,但请注意以下内容,这显然是从说话者发送到侦听者的数据:

20:49:17.927303 IP localhost.46392 > localhost.7415: UDP, length 84

0x0000: 4500 0070 5b53 4000 4011 e127 7f00 0001 E..p[S@.@..’…. 0x0010: 7f00 0001 b538 1cf7 005c fe6f 5254 5053 …..8….oRTPS 0x0020: 0203 010f 010f 4874 e752 0000 0100 0000 ……Ht.R…… 0x0030: 0901 0800 cdee b760 5bf3 5aed 1505 3000 …….`[.Z…0. 0x0040: 0000 1000 0000 1204 0000 1203 0000 0000 ……………. 0x0050: 5708 0000 0001 0000 1200 0000 4865 6c6c W………..Hell 0x0060: 6f20 576f 726c 643a 2032 3133 3500 0000 o.World:.2135…

关于此数据包需要注意的一些特性:

  • 消息内容“Hello World: 2135”以明文形式发送

  • 源和目标 IP 地址为“localhost”:由于两个节点都在同一台机器上运行,因此节点在“localhost”接口上发现彼此

启用加密

停止谈话者和侦听者节点。 通过设置安全环境变量为两者启用加密,然后再次运行它们。

# In terminal 1:
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

# In terminal 2:
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

显示加密的发现数据包

运行之前使用的相同 tcpdump 命令来检查启用加密的发现流量的输出:

sudo tcpdump -X -i any udp port 7400

典型的发现包看起来有点像下面这样:

21:09:07.336617 IP 8_xterm.60409 > 239.255.0.1.7400: UDP, length 596

0x0000: 4500 0270 c2f6 4000 0111 83d6 c0a8 8007 E..p..@……… 0x0010: efff 0001 ebf9 1ce8 025c 331e 5254 5053 ………3.RTPS 0x0020: 0203 010f bbdd 199c 7522 b6cb 699f 74ae ……..u”..i.t. … 0x00c0: 5800 0400 3f0c ff0f 6200 2000 1a00 0000 X…?…b……. 0x00d0: 2f74 616c 6b65 725f 6c69 7374 656e 6572 /talker_listener 0x00e0: 2f6c 6973 7465 6e65 7200 0000 2c00 2800 /listener…,.(. 0x00f0: 2300 0000 656e 636c 6176 653d 2f74 616c #…enclave=/tal 0x0100: 6b65 725f 6c69 7374 656e 6572 2f6c 6973 ker_listener/lis 0x0110: 7465 6e65 723b 0000 0110 c400 1400 0000 tener;………. 0x0120: 4444 533a 4175 7468 3a50 4b49 2d44 483a DDS:Auth:PKI-DH: 0x0130: 312e 3000 0400 0000 0c00 0000 6464 732e 1.0………dds. … 0x0230: 1100 0000 6464 732e 7065 726d 5f63 612e ….dds.perm_ca. 0x0240: 616c 676f 0000 0000 0d00 0000 4543 4453 algo……..ECDS 0x0250: 412d 5348 4132 3536 0000 0000 0000 0000 A-SHA256…….. 0x0260: 0510 0800 0700 0080 0600 0080 0100 0000 …………….

这个数据包更大,包含可用于在 ROS 节点之间设置加密的信息。 我们很快就会看到,这实际上包括我们启用安全性时创建的一些安全配置文件。 有兴趣了解更多信息吗?看看这篇优秀的论文 Network Reconnaissance and Vulnerability Excavation of Secure DDS Systems 了解为什么这很重要。

显示加密数据包

现在使用``tcpdump``来捕获数据包:

sudo tcpdump -i any -X udp portrange 7401-7500

典型的数据包如下所示:

21:18:14.531102 IP localhost.54869 > localhost.7415: UDP, length 328

0x0000: 4500 0164 bb42 4000 4011 8044 7f00 0001 E..d.B@.@..D…. 0x0010: 7f00 0001 d655 1cf7 0150 ff63 5254 5053 …..U…P.cRTPS 0x0020: 0203 010f daf7 10ce d977 449b bb33 f04a ………wD..3.J 0x0030: 3301 1400 0000 0003 492a 6066 8603 cdb5 3…….I*`f…. 0x0040: 9df6 5da6 8402 2136 0c01 1400 0000 0000 ..]…!6…….. 0x0050: 0203 010f daf7 10ce d977 449b bb33 f04a ………wD..3.J … 0x0130: 7905 d390 3201 1400 3ae5 0b60 3906 967e y…2…:..`9..~ 0x0140: 5b17 fd42 de95 54b9 0000 0000 3401 1400 [..B..T…..4… 0x0150: 42ae f04d 0559 84c5 7116 1c51 91ba 3799 B..M.Y..q..Q..7. 0x0160: 0000 0000 ….

此 RTPS 数据包中的数据全部加密。

除了此数据包之外,您还应该看到带有节点和 enclave 名称的其他数据包;这些数据包支持其他 ROS 功能,例如参数和服务。 这些数据包的加密选项也可以由安全策略控制。