网络

image-20200430204659095

资源共享的功能和优点

  • 数据和应用程序

  • 资源

  • 网络存储

  • 备份设备

常见的网络物理组件

image-20200430204925888

网络应用程序

  • Web 浏览器(Chrome、IE、Firefox等)
  • 即时消息(QQ、微信、钉钉等)
  • 电子邮件(Outlook、foxmail 等)
  • 协作(视频会议、VNC、Netmeeting、WebEx 等)
  • web网络服务(apache,nginx,IIS)
  • 文件网络服务(ftp ,nfs,samba)
  • 数据库服务( MySQL,MariaDB,MongoDB)
  • 中间件服务(Tomcat,JBoss)
  • 安全服务(Netfilter)

用户应用程序对网络的影响

  • 批处理应用程序

    • FTP、TFTP、库存更新
    • 无需直接人工交互
    • 带宽很重要,但并非关键性因素
  • 交互式应用程序

    • 库存查询、数据库更新
    • 人机交互
    • 因为用户需等待响应,所以响应时间很重要, 但并非关键性因素,除非要等待很长时间
  • 实时应用程序

    • VoIP、视频
    • 人与人的交互
    • 端到端的延时至关重要

网络特征

  • 速度
  • 成本
  • 安全性
  • 可用性
  • 可扩展性
  • 可靠性
  • 拓扑

带宽

image-20200430205204273

物理拓扑

总线拓扑

  • 所有设备均可接收信号

    image-20200430205415000

星型拓扑

  • 通过中心点传输

  • 单一故障点

    image-20200430205500887

扩展星型拓扑

  • 比星型拓扑的复原能力更强

    image-20200430205546401

环拓扑

  • 信号绕环传输

  • 单一故障点

    image-20200430205616964

双环拓扑

  • 信号沿相反方向传输

  • 比单环的复原能力更强

    image-20200430205646574

全网状拓扑

  • 容错能力强

  • 实施成本高

    image-20200430205712988

部分网状拓扑

  • 在容错能力与成本之间寻求平衡

    image-20200430205746284

逻辑拓扑

  • 逻辑拓扑描述了信息在网络中流动的方式

    image-20200430205817202

OSI七层模型

  • 降低复杂性

  • 标准化接口

  • 简化模块化设计

  • 确保技术的互操作性

  • 加快发展速度

  • 简化教学

    image-20200430205927939

物理层

image-20200430205950924

数据链路层

image-20200430210011759

网络层

image-20200430210025297

传输层

image-20200430210038141

会话层

image-20200430210051138

表示层

image-20200430210102206

应用层

image-20200430210122192

数据封装

image-20200430210151637

数据解封

image-20200430210210597

对等通信

image-20200430210230017

PDU

  • PDU: Protocol Data Unit,协议数据单元是指对等层次之间传递的数据单位
  • 物理层的 PDU是数据位 bit
  • 数据链路层的 PDU是数据帧 frame
  • 网络层的PDU是数据包 packet
  • 传输层的 PDU是数据段 segment
  • 其他更高层次的PDU是消息 message

三种通信模式

单播

image-20200430210425541

广播

image-20200430210442919

组播

image-20200430210504327

TCP/IP协议栈

  • Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议

  • TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议

  • 最早发源于美国国防部(缩写为DoD)的因特网的前身 ARPA网项目,1983年1月1日,TCP/IP取代了旧的网络 控制协议NCP,成为今天的互联网和局域网的基石和标 准,由互联网工程任务组负责维护

  • 共定义了四层

  • 和OSI参考模型的分层有对应关系

    image-20200430210716515

    image-20200430210733256

应用层

image-20200430210809182

传输层

image-20200430210831330

TCP

TCP特性

  • 工作在传输层
  • 面向连接协议
  • 全双工协议
  • 半关闭
  • 错误检查
  • 将数据打包成段,排序
  • 确认机制
  • 数据恢复,重传
  • 流量控制,滑动窗口
  • 拥塞控制,慢启动和拥塞避免算法
  • 更多关于tcp的内核参数,可参看man 7 tcp

TCP包头

image-20200430211125437

  • 源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的, 而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标 端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的, 可推算计算机的端口个数为2^16个

  • 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的 字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个 字节,就会出现序列号回绕,再次从 0 开始

  • 确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。 也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据 的编号为此确认号

  • 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可 变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数 据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为 计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节

  • URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效

  • ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段

  • PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空 间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序 不将接收到的数据读走,就会一直停留在TCP接收缓冲区中

  • RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必 须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应, 带RST标志的TCP报文段称为复位报文段

  • SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连 接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求 建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文 段称为同步报文段

  • FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方: “我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

  • 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段 的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继 续传送后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值

  • 校验和:提供额外的可靠性

  • 紧急指针:标记紧急数据在数据字段中的位置

  • 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表 示,选项部分最长为:(2^4-1)*4-20=40字节

    常见选项:

    • 最大报文段长度:Maxium Segment Size,MSS,通常1460字节
    • 窗口扩大:Window Scale
    • 时间戳: Timestamps

TCP包头选项

  1. 最大报文段长度MSS(Maximum Segment Size)

    指明自己期望对方发送TCP报文段时那个数据字段的长度。比如:1460字节。数 据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太 大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在 IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首 部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传 输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成 原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此 MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双 方都把自己能够支持的MSS写入这一字段。 MSS只出现在SYN报文中。即:MSS 出现在SYN=1的报文段中

    MTU和MSS值的关系:MTU=MSS+IP Header+TCP Header 通信双方最终的MSS值=较小MTU-IP Header-TCP Header

  2. 窗口扩大

    为了扩大窗口,由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是 65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口 来满足性能和吞吐率,所以产生了这个窗口扩大选项

  3. 时间戳

    可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中, 当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序 列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文

