linux间网络通信无界面实时抓包、分析以及文件同步

这周四、五趁着工作间隙以及加班折腾了两天,实现了wireshark远程实时抓包和显示,以及两个linux之间文件同步。也许没多难,又或者有更好的办法,但是我折腾了好久,觉得可以记录下。

一、 背景

  现在都基本都是以linux上的开发为主,然后日常开发环境在部门的两台服务器(都是ubuntu)上,但是主要还是在一台服务器上,因为我本身暂时是以网络相关的开发为主,这就避免不了的需要抓包分析,报文交互基本上能够分析出问题所在。我是远程ssh登录来做日常开发工作,如果使用tcpdump来抓包分析,一个是不是特别的直观,还有就是灵活性不是特别够,要是直接在屏幕上显示,根据不同的需求,需要一直改命令,wireshark的强大我就不介绍了,所以就想着能够使用远程或者本地来使用wireshark来分析报文。如下图所示,是我实际工作网络拓扑示意图,

工作网络拓扑

  上面提到了主要是在一台服务器完成开发,但是有时候跑client/server时,还是要在两台电脑通过物理网络通道测试一下。这就涉及到了在两台电脑同步开发的问题,就会涉及到文件同步的问题。

二、解决方案

  工欲善其事必先利其器,所以针对前面提到痛点,还是想解决点,想了不少解决思路,并且都进行了尝试,针对失败的问题进行了分析。

1. 网络抓包

  针对网络抓包,分别尝试了:

  1. 在我的个人工作电脑上,使用远程桌面,服务器的ubuntu上安装上linux版的wireshark,这样我就可以实时对着报文分析了。但是失败了。
  2. 将我的个人pc连接到上图中的交换机上,wireshark使用混杂模式将交换机上的所有报文都抓到,再通过过滤,过滤(显示过滤和抓包过滤)掉不必要的报文。结果失败
  3. 使用wireshark上的远程抓包。结果成功

最终只有方法3成功了,但是却是我最后想到的,下面将稍微展开的分析下每个方法,我觉得后续有时间,都是能够成功的。

1). 远程桌面

  针对远程桌面这种办法,一开始用的是VNC,其中xfor4是最能满足我的需求,因为我们的服务器上并没有外接显示器,这样就会有一个弊端,如果我将桌面输出到xfore4上去了,后面服务器即使外接了显示器也会没用,这就给别人带来不便利。咱也不能干这样损人利己的事,在简单的挣扎后(其实不简单,尝试了好多种办法),还是放弃了这样做。想要实现远程桌面的同志可以参考下这篇文章,使用RealVNC连接无外接显示器的Ubuntu18.04,这篇文章还是亲测有用的。
  后面又试了下,teamviewer,能够连接上,但是不显示桌面,通过查资料,基本上可以判定,是需要外接显示器的。
  经过上述折腾后,果断放弃了这个方法。

2). 将pc直接连接到交换机上

  之前我调试网络时,都是自己的电脑通过网线接到交换机上,剩余其他的网络终端都连接到交换机,这样我就能从我的电脑上抓到所有的报文,简单方便、快捷,所以我这次我也想这样。正好我有两个笔记本,我可以将我的其中一个笔记本电脑1通过网线接入到交换机上,然后另一个笔记本2远程笔记本1,达到我的想法。如下图所示:

双电脑方案

然而理想很丰满,现实很残酷,部门小组里的交换机虽然跟我以前一样是个二层交换机,但是上图的my_pc1并没有能够抓到server1和server2的网络报文,搜过官网,找过淘宝,聊过京东,依然没有找到答案。后面还以为wireshark没开混杂模式,最后发现也不是这个原因。没有解决这个问题,总觉心里有根刺,后面找交换机资料时,才得到答案,现在的交换机变聪明了,如果不是发给你的报文,mac就给你过滤掉了,并且这个交换机还不支持配置成混杂模式。欲哭无泪~~~。
  曾经沧海难为水,经历过以前交换机的便利,咋能容忍这种拉低工作效率的存在。果断买网线买交互机,后面直接从我的电脑网口怼到交换机上。

3). wireshark远程抓包

  虽然经历上面两个方法的失败,但是心里还是挂念着,最终于在使用wireshark捕获时,突然看到有一个远程接口,技术敏感告诉我,问题应该得到解决了,一阵baidu/google后,终于成功的远程抓到了两个服务器的网络报文了。如下图所示:

windows wireshark远程抓包

想要达到上述效果,首先需要在windows wireshark上在管理接口/远程接口上添加远程设备,如下图所示:
远程接口

想要实现windows 环境下wireshark远程抓包,需要在服务器端linux上另外安装rpcap来做server(tcpdump相关的自然是需要的)。
关于安装rpcap,直接参考github仓库上的教程即可,如下图所示:
rpcap build and use

ubuntu16上的一些问题

  上述操作,我都是在ubuntu18上操作的,一切都很顺利。但是我后面在ubuntu16上就又遇到一些问题了,首先是可能会使用sudo apt-get build-dep libpcap这个命令下载不下来东西,因为缺少URL sources.list,解决办法, 一个是在sources.list中添加上,但是服务器并不是我一个人用,所以我选择的是第二种办法,git clone https://github.com/rpcapd-linux/rpcapd-linux,然后按上图的办法来编译出libpcap。
  此时依然有可能出问题,那就是会出现如下错误:

