关于Linux 下的错误路由产生火星包的问题

2023-05-16

关于linux下的错误路由产生火星包的问题

错误原理

linux 下的route表,不仅负责包的转发路径选择,还负责检验包的来源的合理性,比如
# ip r
default via 10.0.2.2 dev enp0s3 proto static metric 100
default via 192.168.1.1 dev enp0s8 proto static metric 101
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100
192.168.1.0/24 dev enp0s8 proto kernel scope link src 192.168.1.200 metric 100

第四条路由表示192.168.1.0/24 网段的包需要从enp0s8 网卡的 192.168.1.200 这个接口出去,那么根据路由的双向性:192.168.1.0/24网段的包也只能从上面的接口进来。那么如果192.168.1.0网段的包从别的网络接口进来会被linux 内核直接抛弃,tcpdump抓不到任何信息。

错误重现

物理机ip 192.168.1.217
虚拟机ip 192.168.1.200 (桥接模式和主机同一网段),桥接网卡enp0s8
虚拟机路由表

default via 10.0.2.2 dev enp0s3 proto static metric 100
default via 192.168.1.1 dev enp0s8 proto static metric 101
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100
192.168.1.0/24 dev enp0s8 proto kernel scope link src 192.168.1.200 metric 100

此时 物理机可ping通虚拟机

` C:\Users\Administrator.PC–20130915MGW>ping 192.168.1.200

正在 Ping 192.168.1.200 具有 32 字节的数据:
来自 192.168.1.200 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.1.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.200 的回复: 字节=32 时间<1ms TTL=64`

在 虚拟机的enp0s8 端口抓包可以看到从物理机过来的ICMP报文
tcpdump -i enp0s8 src host 192.168.1.200
03:34:39.649050 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:34:39.650075 IP 192.168.1.217 > 192.168.1.200: ICMP echo request, id 1, seq 11, length 40
03:34:40.653015 IP 192.168.1.217 > 192.168.1.200: ICMP echo request, id 1, seq 12, length 40
03:34:41.661146 IP 192.168.1.217 > 192.168.1.200: ICMP echo request, id 1, seq 13, length 40
03:34:42.669583 IP 192.168.1.217 > 192.168.1.200: ICMP echo request, id 1, seq 14, length 40

现在在虚拟机上添加新的网桥

[root@localhost ~]# brctl addbr newbr
[root@localhost ~]# ip addr add dev newbr 192.168.1.122/24
[root@localhost ~]# ip link set dev newbr up
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:de:0e:0e brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 84942sec preferred_lft 84942sec
inet6 fe80::a00:27ff:fede:e0e/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:d9:8b:cf brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/24 brd 192.168.1.255 scope global dynamic enp0s8
valid_lft 84954sec preferred_lft 84954sec
inet6 fe80::a00:27ff:fed9:8bcf/64 scope link
valid_lft forever preferred_lft forever
5: newbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether c2:40:fe:38:8b:83 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.122/24 scope global newbr
valid_lft forever preferred_lft forever
inet6 fe80::c040:feff:fe38:8b83/64 scope link
valid_lft forever preferred_lft forever

linux会自动添加新的路由信息
[root@localhost ~]# ip r
default via 10.0.2.2 dev enp0s3 proto static metric 100
default via 192.168.1.1 dev enp0s8 proto static metric 101
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100
192.168.1.0/24 dev newbr proto kernel scope link src 192.168.1.122
192.168.1.0/24 dev enp0s8 proto kernel scope link src 192.168.1.200 metric 100

此时路由包信息表示192.168.1.0/24 网段的包会从newbr的192.168.1.122接口进来,因为路由表示从上往下匹配的。
此时从物理机ping虚拟机
虚拟机的tcpdump信息,没有抓到ICMP报文,只有arp报文
[root@localhost ~]# tcpdump -i enp0s8 src host 192.168.1.217
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 65535 bytes
03:48:41.059625 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:41.834576 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:42.834913 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:43.843778 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:44.835582 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:45.836889 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:46.843927 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:47.837329 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:48.838204 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:49.845249 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:50.839235 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46
03:48:51.838971 ARP, Request who-has 192.168.1.200 tell 192.168.1.217, length 46