TCP协议PORT

  • 传输层通过port号,确定应用层协议

  • Port number:

  • tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路

    • 0-65535
  • udp:User Datagram Protocol,无连接的协议

    • 0-65535
  • IANA:互联网数字分配机构(负责域名,数字资源,协议分配)

    • 0-1023:系统端口或特权端口(仅管理员可用) ,众所周知,永久的分配给固定的 系统应用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)

    • 1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应 用使用,1433/tcp(SqlServer), 1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached)

    • 49152-65535:动态端口或私有端口,客户端程序随机使用的端口

    • 其范围的定义:/proc/sys/net/ipv4/ip_local_port_range

TCP序列号和确认号

image-20200430211955366

TCP确认

image-20200430212053372

固定窗口

image-20200430212111105

滑动窗口

image-20200430212129297

TCP连接

TCP三次握手

image-20200430212223778

TCP四次挥手

image-20200430212241355

为啥TCP最后挥手要等2MSL?

1.服务端可能收不到客户端最后的确认,所以服务端需要重新发送FIN请求,如果客户端不等待而直接关闭的话,FIN请求就无法送达,导致连接关闭异常

2.客户端重新发起的请求的端口也可能和上一个请求是一样的,而如果上一个请求立即关闭的话,网络中可能存在残留的报文,这些报文在新连接建立后才到达服务器,由于前后端口号一致,TCP协议就默认这些数据属于新连接,容易混乱

TCP状态

  • CLOSED 没有任何连接状态

  • LISTEN 侦听状态,等待来自远方TCP端口的连接请求

  • SYN-SENT 在发送连接请求后,等待对方确认

  • SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

  • ESTABLISHED 代表传输连接建立,双方进入数据传送状态

  • FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

  • FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

  • TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

  • CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

  • LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

  • CLOSING 双方同时尝试关闭传输连接,等待对方确认

    1581774600666-103c0662-659c-4f27-9fda-ab215f3f7ace

客户机端的三次握手和四次挥手

image-20200430212614641

服务器端的三次握手和四次挥手

image-20200430212632965

sync半连接和accept全连接队列

image-20200430212712062

  • ss –lnt
  • /proc/sys/net/ipv4/tcp_max_syn_backlog 未完成连接队列大小,建议调整大小为1024以上
  • /proc/sys/net/core/somaxconn 完成连接队列大小,建议调整大小为1024以上

TCP超时重传

  • 异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务
  • TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为 每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时 启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置 定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是 TCP的重传策略
  • 与TCP超时重传相关的两个内核参数:
  • /proc/sys/net/ipv4/tcp_retries1,指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
  • /proc/sys/net/ipv4/tcp_retries2,指定连接放弃前TCP最多可以执行的重传次 数,默认值15(一般对应13~30min)

快速重传原理

如果发送端连续收到了4份同样的ACK(1份正常+3次冗余),则认为数据包已经丢失,立刻进行重传。为什么是3次?这是一个估值,并不代表收到3次就丢失报文了,也有可能是TCP自身传输过程中乱序导致的,只是连续收到3次冗余的概率更大一点

拥塞控制

  • 网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间, 若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。此情况称为拥塞
  • TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。 即所谓的拥塞控制
  • TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分: 慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)。拥塞控制算法在Linux下有多种实 现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了 上述四个部分
  • 当前所使用的拥塞控制算法法
    • /proc/sys/net/ipv4/tcp_congestion_control

UDP

  • 工作在传输层
  • 提供不可靠的网络访问
  • 非面向连接协议
  • 有限的错误检查
  • 传输性能高
  • 无数据恢复特性
  • 更多关于udp的内核参数,可参看man 7 udp

UDP包头

image-20200430213121785

Internet层

image-20200430213223429

Internet协议特征

  • 运行于 OSI 网络层
  • 面向无连接的协议
  • 独立处理数据包
  • 分层编址
  • 尽力而为传输
  • 无数据恢复功能

IP PDU报头

image-20200430213720520

  • 版本:占4位,指 IP 协议的版本目前的IP协议版本号为4
  • 首部长度:占4位,可表示的最大数值是15个单位,一个单位为4字节,因此IP 的 首部长度的最大值是60字节
  • 区分服务:占8位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未 被使用过.后改名为区分服务.只有在使用区分服务(DiffServ)时,这个字段才起作用.一般的情况下不使用
  • 总长度:占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节.总长度必须不超过最大传送单元 MTU
  • 标识:占16位,它是一个计数器,通常,每发送一个报文,该值会加1, 也用于数 据包分片,在同一个包的若干分片中,该值是相同的
  • 标志(flag):占3位,目前只有后两位有意义
  • DF: Don’t Fragment 中间的一位,只有当 DF=0 时才允许分片
  • MF: More Fragment 最后一位,MF=1表示后面还有分片,MF=0 表示最后 一个分片
  • 片偏移:占13位,指较长的分组在分片后,该分片在原分组中的相对位置.片偏移 以8个字节为偏移单位
  • 生存时间:占8位,记为TTL (Time To Live) 数据报在网络中可通过的路由器数的 最大值,TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64.发送 ICMP 回显应答时经常把 TTL 设为最大值 255
  • 协议:占8位,指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据 部分上交给哪个处理过程, 1表示为 ICMP 协议, 2表示为 IGMP 协议, 6表示为 TCP 协议, 17表示为 UDP 协议
  • 首部检验和:占16位,只检验数据报的首部不检验数据部分.这里不采用 CRC 检验码而采用简单的计算方法
  • 源地址和目的地址:都各占4字节,分别记录源地址和目的地址

