分类:ubuntu

udp发送ip端口发送不可达

众所周知,udp是无连接的,所以忽略udp接收方状态,是否监听对应udp端口以及ip是否存在,直接向udp发送数据,会发生什么?

为了搞清楚这个问题,我们尝试在局域网建立收发设备,然后抓包分析。

从抓包来看,udp数据正常发出。对端设备回复icmp指示端口不可达。

当我们把接收端设备关机,此时udp数据正常发出,直到arp连续三次请求失败。此时抓包显示udp包已经不发送了。

此时,我们跟踪sytem call 确定,发用户空间的sendto 接口仍然显示成功。

此时通过查看arp缓存确定ip状态已经标记为INCOMPLETE。

尝试手动更新arp缓存的mac地址和状态到REACHABLE。

此时udp又重新发了出来。

值得一提的是,在路由器查看arp缓存,发现不管设备断开多久,状态都不会变更为INCOMPLETE而始终是STALE。

一次无效的运维

这里记录一次无效的运维,称之为无效,更多的是我人为原因引起的。

1月2号阿里云提示服务器执行恶意脚本,当时正在休元旦,直接忽略。

1月4号上班的时候查看了完整提示,分析了启动上下文,确定服务器被redis恶意注入矿机脚本。能够被注入原因很简单,把无认证的redis直接暴露了在公网,因为该服务器是从其他公司过户过来,稳定运行了5年,接手后保持原来的端口安全策略也没有注意。

第一时间分析了该脚本启动脚本,发现其破坏了大量系统安全策略,同时预留了大量系统认证的后门,例如:

  • 安装矿机应用;

  • 杀死阿里云安全组件;
  • 关闭selinux,开门狗等系统安全组件;
  • 预留ssh认证公钥,预留系统系统登录账号;

而该脚本注入应该是利用redis持久化,把keys保存在了/etc/crontab,好在我们应用工作在docker,并未关闭掉阿里的安全组件,所以阿里第一时间通知我。同时,该脚本只是注入矿机执行,并没有破坏原来的系统应用,也算是盗亦有道了。

正常来说我只要按照该脚本关闭矿机启动,删除应用,恢复安全策略就行了,但是手贱顺便按照阿里提示升级了网络类型从经典网络到专有网络,噩梦就此开始。

之所以升级网络类型,是因为这前后阿里曾打电话告知,3月份之前不升级会导致网络不可用,这台机器几年不运维一次,所以干脆一劳永逸。

升级完网络类型后服务启动异常,第一时间没有定位到原因,所以直接考虑恢复快照。

第一时间提了阿里工单,但是阿里解决...

vscode 通过数据断点分析segmentation fault

通常地,程序异常,我们借助vscode在ubuntu主动调试,程序会自动在异常代码位置停下来,但是异常分析通常不会这么简单,而是一连串连锁反应。

这里尝试分析,因为程序异常,非法写入了一段正常内存,从而导致多个链路之后异常发生。而对于此问题,最常使用的调试手段就是添加数据断点。

通常直接在某段代码位置添加的代码为函数断点,程序会自动在该位置停下来。同样地,我们可以添加条件断点:

  • 当某个判断条件(例如,变量值为真)满足的时候;
  • 当某段代码连续执行N次的时候;
  • 当某个变量(内存)被读写的时候;

如上前两个条件断点,vsocde 里面的c/c++ extension 已经支持,可以在ide里面点击断点(红色小点)直接编辑,但是最后一个为数据断点还不支持。

需要借助debug console 键入gdb(gnu debugger)命令,

如上操作,成功初始化device_scan_ 成员变量后,程序不再会对变量进行写操作,但是之后该对象的一个成员变量值被异常写入了非法值,当再次用该对象指针打印日志函数时候发生异常。

此时通过p命令查看变量并获取变量首地址。

通过watch命令监控该地址的写操作。

之后全速运行,发现程序在另外一个非法访问该变量位置停了下来,并且通过 Old Value和New Value提示了值变化。

通过分析上下文就可以定位到引发异常的真正原因。

