学习Python的一个方向是进行网络相关的开发,比如爬虫、网站开发、服务器运维等。这些任务都会和网络配置打交道。在实际开发过程中,熟悉使用Linux或者Windows中相关网络工具和模块,可以更快更准地实现需求或解决故障。所以今天就给大家分享几个做网络开发应知应会的几样利器。1. nc
nc,即netcat,被称为网络安全届的“瑞士军刀”。网络黑客们经常会在渗透过程中使用nc搞点事儿。它可以用来快速构建网络链接,调试客户端程序。
nc参数上案例:
执行任务 | 执行命令 |
---|
扫描机器A端口号在30-40的服务 | nc -z A 30-40 |
连接服务器A 端口号为5000 | nc -C A 5000 |
传送文件 | MachineA:nc -v -n ip portE:\a.exe |
2. ping
Ping是再常用不过的命令,用来实现对网路连通性探测。我们知道网络上机器有唯一确定的IP地址,给地方发送数据包,根据返回的信息初步判断目标机器是否存在或者目标机器操作系统等信息。
ping在具体实现中其是实使用了ICMP协议,它是一种基于IP协议的控制协议,网际控制协议,其报文的具体格式:

具体字段含义:
ping命令组装成上述的IP报文进行发送,报文目的地为ping目的地址,原地址为发送ping主机地址,然后按照ICMP的规则填写数据。
随后IP报文通过ARP协议,请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址
查看详细参数:
ping参数常用参数:
TTL
TTL 是 IP 协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃
返回值:
可能出现的情况:
对方已经关机或者根本没有这个地址
可能不在同一个网段,即使通过路由也无法找到对方从而出现超时
对方存在但是设置了防火墙过滤
与对方不在同一个网段且没有设置默认路由
网线出毛病
要么是IP地址不存在,要么是没有正确连接DNS服务器从而无法解析
3. ifconfig/ipaddr
查看服务器网卡,IP等信息
ipaddr上图中被马赛克的位置假设为 10.172.100.3,这样就是一个IP地址,凡是都有规则,IP地址按照小数点分割为四部分,每部分占8字节,所以IP地址为32位,那么这样的IP地址一共有多少呢
从而出现IPV6,128位
当时觉得32位很够用了,还将其分为5类,如下图所示
网络地址分类我们再看看各类地址的主机数量是多少:

上图中可知道C类地址太少了吧,但是B类地址又太多,怎么中和一下嘞
无类型域间选路
CIDR 地址中包含标准的32位IP地址和有关网络前缀位数的信息。比如10.172.100.3/24,IP地址斜杠后面数字24,代表24位是网络号,后面八位为主机号。
如何得到网络号?
使用IP地址和子网掩码进行AND计算得到网络号。