主机到主机的包传递

  1. image-20200430213935873

  2. image-20200430213953204

  3. image-20200430214005334

  4. image-20200430214017979

  5. image-20200430214028510

  6. image-20200430214041506

  7. image-20200430214052504

  8. image-20200430214106027

  9. image-20200430214117350

  10. image-20200430214129296

  11. image-20200430214140533

  12. image-20200430214152267

  13. image-20200430214204387

  14. image-20200430214213919

  15. image-20200430214224125

  16. image-20200430214232837

  17. image-20200430214246439

  18. image-20200430214258471

  19. image-20200430214309147

  20. image-20200430214320025

  21. image-20200430214329050

  22. image-20200430214338957

IP地址

  • 可唯一标识 IP 网络中的每台设备
  • 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址
  • IP地址由两部分组成
    • 网络ID:
      • 标识网络
      • 每个网段分配一个网络ID
    • 主机 ID:
      • 标识单个主机
      • 由组织分配给各设备

IPv4地址格式:点分十进制

image-20200430214516699

分类

  • A类:

    • 0 000 0000 - 0 111 1111: 1-126
    • 网络数:126, 127
    • 每个网络中的主机数:2^24-2
    • 默认子网掩码:255.0.0.0
    • 私网地址:10.0.0.0
  • B类:

    • 10 00 0000 - 10 11 1111:128-191
    • 网络数:2^14
    • 每个网络中的主机数:2^16-2
    • 默认子网掩码:255.255.0.0
    • 私网地址:172.16.0.0-172.31.0.0
  • C类:

    • 110 0 0000 - 110 1 1111: 192-223
    • 网络数:2^21
    • 每个网络中的主机数:2^8-2
    • 默认子网掩码:255.255.255.0
    • 私网地址:192.168.0.0-192.168.255.0
  • D类:组播

    • 1110 0000 - 1110 1111: 224-239
  • E类:保留未使用

    • 240-255

公有IP地址

image-20200430214722318

私有IP地址

image-20200430214810069

特殊地址

  • 0.0.0.0

    0.0.0.0不是一个真正意义上的IP地址。它表示所有不清楚的主机和目的网络

  • 255.255.255.255

    限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机

  • 127.0.0.1~127.255.255.254

    本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为 “127.0.0.1”的 数据包

  • 224.0.0.0到239.255.255.255

    组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器。224.0.0.5指OSPF 路由器,地址多用于一些特定的程序以及多媒体程序

  • 169.254.x.x

    如果Windows主机使用了DHCP自动分配IP地址,而又无法从DHCP服务器获取地 址,系统会为主机分配这样地址

保留地址

image-20200430214946034

子网掩码

image-20200430215135018

有子网的子网掩码

image-20200430215324264

子网掩码的八位

image-20200430215339392

可变长子网掩码

image-20200430215400582

Subnet地址

image-20200430215426741

监控工具

iftop

iftop是一款实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行

  • -i设定监测的网卡,如:# iftop -i eth1
  • -B 以bytes为单位显示流量(默认是bits),如:# iftop -B+
  • -n使host信息默认直接都显示IP,如:# iftop -n
  • -N使端口信息默认直接都显示端口号,如: # iftop -N
  • -F显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
  • -p使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
  • -b使流量图形条默认就显示;
  • -f这个暂时还不太会用,过滤计算包用的;
  • -P使host信息及端口信息默认就都显示;
  • -m设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M

nload

  • nload是一个实时监控网络流量和带宽使用情况,以数值和动态图展示进出的流量情况

  • 界面操作

    • 上下方向键、左右方向键、enter键或者tab键都就可以切换查看多个网卡的流量情况
    • 按 F2 显示选项窗口
    • 按 q 或者 Ctrl+C 退出 nload
  • 示例:

    • nload:默认只查看第一个网络的流量进出情况
    • nload eth0 eth1:在nload后面指定网卡,可以指定多个
  • 设置刷新间隔:默认刷新间隔是100毫秒,可通过 -t命令设置刷新时间(单位是毫秒)nload -t 500 ens33

  • 设置单位:显示两种单位一种是显示Bit/s、一种是显示Byte/s,默认是以Bit/s,也可不显示/s

    -u h|b|k|m|g|H|B|K|M|G 表示的含义:

    h: auto, b: Bit/s, k: kBit/s, m: MBit/s, H: auto, B: Byte/s, K: kByte/s, M: MByte/s

    nload -u M eth0

网络配置与管理

基本网络配置

  • 将Linux主机接入到网络,需要配置网络相关设置
  • 一般包括如下内容:
    • 主机名 IP/netmask
    • 路由:默认网关
    • DNS服务器
      • 主DNS服务器
      • 次DNS服务器
      • 第三DNS服务器

网络配置方式

  • 静态指定:

    • ifconfig, route, netstat

    • ip: object {link, addr, route}, ss, tc system-config-network-tui,setup 配置文件

  • 动态分配:

    • DHCP: Dynamic Host Configuration Protocol

配置网络接口

ifconfig命令

  • ifconfig [interface] 实现接口及地址查看和管理
    • ifconfig -a 查看所有网络接口配置信息,包括inactive状态的接口
    • ifconfig IFACE [up|down]
  • ifconfig interface [aftype] options | address …
  • ifconfig IFACE IP/netmask [up] [down]
  • ifconfig IFACE IP netmask NETMASK 注意:立即送往内核中的TCP/IP协议栈并生效
  • 启用混杂模式:[-]promisc
  • 管理IPv6地址:
    • add addr/prefixlen
    • del addr/prefixlen

