Ubuntu下指令-查看端口的占用情况以及抓包

来源:互联网 发布:瞩目视频会议软件下载 编辑:程序博客网 时间:2024/05/21 09:10


linux下可以通过netstat来查看某个端口的占用情况。但是笔者今天看到别人用指令抓取报文数据,并打印。之前只知道wireshark可以抓取,哪知,linux已经集成此功能。好吧,笔者果然孤陋寡闻了。

先来列举下,笔者的目标

1 通过netstat,查询某个特定端口的使用情况,查询结果中包含某个关键字的记录

2 通过linux的命令,抓取报文,并以16进制的方式打印出来。


1 netstat

关于netstat,笔者也在网上找了找,整理了一下对我有用的指令:

-a 显示所有项,我一般用netstat必跟-a

-n 将能显示成数字的显示成数字,比如 Local Address,若不使用-n,有可能显示的是你的机器名;但使用-n,则显示的是127.0.0.1

-t 显示所有tcp的

-u 显示所有udp的

-p 显示程序名以及pid


笔者使用的是ubuntu,直接使用netstat,会显示两端内容,前面这一段是我需要,后面还有一大段内容,网上有说是linux内部端口,据说传输的效率高一倍,笔者并没有验证过。

netstat > 1.txt

以下为1.txt的内容(部分内容,后面unix的那一段实在太多了)

激活Internet连接 (w/o 服务器)Proto Recv-Q Send-Q Local Address           Foreign Address         State      tcp        0      0 192.168.0.110:53462     192.168.0.1:netbios-ssn ESTABLISHEDtcp        0      0 192.168.0.110:40288     a184-50-91-58.dep:https ESTABLISHEDtcp        0      0 192.168.0.110:33104     101.201.173.115:http    ESTABLISHEDtcp6      32      0 [未知]:39838          a184-50-91-58.dep:https CLOSE_WAIT 活跃的UNIX域套接字 (w/o 服务器)Proto RefCnt Flags       Type       State         I-Node   路径unix  2      [ ]         数据报                20915    /run/user/1000/systemd/notifyunix  3      [ ]         数据报                13090    /run/systemd/notifyunix  2      [ ]         数据报                13095    /run/systemd/journal/syslogunix  17     [ ]         数据报                13096    /run/systemd/journal/dev-logunix  7      [ ]         数据报                13110    /run/systemd/journal/socketunix  3      [ ]         流        已连接     1578283  unix  3      [ ]         流        已连接     1577660  unix  3      [ ]         流        已连接     15666    /run/systemd/journal/stdout


well,现在笔者暂时用不到unix域套接字这一块儿,那么暂时忽略掉吧。

好了,那么对于笔者而言,经常要差udp和tcp的端口占用情况,那么以下两条命令是我最常用的

netstat -antp 和netstat -anup

那么有没有什么办法tcp和udp的一起查呢,当然有,那就是

netstat -anutp

哈哈哈,大笑3秒

笔者用java写了一个tcpserver,代码如下:

public class TcpServer {public static void main(String[] args) {try {ServerSocket server = new ServerSocket(9001);while (true) {Socket s = server.accept();InputStream in = s.getInputStream();byte[] buffer = new byte[16];while (in.read(buffer) > 0) {System.out.println(new String(buffer));}}} catch (IOException e) {e.printStackTrace();}}}

不用纠结为啥要这么写,我仅仅是为了,占用端口9001而已,然后运行程序

执行netstat -antp


确实,有了对9001端口的监听,且监听类型为tcp6,状态为LISTEN,不过,这个 ::::9001看起来似乎有点奇怪

首先,tcp6是个什么鬼,还有就是这种ip地址,又是个什么鬼。看长相,大概是ipv6吧。

那么,笔者将serversocket的代码改为:

ServerSocket server = new ServerSocket();server.bind(new InetSocketAddress("127.0.0.1", 9002));
然后运行程序,再执行 netstat -anutp:


至少,ip地址这回正常了吧。


ok,那么在实际的操作中,我可能会有一个需求,要查询对9002端口的使用情况:

netstat -anutp|grep 9002

well done,至此,netstat已经能解决笔者现阶段碰到的所有问题了。


2 通过linux的命令,抓取报文,并以16进制的方式打印出来。

大名鼎鼎的tcpdump.炸一看,似乎tcpdump只能抓tcp的包,hehe,其实不是,他也可以抓udp的包的。

###tcpdump


可以看到的是,我并没有权限,切换下用户,然后在#tcpdump会看到一堆东西,笔者表示看不懂

查看版本号###tcpdump -h



如果,tcpdump没有按住那该的话,可以去搜索下是如何安装的,笔者这里就不详述了。


笔者的目的是,监听刚刚作为服务器的9002端口的数据。

嘿嘿:

tcpdump -i any -nn  ‘port’  -nn 'port 9002' -vv -X



ok,这就是我想要的,我监听了9002端口,监听到收到的数据的hello world,同时也看到从9002端口发送到56564端口的响应包。

哦,值得一说的是,为什么我的serversocket可以收到helloworld呢,因为,我写了一个socketclient,往9002上不断的发hello world。

socketclient:

public class TcpClient {public static void main(String[] args) {try {Socket s = new Socket("localhost", 9002);OutputStream out = s.getOutputStream();while (true) {out.write("hello world".getBytes());out.flush();try {Thread.sleep(10 * 1000l);} catch (InterruptedException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}}

好了,最后来解释下命令   tcpdump -i any  -nn 'port 9002' -vv -X

-i interface,网卡的名称,后面可以跟具体的网卡名称(ifconfig后者tcpdump -D)获取,笔者的电脑上看到any,似乎是指所有的网卡

-nn 监听host或者port名,这个网上解释有一大堆,什么src host,dist host  ,比如我要抓,ip地址为127.0.0.1,端口为9002的服务器的数据包,那么命令可以写成-nn 'src host 127.0.0.1 and port 9002'.不过实际来讲,端口肯定是被一个ip地址使用的,而且对于我来说,服务器抓包比较有意义,所以,其实有没有ip地址,似乎显得不那么重要,有端口就可以。

-vv 详细信息

-X 以16进制的格式输出

小结,对于笔者而言,死记上述命令即可。


收工。





0 0
原创粉丝点击