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 ESTABLISHED
tcp        0      0 192.168.0.110:40288     a184-50-91-58.dep:https ESTABLISHED
tcp        0      0 192.168.0.110:33104     101.201.173.115:http    ESTABLISHED
tcp6      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/notify
unix  3      [ ]         数据报                13090    /run/systemd/notify
unix  2      [ ]         数据报                13095    /run/systemd/journal/syslog
unix  17     [ ]         数据报                13096    /run/systemd/journal/dev-log
unix  7      [ ]         数据报                13110    /run/systemd/journal/socket
unix  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进制的格式输出

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


收工。





GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