route命令

  • 路由管理命令

  • 查看:route -n 以数字格式显示路由信息

  • 添加:route add

    • route add [-net|-host] target [netmask Nm] [gw Gw] [dev] If]
  • 目标:192.168.1.3 网关:172.16.0.1

    • route add -host 192.168.1.3 gw 172.16.0.1 dev eth0
  • 目标:192.168.0.0 网关:172.16.0.1

    • route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 dev eth0
    • route add -net 192.168.0.0/24 gw 172.16.0.1 dev eth0
  • 默认路由,网关:172.16.0.1

    • route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.16.0.1
    • route add default gw 172.16.0.1
  • 删除:route del

    • route del [-net|-host] target [gw Gw] [netmask Nm] [[dev] If]
    • route del default
  • 目标:192.168.1.3 网关:172.16.0.1

    • route del -host 192.168.1.3
  • 目标:192.168.0.0 网关:172.16.0.1

    • route del -net 192.168.0.0 netmask 255.255.255.0

netstat命令

  • 显示网络连接:

    netstat [–tcp|-t] [–udp|-u] [–raw|-w] [–listening|-l] [–all|-a] [–numeric|-n] [–extend|-e[–extend|-e]] [–program|-p]

    • -t: tcp协议相关
    • -u: udp协议相关
    • -w: raw socket相关
    • -l: 处于监听状态
    • -a: 所有状态
    • -n: 以数字显示IP和端口
    • -e:扩展格式 多了user 和 inode ,其中inode 表示当前连接套接字文件的inode号
    • -p: 显示相关进程及PID
  • 常用组合:

    • -tan, -uan, -tnl, -unl,lntup
  • 显示路由表:

    • netstat {–route|-r} [–numeric|-n]
      • -r: 显示内核路由表
      • -n: 数字格式
  • 显示接口统计数据:

    netstat {–interfaces|-I|-i} [iface] [–all|-a] [–extend|-e] [–program|-p][–numeric|-n]

    • netstat -i 显示所有接口
    • netstat –I=IFACE 显示指定接口
    • ifconfig -s eth0

ip命令

  • 配置Linux网络属性:ip 命令

  • ip - show / manipulate routing, devices, policy routing and tunnels

    • ip [ OPTIONS ] OBJECT { COMMAND | help }
    • OBJECT := { link | addr | route }
  • ip link - network device configuration

    • set [dev IFACE]:指定接口
      • 可设置属性:
      • up and down:激活或禁用指定接口
        • ifup/ifdown 通过读取网卡的配置文件
      • name NAME:重命名接口
      • mtu NUMBER:更改mtu的值
    • show [dev IFACE]:指定接口(二层)
      • [up]:仅显示处于激活状态的接口
  • ip netns:ip-manage network namespaces

    • ip netns list
    • ip netns add NAME
    • ip netns del NAME
    • ip netns exec NAME COMMAND:在指定的netns中运行命令
  • ip addr { add | del } IFADDR dev STRING [label LABEL]:添加地址时指明网卡别名 [scope {global|link|host}]:指明作用域

    • global: 全局可用
    • link: 仅链接可用
    • host: 本机内部可用
    • [broadcast ADDRESS]:指明广播地址
      • ip addr add 172.16.100.100/16 dev eth0 label eth0:0
      • ip addr del 172.16.100.100/16 dev eth0 label eth0:0
    • ip address show - look at protocol addresses
      • [dev DEVICE]
      • [label PATTERN] [primary and secondary]
    • ip addr flush 清空接口的所有地址,使用格式同show
      • ip addr flush dev eth0
  • ip route - routing table management

    • 添加路由:ip route add

    • ip route add TARGET via GW [dev IFACE] [src SOURCE_IP]

      • TARGET:

        • 主机路由:IP
        • 网络路由:NETWORK/MASK
      • ip route add 192.168.0.0/24 via 172.16.0.1

      • ip route add 192.168.1.100 via 172.16.0.1

      • 添加网关:

        • ip route add default via GW dev IFACE
        • ip route add default via 172.16.0.1
    • 删除路由:ip route del TARGET

    • 显示路由:ip route show|list [src | dev] xxx

    • 获取某单个路由条目:ip route get

      • ip route get 192.168.1.9
    • 清空路由表:ip route flush [dev IFACE] [via PREFIX]

      • ip route flush dev eth0

ss命令

  • 格式:ss [OPTION]… [FILTER]

  • netstat通过遍历proc来获取socket信息,ss使用netlink与内核tcp_diag模块通信获取socket信息

  • 选项:

    • -t: tcp协议相关
    • -u: udp协议相关
    • -w: raw socket,裸套接字相关
    • -x:unix sock相关
    • -l: listen状态的连接
    • -a: 所有
    • -n: 数字格式
    • -p: 相关的程序及PID
    • -e: 扩展的信息
    • -m:内存用量
    • -o:计时器信息
  • FILTER : [ state TCP-STATE ] [ EXPRESSION ]

    TCP的常见状态:

    • tcp finite state machine:
      • LISTEN: 监听
      • ESTABLISHED:已建立的连接
      • FIN_WAIT_1
      • FIN_WAIT_2
      • SYN_SENT
      • SYN_RECV
      • CLOSED

    EXPRESSION:

    • dport = xxx 源端口
    • sport = xxx 目标端口
    • 示例:’( dport = :ssh or sport = :ssh )’
  • 常用组合:

    • -tan, -tanl, -tanlp, -uan,lntup
    • ss -l 显示本地打开的所有端口
    • ss -pl 显示每个进程具体打开的socket
    • ss -t -a 显示所有tcp socket
    • ss -u -a 显示所有的UDP Socekt
    • ss -o state established ‘( dport = :ssh or sport = :ssh )’ 显示所有已建立的ssh连接
    • ss -o state established ‘( dport = :http or sport = :http )’ 显示所有已建立 的HTTP连接
    • ss -s 列出当前socket详细信息