yacc -d grammar.y
make: yacc: Command not found
Makefile:365: recipe for target 'grammar.c' failed
make: *** [grammar.c] Error 127

  这是缺少依赖项,flex,只需执行sudo apt-get install flex bison,安装上依赖项。如上图所示就能个很顺利的安装好rpcap了。

使用

针对使用,其实也蛮简单的,sudo ./rpcapd -4 -n -p [your port] -deamon,端口的就是自己自定义的,后面在wireshark上需要输入,比如我我设置的是55555,如下图所示。另外最好将rpcapd设置成开机自启动了,因为万一服务器重启了,你还要手动开启rpcapd,岂不是很low。所以实现一个脚,并将该脚本设为开机启动,这样就不用担心前面提到的问题了。如下所示:

```run_rpcapd.sh
#run_rpcapd.sh
#! /bin/sh

command content

echo 'xxx' | sudo /home/jinbao/software/rpcapd-linux/rpcapd -4 -n -p 8888
exit 0

  由于windows电脑略有反应迟钝,主要是以mac为主,想着还是用mac端的wireshark也实现远程抓包,发现mac上的wireshark没有**远程接口**这个东西了(我的是m1 macbookpro)。但是一顿摸索后,发现有这个**SSH remote capture: sshdump**,如下图所示,意思也很明显了,剩下就交给baidu/google了。![mac wireshark](/medias/linux-develop-tips/mac_wireshark.png)
但是一顿操作下来,发现不是报这个错![can't find ..](/medias/linux-develop-tips/mac_wireshark_cannotfind.png)
就是报权限不够的错误,类似下图这个错误:![permission invalid](/medias/linux-develop-tips/mac_wireshark_permission.png)
由于任务紧张,只能暂且搁置折腾了,等后面在试试了咯。暂时先用windows实时抓包用着了呗。
··························更新于7.22······························
  优秀的同事帮我找到原因,并且不需要rpcap就能抓包,原来linux默认没有开启``PermitRootLogin``,知道原因后,操作就简单了。执行如下操作:
```sh
cd /etc/ssh/
vim/vi sshd_config

#找到PermitRootLogin,注释掉这一行
#添加
PermitRootLogin yes
sudo service sshd restart 

然后如下图点开设置,配上ip和端口。

ssh remote capture

最后在如下图中Authentication中输入root用户名和密码或者使用密钥,建议使用密钥,因为使用密码,他每次不会保存。
authentication config

4). 拓展

  远程抓包在linux嵌入式开发中,也能提供很大的帮助。这样调试网络相关时,就不用将pcap包来回拷贝了;更不用担心ecu重启而导致tcpdump抓的包不全了。另外远程抓包,再加上ssh或者iptables的转发(打洞),可玩就更多了,可以直接透过之间的服务器或者pc直接抓到终端ECU的网络报文。

2. 文件同步

  文件同步,我们用的比较多的有系统(windows、mac os)自带的局域网同步,或者onedriver这样的云同步。但是在linux上我只想针对某些文件进行网络同步即可,用onedriver除了有可能违反公司安全规定外,未免也太大材小用了,所以就考虑其他方案。
1. 通过git。需要不停的add, commit, push, pull,太繁琐,pass
2. scp,会出现全部拷贝,不能增量拷贝,多了之后,效率特别低,对磁盘也是频繁读写,pass
3. rsync_inotify,实时、增量同步,amazing。如下图:

文件同步
  针对这个方案,我主要参考了这篇文章实现rsync+inotify 实时同步文件,但是对着这篇文章,我没有成功,再结合这篇文章把rsync错误报告说清楚,就基本把问题解决了,当然过程还是挺不容易的,因为都是网上搜索+自己摸索的,暂时也就不去记录了,如果小伙伴有疑问,可以在评论区留言,基本能够保证短时间内收到评论。
  最终我没用inotify来实时同步,但是亲测是可行的,因为我怕其他同事也要同步,会影响他们,不过我通过设置命令行别名的方式alias sync_xxxx='xxxxx',就能一个命令同步过去了。如下图所示,我能在意位置直接就rsync_BWG就能将我事先配置的文件同步过去。

alias rsync

同步时忽略某些文件或者文件夹
  在同步时,有时我们并不需要将所有文件同步过去。

BGW
uds-component

上述俩图,ironman-imx8-buildroot.vscode我就不想同步过去,此时我就可以通过--exclude这个option来达到目的,文件是使用相对路径哦。示例如下图:
use --exclude

三、写在最后

  虽然说工欲善其事必先利其器,但是关键的是还需要平衡利弊,如果改进一点效率反而会浪费你更多的时间,我觉得反而是得不偿失的。不过,要是利用自己玩手机刷剧的时间,用来去折腾这个技术,我觉得是值当的,因为表面是折腾这一项,拔出萝卜带出泥,遇到问题了,想解决,基本上会涉及到很多知识面,针对我这种还需大量学习的人说,简直是成长的兴奋剂。以前玩单片机时,就各种折腾windows系统;后面因为linux上有很多可以折腾的,所以我就转到了linux开发,有兴趣可以参考下我是如何从MCU开发转到linux开发,不过当前(2021.06.07 02:13)未完成。

  针对上面有些地方不够详细,可以评论区留言

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