在虚拟机上进行编译和执行,得到的结果源地址IP和目的地址IP是一样的,网络用的桥接模式。
在user程序中进行对百度的ping操作。而且监控网口改成了我自己的网口。
但是得到的就有我虚拟机的地址,socket源和目的地址都是。
这是负责储存信息的结构体,在map中作为键key。
这是给结构体中源和目标地址赋值的操作函数部分。
这是map,值为包的数量和大小的结构体。
这是user态的输出。
像是端口,协议号,包数和数据大小都能正常输出,就是这个源地址和目的地址是一样的。
然后我把源和目的地址改成定值1和2.
输出就是1和2,感觉这是对的(没有ping百度,是连接的vscode,走22端口)
然后我又去看了这个struct sk_buff的偏移量,确实也是不一样的,源地址n1的偏移量26,目的地址n2的偏移量30,理应得到两个不同的内容才对。
这俩load_word函数得到的理应是不同的值才对。但输出的确实是同一个值。
但输出就是一样的,就怀疑是struct sk_buff结构体里面填充的源和目的地址是一样的。
这个程序就是源码目录下/samples/bpf/sockex3.
我不能理解为什么,也许是我没理解到程序在做什么,求救大佬指导。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的问题,虚拟机在桥接模式下进行网络通信时,源地址和目的地址相同的现象可能与以下几个方面有关。以下是详细的分析和排查步骤:
桥接模式下,虚拟机的网络接口会直接连接到宿主机的物理网络中,虚拟机在网络中表现为一个独立的设备。理论上,虚拟机的IP地址应与其所在局域网中的其他设备不同,并且能够正常与其他设备(如百度服务器)通信。
然而,如果虚拟机的网络配置存在问题,例如: - 虚拟机的IP地址未正确分配。 - 网络接口未正确绑定到桥接设备。 - 宿主机的网络配置干扰了虚拟机的通信。
这些都可能导致虚拟机的网络流量异常,包括源地址和目的地址相同的情况。
建议检查以下内容: - 确认虚拟机的IP地址是否与宿主机或其他设备冲突。 - 检查虚拟机的网络接口是否正确绑定到桥接设备。 - 使用ifconfig
或ip addr
命令查看虚拟机的网络配置,确保其IP地址、子网掩码和网关设置正确。
在执行ping
操作时,虚拟机会向目标地址(如百度服务器)发送ICMP请求包,并接收目标地址返回的ICMP响应包。正常情况下,ICMP请求包的源地址是虚拟机的IP地址,目的地址是目标服务器的IP地址。
如果源地址和目的地址相同,可能是以下原因导致: - 网络回环问题:虚拟机的网络流量被错误地路由回自身,而不是发送到目标地址。这可能是因为路由表配置错误或防火墙规则限制了流量的正常转发。 - DNS解析问题:如果ping
的目标地址是域名(如www.baidu.com
),而DNS解析失败或返回了错误的IP地址,可能会导致虚拟机尝试与自身通信。
建议检查以下内容: - 使用route -n
命令查看虚拟机的路由表,确认默认网关是否正确配置。 - 使用nslookup
或dig
命令检查目标域名的解析结果,确保解析到正确的IP地址。 - 检查虚拟机的安全组或防火墙规则,确保允许ICMP流量通过。
struct sk_buff
结构体的偏移量问题您提到struct sk_buff
结构体中源地址和目的地址的偏移量分别为26和30,理论上应该对应不同的值。然而,实际输出中两者相同,这可能与以下因素有关: - 数据填充问题:某些编译器或内核版本可能会对结构体进行内存对齐,导致偏移量的实际位置与预期不符。 - 指针操作错误:如果load_word
函数的实现存在错误,可能会导致读取到相同的值。 - 网络协议栈问题:如果虚拟机的网络协议栈未正确处理ICMP请求包,可能会导致源地址和目的地址字段被错误地填充。
建议检查以下内容: - 确认struct sk_buff
结构体的定义是否与当前内核版本一致。 - 检查load_word
函数的实现,确保其正确读取指定偏移量的数据。 - 使用调试工具(如gdb
或bpftrace
)跟踪struct sk_buff
的填充过程,确认源地址和目的地址字段的实际值。
您提到在修改源地址和目的地址为固定值(如1和2)后,输出结果正常。这表明程序的逻辑本身可能没有问题,但可能存在以下情况: - 数据捕获问题:程序可能未正确捕获网络流量,导致读取到错误的数据。 - BPF程序限制:如果使用的是eBPF程序(如sockex3
示例),可能存在某些限制或错误配置,导致无法正确处理网络流量。
建议检查以下内容: - 确认BPF程序的加载和运行环境是否正确配置。 - 检查BPF程序的过滤条件,确保其能够捕获到目标流量。 - 使用tcpdump
等工具捕获网络流量,验证虚拟机是否正常发送和接收ICMP包。
根据上述分析,建议按照以下步骤逐步排查问题: 1. 检查虚拟机的网络配置,确保IP地址、子网掩码和网关设置正确。 2. 验证目标域名的DNS解析结果,确保解析到正确的IP地址。 3. 检查虚拟机的路由表和防火墙规则,确保ICMP流量能够正常通过。 4. 确认struct sk_buff
结构体的定义和load_word
函数的实现是否正确。 5. 使用调试工具跟踪程序的运行过程,定位问题的具体原因。
如果以上步骤仍无法解决问题,建议提供更详细的日志信息(如tcpdump
捕获的流量数据、struct sk_buff
的内存布局等),以便进一步分析。
希望以上分析能够帮助您解决问题!