网络配置文件

  • ONBOOT:在系统引导时是否激活此设备

  • TYPE:接口类型;常见有的Ethernet, Bridge

  • UUID:设备的唯一标识

  • IPV6INIT:是否初始化IPV6

  • BOOTPROTO:激活此接口时使用什么协议来配置接口属性,常用的有dhcp,bootp,static,none;

  • IPADDR:指明IP地址

  • PREFIX:子网掩码

  • GATEWAY: 默认网关

  • NAME: 网卡物理设备名称

  • DEVICE: 网卡设备名称

    1. 如果Firmware或BIOS为主板上集成的设备提供的索引信息可用,则根据此索引进行命名,如eno1, eno2, …
    2. 如果Firmware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名,如ens1, ens2, ..
    3. 如果硬件接口的物理位置信息可用,则根据此信息命名,如enp2s0, ..
    4. 如果用户显式定义,也可根据MAC地址命名,例如enx122161ab2e10, …
    5. 上述均不可用时,则仍使用传统方式命名。

    命名格式的组成:

    • en:ethernet

    • wl:wlan

    • ww:wwan

    • 名称类型:

      • o<index>:集成设备的设备索引号
      • s<slot>:拓展槽的索引号
      • x<MAC>:基于MAC地址的命名
      • p<bus>s<slot>:基于总线及槽的拓扑结构进行命名
  • DNS1:第一个DNS服务器指向

  • DNS2:第二个DNS服务器指向

  • DNS3:第二个DNS服务器指向

  • DOMAIN:DNS搜索域

  • USERCTL:普通用户是否可控制此设备

  • PEERDNS:如果BOOTPROTO的值为“dhcp”,YES将允许dhcp server分配的dns服务器信息直接覆盖至/etc/resolv.conf文件,NO不允许修改resolv.conf

  • 设备配置被保存在文本文件中

    • /etc/sysconfig/network-scripts/ifcfg-<name>
    • 帮助文档列出完整选项列表:/usr/share/doc/initcripts*/sysconfig.txt

    image-20200430221629097

网卡别名

网卡别名不支持动态获取地址

  • 对虚拟主机有用

  • 将多个IP地址绑定到一个NIC上

    • eth0:1 、eth0:2、eth0:3
  • ifconfig命令:

    • ifconfig eth0:0 192.168.1.100/24 up

    • ifconfig eth0:0 down

  • ip命令:

    • ip addr add 172.16.1.1/16 dev eth0
    • ip addr add 172.16.1.2/16 dev eth0 label eth0:0
    • ip addr del 172.16.1.2/16 dev eth0 label eth0:0
    • ip addr flush dev eth0 label eth0:0

设备别名

  • 为每个设备别名生成独立的接口配置文件

    • 关闭NetworkManager服务
    • ifcfg-ethX:xxx
    • 必须使用静态联网
      • DEVICE=eth0:0
      • IPADDR=10.10.10.10
      • NETMASK=255.0.0.0
      • ONPARENT=yes
  • 参考:/usr/share/doc/initscripts-*/sysconfig.txt

DNS解析

  • /etc/resolv.conf

    • nameserver DNS_SERVER_IP1

    • nameserver DNS_SERVER_IP2

    • nameserver DNS_SERVER_IP3

    • search magedu.com

  • /etc/nsswitch.conf

    • 与/etc/hosts相比优先于DNS
  • 正向解析:FQDN–>IP

    • dig -t A FQDN

    • host -t A FQDN

  • 反向解析:IP–>FQDN

    • dig -x IP
    • host -t PTR IP

网络接口配置-bonding

  • Bonding

    将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过bonding,虚拟一块网卡对外提供 连接,物理网卡的被修改为相同的MAC地址

  • 共7种模式:0-6 Mode

  • Mode 0 (balance-rr): 轮询(Round-robin)策略,从头到尾顺序的在每 一个slave接口上面发送数据包。本模式提供负载均衡和容错的能力

  • Mode 1 (active-backup): 活动-备份(主备)策略,只有一个slave被激活, 当且仅当活动的slave接口失败时才会激活其他slave.为了避免交换机发生混乱此时绑定的MAC地址只有一个外部端口上可见

  • Mode 3 (broadcast):广播策略,在所有的slave接口上传送所有的报文,提 供容错能力

  • active-backup、balance-tlb 和 balance-alb 模式不需要交换机的任何特 殊配置。其他绑定模式需要配置交换机以便整合链接。如:Cisco 交换机需 要在模式 0、2 和 3 中使用 EtherChannel,但在模式4中需要 LACP和 EtherChannel

  • 创建bonding设备的配置文件

  • /etc/sysconfig/network-scripts/ifcfg-bond0

    DEVICE=bond0

    BOOTPROTO=none

    BONDING_OPTS= “miimon=100 mode=0”

  • /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0

    BOOTPROTO=none

    MASTER=bond0

    SLAVE=yes

    USERCTL=no

  • 查看bond0状态:/proc/net/bonding/bond0

  • miimon 是用来进行链路监测的。如果miimon=100,那么系统每100ms 监测 一次链路连接状态,如果有一条线路不通就转入另一条线路

  • 删除bond0

    • ifconfig bond0 down
    • rmmod bonding
  • 详细帮助:

    /usr/share/doc/kernel-doc-version/Documentation/networking/bonding.txt

网络配置工具

  • 图形工具:nm-connection-editor
  • 字符配置tui工具:nmtui
  • 命令行工具:nmcli

nmcli命令

  • 地址配置工具:nmcli

  • nmcli [ OPTIONS ] OBJECT { COMMAND | help }

    device - show and manage network interfaces

    nmcli device help

    • connection - start, stop, and manage network connections
    • nmcli connection help
  • 修改IP地址等属性:

    • nmcli connection modify IFACE [+|-]setting.property value
      • setting.property:
      • ipv4.addresses ipv4.gateway
      • ipv4.dns1 ipv4.method manual | auto
  • 修改配置文件执行生效:systemctl restart network(CentOS8 已移除)

    • nmcli con reload

    • nmcli命令生效: nmcli con down eth0 ;nmcli con up eth0

