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进制的格式输出
小结,对于笔者而言,死记上述命令即可。
收工。