socat

http://www.dest-unreach.org/socat/

socat 是一个命令行工具,用以建立一个双向字节流交换数据。该字节流又可以被构造成不同地址类型,大量的地址选项也同样可以被作用于该流,因此socat非常强大。

filan 是一个打印文件描述符的工具,已经被重构用以调试socat,当然,也可以另做它用。

procan 是一个打印进程信息的工具,同样被重构用以调试socat。

socat 实例包含如下生命周期。

init 阶段解析命令参数,初始化日志打印;

open阶段打开第一个地址并且转发到第二个地址字节流,此阶段可能会阻塞,因此类似socks的复杂地址选项,需要在连接请求或认证对话框完成后才会开始下一阶段。

transfer阶段通过select 参数观察源地址流的读写操作,当可读或者可写时,socat完成到目的流数据转发。

当任意一方流eof,closing阶段开始,socat 主动发送eof操作到对等需要关闭的另外一方尝试优雅的关闭它的写操作的字节流,在运行的时间范围内,socat也可能会继续传输数据到另外一个方向,直到所有的通道被关闭。

命令的地址参数为用户给socat 建立字节流的必要信息。

一个地址规范通常包含一个地址类型的关键词,零或者多个地址参数通过":"间隔,零或者多个地址选项通过","间隔。

关键词指定地址类型(tcp4、open、exec),而对于一些关键字存在...

在linux 下通过vscode调试elf可执行文件

elf 是linux 下可执行可链接文件(executable and linkable format)。通过gcc/make 我们很容易编译出我们需要的elf文件,借助vscode可以在ubuntu图形化调试该程序,再也不用在gdb命令操作了。

如下是elf文件结构,包含文件头(elf header)和代码、数据区索引表(program header table、section header table)和对应代码区、数据区。

明白了如上文件结构,还需要具体解答如下疑惑。

  • 什么文件可以被调试?

    通过file命令对比可以知道用以调试的文件包含 with debug_info。

    可以被调试的文件。

  • debug 版本额外包含什么信息?

    如上可调式的elf文件中增加包含 debug_aranges、debug_info等7个section存储包含数组、文件信息、行数、字符串、宏等调试信息。

    可以通过 --debug-dump=aranges/info/abbrev/line/str/ranges/macro分别显示对应的 区信息。

  • 如何设置debug/release 版本?

    知道了用以调试的程序信息,那么如何编译对应程序的debug版本,通常来说编gcc的 -gdebug 选项和-O优化选项:

有了如上elf文件认识,接下来就是vscode debug程序了,成功编译可执行文件后,通过vscode 建立工程添...

Ubuntu wireless-ac 9560 驱动异常

重启电脑后发现wifi不能使用了,网络设置里面提示未发现网络适配器。电脑比较新,之前安装ubuntu18.10 低版本kernel 版本就发现不识别wifi设备,更新到ubuntu19.10 后正常,不过正常安装后也反复重启过使用了一段时间。

  • Detected Intel(R) Wireless-AC 9560, REV=0x354;
  • Ubuntu 19.10 5.3.0-40-generic;
  • 小米笔记本pro 15;

第一时间排查dmesg 发现有iwlwifi 内核模块报错。主动搜索报错码-110毫无头绪,电脑比较新,系统也比较新。

顺着iwlwifi提示做了以下排除。

开源homekit adk 测试

由amazon、apple、google、zigbee alliance牵头的project connected home over ip项目成立了,旨在统一智能硬件在应用层的通信协议,多年智能家居从业,从早期私有协议,再到各家所谓的data models、tls(things language specification)、物模型、miot-spec,甚是知道在上层应用的通信语言的不统一,带来的设备模型重影映射是多么繁琐。

  1. mazon’s Alexa Smart Home
  2. Apple’s HomeKit
  3. Google’s Weave
  4. Zigbee Alliance’s Dotdot data models