使用nmcli配置网络

  • NeworkManager是管理和监控网络设置的守护进程

  • 设备即网络接口,连接是对网络接口的配置,一个网络接口可有多个连接配置,但同时只有一个连接配置生效

  • 显示所有包括不活动连接 nmcli con show

  • 显示所有活动连接

    nmcli con show –active

  • 显示网络连接配置

    nmcli con show “System eth0“

  • 显示设备状态

    nmcli dev status

  • 显示网络接口属性

    nmcli dev show eth0

  • 创建新连接default,IP自动通过dhcp获取

    nmcli con add con-name default type Ethernet ifname eth0

  • 删除连接

    nmcli con del default

  • 创建新连接static ,指定静态IP,不自动连接

    nmcti con add con-name static ifname eth0 autoconnect no type

    Ethernet ipv4.addresses 172.25.X.10/24 ipv4.gateway 172.25.X.254

  • 启用static连接配置

    nmcli con up static

  • 启用default连接配置

    nmcli con up default

  • 查看帮助

    nmcli con add help

  • 修改连接设置

    • nmcli con mod “static” connection.autoconnect no
    • nmcli con mod “static” ipv4.dns 172.25.X.254
    • nmcli con mod “static” +ipv4.dns 8.8.8.8
    • nmcli con mod “static” -ipv4.dns 8.8.8.8
    • nmcli con mod “static” ipv4.addresses “172.16.X.10/24 172.16.X.254”
    • nmcli con mod “static” +ipv4.addresses 10.10.10.10/16
  • DNS设置,存放在/etc/resolv.conf文件中

    PEERDNS=no 表示当IP通过dhcp自动获取时,dns仍是手动设置,不自动获取 等价于下面命令:

    nmcli con mod “system eth0” ipv4.ignore-auto-dns yes

  • 修改连接配置后,需要重新加载配置 nmcli con reload

    • nmcli con down “system eth0” 可被自动激活
    • nmcli con up “system eth0”
    • nmcli dev dis eth0 禁用网卡,访止被自动激活
  • 添加bonding接口

    nmcli con add type bond con-name mybond0 ifname bond0 mode

    active-backup

  • 添加从属接口

    • nmcli con add type bond-slave ifname ens7 master bond0
    • nmcli con add type bond-slave ifname ens3 master bond0
    • 注:如无为从属接口提供连接名,则该名称是接口名称加类型构成
  • 要启动绑定,则必须首先启动从属接口

    • nmcli con up bond-slave-eth0
    • nmcli con up bond-slave-eth1
  • 启动绑定

    nmcli con up mybond0


    image-20200501205050988

image-20200501205110789

tcpdump命令

tcpdump命令是一款sniffer工具,是linux上的抓包工具,嗅探器;它可以打印出所有经过网络接口的数据包的头信息。

tcpdump命令工作时先要把网卡的工作模式切换到混杂模式。所以tcpdump命令需要以root身份运行。tcpdump命令是linux下使用最广泛的网络协议分析工具。使用tcpdump命令时,必须精通TCP/IP协议工作原理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
-A  以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: 即Handy for capturing web pages).

-c count
tcpdump将在接受到count个数据包后退出.

-C file-size (nt: 此选项用于配合-w file 选项使用)
该选项使得tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)

-d 以容易阅读的形式,在标准输出上打印出编排过的包匹配码, 随后tcpdump停止.(nt | rt: human readable, 容易阅读的,通常是指以ascii码来打印一些信息. compiled, 编排过的. packet-matching code, 包匹配码,含义未知, 需补充)

-dd 以C语言的形式打印出包匹配码.

-ddd 以十进制数的形式打印出包匹配码(会在包匹配码之前有一个附加的'count'前缀).

-D 打印系统中所有tcpdump可以在其上进行抓包的网络接口. 每一个接口会打印出数字编号, 相应的接口名字, 以及可能的一个网络接口描述. 其中网络接口名字和数字编号可以用在tcpdump 的-i flag 选项(nt: 把名字或数字代替flag), 来指定要在其上抓包的网络接口.

此选项在不支持接口列表命令的系统上很有用(nt: 比如, Windows 系统, 或缺乏 ifconfig -a 的UNIX系统); 接口的数字编号在windows 2000 或其后的系统中很有用, 因为这些系统上的接口名字比较复杂, 而不易使用.

如果tcpdump编译时所依赖的libpcap库太老,-D 选项不会被支持, 因为其中缺乏 pcap_findalldevs()函数.

-e 每行的打印输出中将包括数据包的数据链路层头部信息

-E spi@ipaddr algo:secret,...

可通过spi@ipaddr algo:secret 来解密IPsec ESP包(nt | rt:IPsec Encapsulating Security Payload,IPsec 封装安全负载, IPsec可理解为, 一整套对ip数据包的加密协议, ESP 为整个IP 数据包或其中上层协议部分被加密后的数据,前者的工作模式称为隧道模式; 后者的工作模式称为传输模式 . 工作原理, 另需补充).

需要注意的是, 在终端启动tcpdump 时, 可以为IPv4 ESP packets 设置密钥(secret).

可用于加密的算法包括des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或者没有(none).默认的是des-cbc(nt: des, Data Encryption Standard, 数据加密标准, 加密算法未知, 另需补充).secret 为用于ESP 的密钥, 使用ASCII 字符串方式表达. 如果以 0x 开头, 该密钥将以16进制方式读入.