物理机ping不通虚拟机

C:\Users\Administrator.PC--20130915MGW>ping 192.168.1.200
正在 Ping 192.168.1.200 具有 32 字节的数据:
来自 192.168.1.217 的回复: 无法访问目标主机。
来自 192.168.1.217 的回复: 无法访问目标主机。
来自 192.168.1.217 的回复: 无法访问目标主机。
来自 192.168.1.217 的回复: 无法访问目标主机。
192.168.1.200 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失)

打开ipv4的log
echo 1 >> /proc/sys/net/ipv4/conf/all/log_martians
查看dmesg信息
[ 2348.008659] IPv4: martian source 192.168.1.200 from 192.168.1.217, on dev enp0s8
可以看到有从物理机过来的包发到了enp0s8的192.168.1.217这个网络接口,但tcpdump抓不到,原因是被内核丢掉了。至于可以抓到arp包的原因是arp是二层的协议的帧不归路由信息管。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Linux 下的错误路由产生火星包的问题 的相关文章

  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • Linux 中的电源管理通知

    在基于 Linux 的系统中 我们可以使用哪些方法 最简单的方法 来获取电源状态更改的通知 例如 当计算机进入睡眠 休眠状态等时 我需要这个主要是为了在睡眠前保留某些状态 当然 在计算机唤醒后恢复该状态 您只需配置即可获得所有这些事件acp
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 如何在我的 AWS EC2 实例上安装特定字体?

    我有一个在 AWS EC2 Amazon Linux Elastic Beanstalk 实例上运行的 Python 应用程序 该实例需要某些特定字体才能生成输出 并且想知道如何在部署或实例启动过程中安装它们 我的代码在本地计算机 OS X
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron

随机推荐

  • 开源软件Asterisk:386变身交换机

    有关开源软件最令人激动的事情之一就是其创建超越传统的IT基础架构的应用程序的方式 一个恰当的例子是称作 Asterisk 的电话应用程序 Asterisk是一种功能非常齐全的应用程序 xff0c 提供了许多电信功能 也许它最著名的应用是当作
  • 2016.9---2017.1半年总,外派工作的感觉真爽 (补17年1月)

    16年8月份 xff0c 第二版订餐系统上线 xff0c 我就着手出去上班 xff0c 8月初提交简历后 xff0c 面试就一发不可收 xff0c 一直到12月初才出去 xff0c 历时四个月 xff0c 期间边学习边面试 xff0c 但这
  • gerrit - first commit

    最近公司有新项目 xff0c 已经让领导帮我把clone和push的权限都开通了 xff0c 但是在push的时候还是提交失败 xff0c 错误信息如下 xff1a git push origin master Counting objec
  • AutoML领域的一把利器---HyperGBM

    AutoML领域的一把利器 HyperGBM 文章目录 AutoML领域的一把利器 HyperGBM 前言一 何为AutoML xff1f 二 如何使用HyperGBM1 引入库2 读入数据3 初始化make experiment4 调用m
  • AutoML工具之HyperGBM介绍

    HyperGBM介绍 本文章主要是对autoML开源框架HyperGBM的一个介绍 文章目录 HyperGBM介绍一 关于HyperGBM二 功能特性总览二 如何安装HyperGBM三 HyperGBM入门样例1 准备数据集2 创建实验并进
  • HyperGBM如何定义autoML的搜索空间

    HyperGBM学习笔记之如何定义autoML搜索空间 文章目录 HyperGBM学习笔记之如何定义autoML搜索空间前言一 入门篇1 定义需求2 需求解析 二 进阶篇1 定义参数的搜索范围2 构建autoML伪代码3 HyperGBM定
  • HyperGBM之进化搜索算法

    HyperGBM学习笔记之进化搜索算法 文章目录 HyperGBM学习笔记之进化搜索算法一 什么是进化搜索算法 xff1f 二 HyperGBM中的变异算法实现1 构建进化搜索实例2 变异算法实现3 进化搜索算法整体流程 三 HyperGB
  • 机器学习之如何处理缺失值(missing value)

    机器学习之如何处理缺失值 备注 xff1a 本次数据来源于kaggle xff0c 详情请戳here xff0c 原文参考连接 xff0c 请戳here xff0c 本文篇幅较长 xff0c 旨在多介绍EDA过程中的一些思想和细节 文章目录
  • 机器学习中的早停策略

    前言 在做机器学习模型调优的时候 xff0c 往往会通过一系列的操作去提升调优效率 xff0c 其中有一种技术就是合理运用早停策略 关于数据集 xff1a 本文直接使用kaggle的数据集 xff0c 你可以直接点击链接下载 一 入门 1
  • 机器学习中如何处理非数值型的特征

    前言 传统的机器算法一般处理的是结构化数据 xff0c 而结构化数据中往往包含以下几种类别 xff1a 传统的机器学习算法 SVM xff0c LR xff0c lightgbm xff0c xgboost等 结构化数据类别 Categor
  • automl中如何提升搜索效率

    前言 automl 简单来说 xff0c 就是将机器学习应用于现实问题的端到端流程自动化的过程 xff0c 其产生的主要原因就是因为机器学习的应用需要大量的人工干预 xff0c 这些人工干预表现在 xff1a 特征分析 模型选择 参数调节等
  • Linux操作系统下搭建VNC远程控制软件详尽教程

    摘自 xff1a http os 51cto com art 200802 65589 htm VNC简介 xff1a 虽然VNC 还有着在Linux下无法按热键呼出中文输入等等小小不足 xff0c 但仍然无法阻止其在Linux系统中的地位
  • automl工具入门介绍

    前言 自动化机器学习已经被广泛应用于各种 跨 业务场景的模型构建 xff0c 实验以及生产部署当中 automl领域中有各种各样的开源项目可以直接使用 xff0c 本篇文章尝试对一些主流的开源框架进行介绍 autogluon hypergb
  • Ensemble算法之GreedyEnsemble

    前言 我们常说三个臭皮匠顶个诸葛亮 xff0c 在机器学习领域中将这个理念应用到极致的技术是boosting xff0c 将N多的弱分类器组合到一起 xff0c 达到一个强分类器的效果 xff0c 主流代表的算法就是xgboost xff0
  • Hadoop URL数据读取操作

    hadoop可以从命令行上使用hadoop fs command 来读取文件系统中的文件 同时也可以使用java接口来实现这些功能 刚写好了一个权威指南上的例子 xff0c 附上代码 xff1a package baseOperation
  • ubuntu更改默认启动项顺序

    ubuntu更改默认启动项顺序 因为经常需要在ubuntu下调试openstack代码 xff0c 在windows下用虚拟机又会严重影响使用性能 xff0c 所以干脆将笔记本装了windows 43 ubuntu双系统 xff0c 曾多次
  • tensorflow学习笔记(十九):分布式Tensorflow

    最近在学习怎么分布式Tensorflow训练深度学习模型 看官网教程看的云里雾里 最终结合着其它资料 终于对分布式Tensorflow有了些初步了解 gRPC google remote procedure call 分布式Tensorfl
  • gcc安装教程(windows版本)

    windows下的gcc有两个版本mingw和cygwin xff0c 二选一就好 已学会C 43 43 xff0c 做工程 xff0c 建议用mingw 用cygwin编译后的二进制码在别人机器上用不了 xff0c 因为其他人的机器没有c
  • 华为以太网链路聚合Eth-Trunk实验

    链路聚合Eth Trunk 什么是链路聚合 xff1f 原理基本术语聚合模式负载分担的逐流转发和逐包转发负载分担的延伸链路聚合实验一 手工聚合链路聚合实验二 LACP STATIC聚合链路聚合实验的疑问思考补充 xff0c 三层Eth Tr
  • 关于Linux 下的错误路由产生火星包的问题

    关于linux下的错误路由产生火星包的问题 错误原理 linux 下的route表 xff0c 不仅负责包的转发路径选择 xff0c 还负责检验包的来源的合理性 xff0c 比如 ip r default via 10 0 2 2 dev