巧的是第二天zigbee 联盟就来公司就行了宣讲。很多人会觉得很别扭,上层的应用通信语言的统一为什么会有zigbee联盟的加入,熟悉zigbee协议的应该知道,发展了10多年的zigbee在zigbee3.0后才逐渐进入人们视野。很大程度上是得益于zigbee3.0设备的zcl revision7,基于硬件属性统一了硬件之间的通信语言,打通不同硬件厂商的设备的通信。而zcl则是zigbee 联盟的物联网统一语言规范dotdot的over zigbee应用,显然地,zigbee 并不满足于此,这一次四位大佬的相聚相信会取其大家特长,打通设备之间的网关、iot平台、应用之间的标准通信语言。

利...

在ubuntu上使用onedrive

自从使用了onedrive过后就像发现宝贝似得,跨机器自动同步文件很是方便,特别是一些正在进行调试笔记、开发文档。所以在ubuntu也马上考虑使用onedrive。

通过apt安装如下依赖工具包。

  • gcc
  • python3-dev

  • libssl-dev
  • inotify-tools
  • python3-dbus (or probably libdbus-glib-1-dev)

安装pip3和setuptools。

同时还需要手动下载ngrok,解压后导出环境变量NGROK。

成功下载依赖过后通过通过clone源码安装onedrived。

成功安装onedrived后系config统会增加onedrived和onedrived-pref 两个应用工具。

需要通过onedrived-pref配置onedrive信息,选择交互模式执行命令添加账户onedrived-pref account add。该命令会生产onedrive登录链接并提示你浏览器打开。成功打开该链接后会自动引导从Microsoft登录onedrive,成功登录后会自动跳转到空白网页,并且生成包含登录token的url,我们拷贝该url到命令输入窗口完成认证。

完成登录认证后还需要去通过 onedrived-pref drive set配置onedrive本地路径和配置文件路径...

在局域网建立.local域名

需要理解linux下面的几个概念。

主机名,默认保存在/etc/hosname,可以通过命令hostname查看和更改。

本地域名文件,配置后再本机立即生效。默认地,会设置本机hostname到hosts使之映射到127.0.0.1。同样地,局域网内也可以通过http://hostname 到该机器。

mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。在局域网中,设备和设备之前相互通信需要知道对方的ip地址的,大多数情况,设备的ip不是静态ip地址,而是通过dhcp协议动态分配的ip 地址,如何设备发现呢,就是要mdns大显身手,例如:现在物联网设备和app之间的通信,要么app通过广播,要么通过组播,发一些特定信息,感兴趣设备应答,实现局域网设备的发现,当然mdns 比这强大。

当mDNS客户端需要解析主机名时,它会发送一个IP多播查询消息,要求具有该名称的主机标识自己。然后该目标机器多播包含其IP地址的消息。然后,该子网中的所有计算机都可以使用该信息来更新其mDNS高速缓存。任何主机都可以通过发送生存时间(TTL)等于零的响应数据包来放弃其对名称...

thingsboard 开发环境建立

  • git

    版本管理工具,注意配置环境变量,保证命令窗口能够直接使用。

  • oracle jdk

  • node.js

    现在安装成功后,需要配置环境变量。保证在cmd窗口node能够直接运行,并且通过node -v 查询版本后修改thingsboa()rd 工程中的pom.xml。

  • maven

    工程是基于maven管理,直接通过idea open,之后会自动下载各种依赖包。

    C:\Users\yuren\.m2\repository

    按需设置maven镜像源,否则下载速度可能不稳定。在maven安装包目录下找到settings.xml更改,详细参考,https://developer.aliyun.com/mvn/guide

  • npm

  • idea intellj

    集成开发环境,内部集成maven。

  • docker
  • postgresql

    D:\my_project\thingsboard\dao\src\main\resources\sql

git clone 整个thingsboard 工程。

成功clone 工程后目录结构如下。

这里阐述thingboard在win下的开发环境快速建立,包含工程建立、编译、调试环境。

  • 装jdk、maven、node、git并且注意配置环境变量,确定命令能够直接运行,同时设置maven、node镜像源;
  • 通过maven编译整...