该选项中ESP 的定义遵循RFC2406, 而不是 RFC1827. 并且, 此选项只是用来调试的, 不推荐以真实密钥(secret)来使用该选项, 因为这样不安全: 在命令行中输入的secret 可以被其他人通过ps 等命令查看到.

除了以上的语法格式(nt: 指spi@ipaddr algo:secret), 还可以在后面添加一个语法输入文件名字供tcpdump 使用(nt:即把spi@ipaddr algo:secret,... 中...换成一个语法文件名). 此文件在接受到第一个ESP 包时会打开此文件, 所以最好此时把赋予tcpdump 的一些特权取消(nt: 可理解为, 这样防范之后, 当该文件为恶意编写时,不至于造成过大损害).

-f 显示外部的IPv4 地址时(nt: foreign IPv4 addresses, 可理解为, 非本机ip地址), 采用数字方式而不是名字.(此选项是用来对付Sun公司的NIS服务器的缺陷(nt: NIS, 网络信息服务, tcpdump 显示外部地址的名字时会用到她提供的名称服务): 此NIS服务器在查询非本地地址名字时,常常会陷入无尽的查询循环).

由于对外部(foreign)IPv4地址的测试需要用到本地网络接口(nt: tcpdump 抓包时用到的接口)及其IPv4 地址和网络掩码. 如果此地址或网络掩码不可用, 或者此接口根本就没有设置相应网络地址和网络掩码(nt: linux 下的 'any' 网络接口就不需要设置地址和掩码, 不过此'any'接口可以收到系统中所有接口的数据包), 该选项不能正常工作.

-F file
使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.

-i interface

指定tcpdump 需要监听的接口. 如果没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包括 loopback 接口).一但找到第一个符合条件的接口, 搜寻马上结束.

在采用2.2版本或之后版本内核的Linux 操作系统上, 'any' 这个虚拟网络接口可被用来接收所有网络接口上的数据包(nt: 这会包括目的是该网络接口的, 也包括目的不是该网络接口的). 需要注意的是如果真实网络接口不能工作在'混杂'模式(promiscuous)下,则无法在'any'这个虚拟的网络接口上抓取其数据包.

如果 -D 标志被指定, tcpdump会打印系统中的接口编号,而该编号就可用于此处的interface 参数.

-l 对标准输出进行行缓冲(nt: 使标准输出设备遇到一个换行符就马上把这行的内容打印出来).在需要同时观察抓包打印以及保存抓包记录的时候很有用. 比如, 可通过以下命令组合来达到此目的:
``tcpdump -l | tee dat'' 或者 ``tcpdump -l > dat & tail -f dat''.(nt: 前者使用tee来把tcpdump 的输出同时放到文件dat和标准输出中, 而后者通过重定向操作'>', 把tcpdump的输出放到dat 文件中, 同时通过tail把dat文件中的内容放到标准输出中)

-L 列出指定网络接口所支持的数据链路层的类型后退出.(nt: 指定接口通过-i 来指定)

-m module
通过module 指定的file 装载SMI MIB 模块(nt: SMI,Structure of Management Information, 管理信息结构MIB, Management Information Base, 管理信息库. 可理解为, 这两者用于SNMP(Simple Network Management Protoco)协议数据包的抓取. 具体SNMP 的工作原理未知, 另需补充).

此选项可多次使用, 从而为tcpdump 装载不同的MIB 模块.

-M secret 如果TCP 数据包(TCP segments)有TCP-MD5选项(在RFC 2385有相关描述), 则为其摘要的验证指定一个公共的密钥secret.

-n 不对地址(比如, 主机地址, 端口号)进行数字表示到名字表示的转换.

-N 不打印出host 的域名部分. 比如, 如果设置了此选现, tcpdump 将会打印'nic' 而不是 'nic.ddn.mil'.

-O 不启用进行包匹配时所用的优化代码. 当怀疑某些bug是由优化代码引起的, 此选项将很有用.

-p 一般情况下, 把网络接口设置为非'混杂'模式. 但必须注意 , 在特殊情况下此网络接口还是会以'混杂'模式来工作; 从而, '-p' 的设与不设, 不能当做以下选现的代名词:'ether host {local-hw-add}' 或 'ether broadcast'(nt: 前者表示只匹配以太网地址为host 的包, 后者表示匹配以太网地址为广播地址的数据包).

-q 快速(也许用'安静'更好?)打印输出. 即打印很少的协议相关信息, 从而输出行都比较简短.

-R 设定tcpdump 对 ESP/AH 数据包的解析按照 RFC1825而不是RFC1829(nt: AH, 认证头, ESP, 安全负载封装, 这两者会用在IP包的安全传输机制中). 如果此选项被设置, tcpdump 将不会打印出'禁止中继'域(nt: relay prevention field). 另外,由于ESP/AH规范中没有规定ESP/AH数据包必须拥有协议版本号域,所以tcpdump不能从收到的ESP/AH数据包中推导出协议版本号.

-r file
从文件file 中读取包数据. 如果file 字段为 '-' 符号, 则tcpdump 会从标准输入中读取包数据.

-S 打印TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号.(nt: 相对顺序号可理解为, 相对第一个TCP 包顺序号的差距,比如, 接受方收到第一个数据包的绝对顺序号为232323, 对于后来接收到的第2个,第3个数据包, tcpdump会打印其序列号为1, 2分别表示与第一个数据包的差距为1 和 2. 而如果此时-S 选项被设置, 对于后来接收到的第2个, 第3个数据包会打印出其绝对顺序号:232324, 232325).