4. tcpdump
和它类似的工具在windows中是wireshark,其采用底层库winpcap/libpcap实现。采用了bpf过滤机制。
tcpdump知道了相关参数,下面看几个案例:
执行任务 | 执行命令 |
---|
捕获特定网口数据包 | tcpdump -i eth0 |
捕获特定个数(1000)的包 | tcpdump -c 1000 -i eth0 |
将捕获的包保存到文件 | tcpdump -w a.pcap -i eth0 |
读取pcap格式的包 | tcpdump -r a.pcap |
增加捕获包的时间戳 | tcpdump -n -ttt -i eth0 |
指定捕获包的协议类型 | tcpdump -i eth0 arp |
捕获指定端口 | tcpdump -i eth0 post 22 |
捕获特定目标ip port的包 | tcpdump -i eth0 dst address and port 22 |
捕获DNS请求和响应 | tcpdump -i eth0 -s0 port 53 |
匹配Http请求头 | tcpdump -s 0 -v -n -l | egrep -i 'POST /|GET /|Host:' |
捕获特定网口数据包 | tcpdump -i eth0 |
捕获特定个数(1000)的包 | tcpdump -c 1000 -i eth0 |
将捕获的包保存到文件 | tcpdump -w a.pcap -i eth0 |
读取pcap格式的包 | tcpdump -r a.pcap |
增加捕获包的时间戳 | tcpdump -n -ttt -i eth0 |
指定捕获包的协议类型 | tcpdump -i eth0 arp |
捕获指定端口 | tcpdump -i eth0 post 22 |
捕获特定目标ip port的包 | tcpdump -i eth0 dst address and port 22 |
捕获DNS请求和响应 | tcpdump -i eth0 -s0 port 53 |
匹配Http请求头 | tcpdump -s 0 -v -n -l | egrep -i 'POST /|GET /|Host:'
|
5. lsof
列出当前系统打开的文件描述符工具。可以得知感兴趣的描述符是被哪些进程使用
相关参数:
lsof老规矩,上几个例子:
执行任务 | 命令 |
---|
列出所有的网络链接 | lsof -i |
列出所有udp的网络链接 | lsof -i udp |
列出谁在使用某个端口 | lsof -i :3306 |
列出谁在使用特定的tcp端口 | lsof -i tcp:80 |
根据文件描述范围列出文件信息 | lsof -d 2-3 |
udp | 命令
|
列出谁在使用某个端口 | lsof -i :3306 |
列出谁在使用特定的tcp端口 | lsof -i tcp:80 |
根据文件描述范围列出文件信息 | lsof -d 2-3
|
6. netstat
netstat是一个网络信息统计工具。它可以得到网卡接口上全部了解,路由表信息,网卡接口信息等。通常在网络编程中我们用它来显示TCP连接以及状态信息。

几个常用例子:
执行任务 | 执行命令 |
---|
列出所有连接 | netstat -a |
只列出TCP或者UDP | netstat -at/netstat -au |
列出监听中的连接 | netstat -tnl |
获取进程名、进程号以及用户 ID | nestat -nlpt |
打印统计信息 | netstat -s |
netstat持续输出 | netstat -ct |
打印active状态的连接 | netstat -atnp | grep ESTA |
查看服务是否运行(npt) | netstat -aple| grep ntp |
7. dpkt
dpkt定义包packet类,它定义了网络报文类型的基础类。其中IP,ICMP等继承于dpkt class,每一个子类有一个 __hdr__ 结构,此结构定义了不同报文的头部,方便取出相应的控制字段。示例如下
#!/usr/bin/python
#coding=utf-8
import dpkt
import socket
import optparse
def printPcap(pcap):
# 遍历[timestamp, packet]记录的数组
for (ts, buf) in pcap:
try:
# 获取以太网部分数据
eth = dpkt.ethernet.Ethernet(buf)
# 获取IP层数据
ip = eth.data
# 把存储在inet_ntoa中的IP地址转换成一个字符串
src = socket.inet_ntoa(ip.src)
dst = socket.inet_ntoa(ip.dst)
print '[ ] 源地址: ' src ' --> 目标地址: ' dst
except:
pass
def main():
parser = optparse.OptionParser('[*] Usage : ./pcapTest.py -f <file>')#测试包
parser.add_option('-f',dest='fileName',type='string',help='specify target filename')
(options,args) = parser.parse_args()
fileName = options.fileName# 取得包名
if fileName == None:
print parser.usage
exit(0)
else:
#f = open('geotest.pcap')
f = open(fileName)
pcap = dpkt.pcap.Reader(f)
printPcap(pcap)
if __name__ == '__main__':
main()
8. scapy
注意哈,这个是嗅探包不是爬虫框架scrapy哈。看看官网怎么说的,如“强大的交互式包操作工具”、“支持大量协议的包解析和包构造”、“轻松取代 hping,85% 的 nmap,arpspoof,tcpdump 等等”。不过归根到底,它说的强大功能,都是基于 Scapy 是一个强大的网络数据包操作工具才能实现得了的。只是大概介绍,具体用法官网非常详细,有助于学习网络协议

以上便是今天给大家分享的网络利器,动手试一试吧。