您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.
检查网络流量
目标 捕捉并检查原始 ROS 2 网络流量。
辅导水平: 高级
时间 20 分钟
概述
ROS 2 通信安全的核心是保护节点之间的通信。之前的教程启用了安全功能,但如何才能 的确 分辨流量是否被加密?在本教程中,我们将通过捕捉实时网络流量来显示加密和未加密流量之间的区别。
备注
rmw_fastrtps_cpp
用途 共享内存传输 默认情况下,当端点在同一主机系统中时,该功能可提高传输层的性能。安全飞地仍然适用,数据将被加密。但是,由于数据不在网络接口上,因此无法捕获实时网络流量。如果使用 rmw_fastrtps_cpp
因此,您需要通过本教程,在发布者和订阅者之间使用不同的主机系统,或者使用 启用 UDP 传输 和 如何设置 Fast-DDS XML 配置.
先决条件
本指南仅在 Linux 上运行,并假定您已经 安装了 ROS 2.
运行演示
安装 tcpdump
在新的终端窗口中安装 tcpdump是一款用于捕获和显示网络流量的命令行工具。尽管本教程介绍了 tcpdump
命令,也可以使用 Wireshark是一个类似的图形工具,用于捕捉和分析流量。
苏都 适切 更新 sudo 适切 安装 tcpdump
在一台机器上通过多个 ssh
会议。
开始谈话者和倾听者
再次启动通话者和监听者,各自在自己的终端中运行。未设置安全环境变量,因此这些会话无法启用安全功能。
# 禁用两个终端的 ROS 安全性
未设置 ros_security_enable
# 在终端 1:
玫瑰2 运行 演示节点 话匣子 --ros-args --飞地 /talker_listener/talker
# 在 2 号终端:
玫瑰2 运行 演示节点 听众 --ros-args --飞地 /talker_listener/listener
显示未加密的发现数据包
在通话者和监听者运行的情况下,打开另一个终端并启动 tcpdump
来查看网络流量。您需要使用 苏都
因为读取原始网络流量属于特权操作。
下面的命令使用 -X
选项打印数据包内容,而 -i
选项来监听任何接口上的数据包,并且只捕获 UDP 端口 7400 的流量。
苏都 tcpdump -X -i 任何 udp 港 7400
您应该会看到类似下面的数据包:
20:18:04.400770 IP 8_xterm.46392 > 239.255.0.1.7400: UDP,长度 252 0x0000: 4500 0118 d48b 4000 0111 7399 c0a8 8007 [email protected]: 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
)和飞地(也 /talker_listener/talker
) 是以纯文本形式传递的。您还可以从 听众
节点。典型发现数据包的其他一些特征:
目标地址为 239.255.0.1,这是一个组播 IP 地址;ROS 2 默认使用组播流量进行发现。
UDP 7400 是目标端口,根据 DDS-RTPS 规范.
数据包包含 "RTPS "标签,也是 DDS-RTPS 规范所定义的。
显示未加密的数据包
使用 tcpdump
通过过滤 7400 以上的 UDP 端口来捕获非发现 RTPS 数据包:
苏都 tcpdump -i 任何 -X udp ((((((((()))))) 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 地址和目标 IP 地址为
本地主机
:由于两个节点都在同一台机器上运行,因此节点之间会在本地主机
界面
启用加密
停止通话者和监听者节点。通过设置安全环境变量为两者启用加密,然后再次运行它们。
# 在终端 1:
出口 ros_security_keystore=~/sros2_demo/demo_keystore
出口 ros_security_enable=真
出口 安全战略=执行 ros2 运行 演示节点 话匣子 --ros-args --飞地 /talker_listener/talker
# 在 2 号终端:
出口 ros_security_keystore=~/sros2_demo/demo_keystore
出口 ros_security_enable=真
出口 安全战略=执行 ros2 运行 演示节点 听众 --ros-args --飞地 /talker_listener/listener
显示加密的发现数据包
运行相同的 tcpdump
命令来检查启用加密后的发现流量输出:
苏都 tcpdump -X -i 任何 udp 港 7400
典型的发现数据包大致如下:
21:09:07.336617 IP 8_xterm.60409 > 239.255.0.1.7400: UDP,长度 596 0x0000: 4500 0270 c2f6 4000 0111 83d6 c0a8 8007 [email protected]: 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 A-SHA256........0x0260:0510 0800 0700 0080 0600 0080 0100 0000 ................
这个数据包要大得多,其中包含的信息可用于在 ROS 节点间设置加密。我们很快就会看到,这实际上包括了我们启用安全功能时创建的一些安全配置文件。想了解更多信息?请阅读优秀论文 安全 DDS 系统的网络侦察和漏洞挖掘 来理解为什么这很重要。
显示加密数据包
现在使用 tcpdump
来捕获数据包:
苏都 tcpdump -i 任何 -X udp ((((((((()))))) 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@[email protected]: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 数据包中的数据全部经过加密。
除了这个数据包外,你还会看到带有节点和飞地名称的其他数据包;这些数据包支持参数和服务等其他 ROS 功能。这些数据包的加密选项也可由安全策略控制。