-s snaplen
设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是68字节(而支持网络接口分接头(nt: NIT, 上文已有描述,可搜索'网络接口分接头'关键字找到那里)的SunOS系列操作系统中默认的也是最小值是96).68字节对于IP, ICMP(nt: Internet Control Message Protocol,因特网控制报文协议), TCP 以及 UDP 协议的报文已足够, 但对于名称服务(nt: 可理解为dns, nis等服务), NFS服务相关的数据包会产生包截短. 如果产生包截短这种情况, tcpdump的相应打印输出行中会出现''[|proto]''的标志(proto 实际会显示为被截短的数据包的相关协议层次). 需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增加包的处理时间, 并且会减少tcpdump 可缓存的数据包的数量, 从而会导致数据包的丢失. 所以, 在能抓取我们想要的包的前提下, 抓取长度越小越好.把snaplen 设置为0 意味着让tcpdump自动选择合适的长度来抓取数据包.

-T type
强制tcpdump按type指定的协议所描述的包结构来分析收到的数据包. 目前已知的type 可取的协议为:
aodv (Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议, 在Ad hoc(点对点模式)网络中使用),
cnfp (Cisco NetFlow protocol), rpc(Remote Procedure Call), rtp (Real-Time Applications protocol),
rtcp (Real-Time Applications con-trol protocol), snmp (Simple Network Management Protocol),
tftp (Trivial File Transfer Protocol, 碎文件协议), vat (Visual Audio Tool, 可用于在internet 上进行电
视电话会议的应用层协议), 以及wb (distributed White Board, 可用于网络会议的应用层协议).

-t 在每行输出中不打印时间戳

-tt 不对每行输出的时间进行格式处理(nt: 这种格式一眼可能看不出其含义, 如时间戳打印成1261798315)

-ttt tcpdump 输出时, 每两行打印之间会延迟一个段时间(以毫秒为单位)

-tttt 在每行打印的时间戳之前添加日期的打印

-u 打印出未加密的NFS 句柄(nt: handle可理解为NFS 中使用的文件句柄, 这将包括文件夹和文件夹中的文件)

-U 使得当tcpdump在使用-w 选项时, 其文件写入与包的保存同步.(nt: 即, 当每个数据包被保存时, 它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件)

-U 标志在老版本的libcap库(nt: tcpdump 所依赖的报文捕获库)上不起作用, 因为其中缺乏pcap_cump_flush()函数.

-v 当分析和打印的时候, 产生详细的输出. 比如, 包的生存时间, 标识, 总长度以及IP包的一些选项. 这也会打开一些附加的包完整性检测, 比如对IP或ICMP包头部的校验和.

-vv 产生比-v更详细的输出. 比如, NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码.

-vvv 产生比-vv更详细的输出. 比如, telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,
其相应的图形选项将会以16进制的方式打印出来(nt: telnet 的SB,SE选项含义未知, 另需补充).

-w 把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后通过-r 选项来重新读入并进行分析和打印.

-W filecount
此选项与-C 选项配合使用, 这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池. 同时, 该选项会使得每个文件名的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序.

-x 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括连接层的头部).总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值. 必须要注意的是, 如果高层协议数据没有snaplen 这么长,并且数据链路层(比如, Ethernet层)有填充数据, 则这些填充数据也会被打印.(nt: so for link layers that pad, 未能衔接理解和翻译, 需补充 )

-xx tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据, 其中包括数据链路层的头部.

-X 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据(但不包括连接层的头部).这对于分析一些新协议的数据包很方便.

-XX 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据, 其中包括数据链路层的头部.这对于分析一些新协议的数据包很方便.

-y datalinktype
设置tcpdump 只捕获数据链路层协议类型是datalinktype的数据包

-Z user
使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID(nt: tcpdump 此处可理解为tcpdump 运行之后对应的进程)

此选项也可在编译的时候被设置为默认打开.(nt: 此时user 的取值未知, 需补充)

常用用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@www ~]# tcpdump -i eth1                           #监视指定网络接口的数据包

[root@www ~]# tcpdump host webserver #打印所有进入或离开webserver的数据包.

[root@www ~]# tcpdump host 210.27.48.1 #也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包

[root@www ~]# tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) #截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信

[root@www ~]# tcpdump ip host 210.27.48.1 and ! 210.27.48.2 #获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包

[root@www ~]# tcpdump -i eth0 src host webserver #截获主机webserver发送的所有数据

[root@www ~]# tcpdump -i eth0 dst host webserver #监视所有送到主机webserver的数据包


[root@www ~]# tcpdump tcp port 23 and host 210.27.48.1 #获取主机210.27.48.1接收或发出的telnet包

[root@www ~]# tcpdump udp port 123 #对本机的udp 123 端口进行监视 123 为ntp的服务端口

[root@www ~]# tcpdump net ucb-ether #打印本地主机与Berkeley网络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley网络'的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包)

[root@www ~]# tcpdump 'gateway snup and (port ftp or ftp-data)' #打印所有通过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析)


[root@www ~]# tcpdump ip and not net localnet #打印所有源地址或目标地址是本地主机的IP数据包


[root@www ~]# tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet' #打印TCP会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机.(nt: localnet, 实际使用时要真正替换成本地网络的名字))

[root@www ~]# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2 -="" tcp="" 12="" 0xf0="">>2)) != 0)' #打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包

[root@www ~]# tcpdump 'gateway snup and ip[2:2] > 576' #打印长度超过576字节, 并且网关地址是snup的IP数据包

[root@www ~]# tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224' #打印所有IP层广播或多播的数据包, 但不是物理以太网层的广播或多播数据报


[root@www ~]# tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' #打印除'echo request'或者'echo reply'类型以外的ICMP数据包

[root@www ~]# tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
#(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
#(2)-i eth1 : 只抓经过接口eth1的包
#(3)-t : 不显示时间戳
#(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
#(5)-c 100 : 只抓取100个数据包
#(6)dst port ! 22 : 不抓取目标端口是22的数据包
#(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
#(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

[root@www ~]# tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 #使用tcpdump抓取HTTP包