1. 网关

主机需要将数据发送到其它局域网的必经之路

2. tcpdump 分析网络中传送的数据包

安装: yum install tcpdump

  1. -n 不进行主机名解析
  2. -i 指定监听的网络接口
  3. -w 直接将过滤包写入文件中
  4. host ip
  5. port 端口
  6. dst 目的
  7. src
  1. 2.1基于ip地址过滤
  2. tcpdump host 172.16.7.206
  3. tcpdump -i eth1 src host 172.16.7.206 ---源地址
  4. tcpdump -i eth1 dst host 172.16.7.206 ---目的地址
  5. 2.2 基于端口过滤
  6. tcpdump -i eth1 port 80
  7. tcpdump -i eth1 src 10.0.0.1 and dst port 3389
  8. tcpdump -i eth1 host 172.16.7.206 and port 80 -w /tmp/xxx.cap ---抓取所有经过网卡1,主机为172.16.7.206的端口80的网络数据并存储
  9. 2.3 基于协议过滤
  10. tcpdump -n icmp and dst host 8.8.8.8
  11. tcpdump -i eth1 udp port 1234 ---抓取端口1234UDP数据
  12. tcpdump src 192.168.221.2 and tcp port 22

3. OSI 7层模型

应用层: 数据—电影1G
表示层: 加密/解密 压缩处理/解压缩
会话层: 建立 维护会话 A - B
传输层: 分段 重组
网络层: 路由协议 负责将不同网络中的数据进行传输—路由器-3层设备
数据链路层: 负责将同一局域网中不同主机的数据进行传输—交换机-2层设备
物理层: 定义一些物理连接介质的标准 网线 光纤

4. TCP/IP模型

12、网络管理 - 图2

5. 传输层协议

TCP 传输控制协议 面向连接 可靠 效率低
UDP 用户报文协议 无连接 不可靠传输协议 效率高

6. TCP三次握手

12、网络管理 - 图3

1、客户端主动打开,发送连接请求报文段,将SYN标识位置为1,Sequence Number置为x(TCP规定SYN=1时不能携带数据,x为随机产生的一个值),然后进入SYN_SEND状态。
2、服务器收到SYN报文段进行确认,将SYN标识位置为1,ACK置为1,Sequence Number置为y,Acknowledgment Number置为x+1,然后进入SYN_RECV状态,这个状态被称为半连接状态。
3、客户端再进行一次确认,将ACK置为1(此时不用SYN),Sequence Number置为x+1,Acknowledgment Number置为y+1发向服务器,最后客户端与服务器都进入ESTABLISHED状态。

7. TCP 四次挥手

12、网络管理 - 图4

1、客户端发送一个报文给服务端(没有数据),其中FIN设置为1,Sequence Number置为u,客户端进入FIN_WAIT_1状态
2、服务端收到来自客户端的请求,发送一个ACK给客户端,Acknowledge置为u+1,同时发送Sequence Number为v,服务端年进入CLOSE_WAIT状态
3、服务端发送一个FIN给客户端,ACK置为1,Sequence置为w,Acknowledge置为u+1,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态
4、客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务端,Acknowledge置为w+1,Sequence Number置为u+1,最后客户端和服务端都进入CLOSED状态。

8. TCP 11种状态

CLOSED:初始状态,表示TCP连接是“关闭着的”或“未打开的”。
LISTEN :表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。
SYN_RCVD :表示服务器接收到了来自客户端请求连接的SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat很难看到这种状态,除非故意写一个监测程序,将三次TCP握手过程中最后一个ACK报文不予发送。当TCP连接处于此状态时,再收到客户端的ACK报文,它就会进入到ESTABLISHED 状态。
SYN_SENT :这个状态与SYN_RCVD 状态相呼应,当客户端SOCKET执行connect()进行连接时,它首先发送SYN报文,然后随即进入到SYN_SENT 状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT 状态表示客户端已发送SYN报文。
ESTABLISHED :表示TCP连接已经成功建立。
FIN_WAIT_1 :这个状态得好好解释一下,其实FIN_WAIT_1 和FIN_WAIT_2 两种状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1 状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2 状态。当然在实际的正常情况下,无论对方处于任何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1 状态一般是比较难见到的,而FIN_WAIT_2 状态有时仍可以用netstat看到。
FIN_WAIT_2 :上面已经解释了这种状态的由来,实际上FIN_WAIT_2状态下的SOCKET表示半连接,即有一方调用close()主动要求关闭连接。注意:FIN_WAIT_2 是没有超时的(不像TIME_WAIT 状态),这种状态下如果对方不关闭(不配合完成4次挥手过程),那这个 FIN_WAIT_2 状态将一直保持到系统重启,越来越多的FIN_WAIT_2 状态会导致内核crash。
TIME_WAIT :表示收到了对方的FIN报文,并发送出了ACK报文。 TIME_WAIT状态下的TCP连接会等待2*MSL(Max Segment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟,但BSD传统实现采用了30秒,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值),然后即可回到CLOSED 可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(这种情况应该就是四次挥手变成三次挥手的那种情况)
CLOSING :这种状态在实际情况中应该很少见,属于一种比较罕见的例外状态。正常情况下,当一方发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING 状态表示一方发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?那就是当双方几乎在同时close()一个SOCKET的话,就出现了双方同时发送FIN报文的情况,这是就会出现CLOSING 状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT :表示正在等待关闭。怎么理解呢?当对方close()一个SOCKET后发送FIN报文给自己,你的系统毫无疑问地将会回应一个ACK报文给对方,此时TCP连接则进入到CLOSE_WAIT状态。接下来呢,你需要检查自己是否还有数据要发送给对方,如果没有的话,那你也就可以close()这个SOCKET并发送FIN报文给对方,即关闭自己到对方这个方向的连接。有数据的话则看程序的策略,继续发送或丢弃。简单地说,当你处于CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK :当被动关闭的一方在发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK 状态。当收到对方的ACK报文后,也就可以进入到CLOSED 可用状态了。

9. TCP问题

9.1 为什么断开过程是四次? 断开过程可以是三次吗?

关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

9.2 为什么要有time_wait状态?

有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

10. DNS解析原理

12、网络管理 - 图5

11. ARP地址解析

[root@133 ~]# arp
Address HWtype HWaddress Flags Mask Iface
gateway ether 00:50:56:ec:2e:94 C eth0
192.168.221.2 ether 00:50:56:c0:00:08 C eth0

12. IP地址分类

12、网络管理 - 图6

A类 1个网络位 3个主机位 /8
B类 2个网络位 2个主机位 /16
C类 3个网络位 1个主机位 /24

IP地址用10进制表示

13. 子网划分

13.1 子网划分优点

减少网络流量 提高网络性能 简化管理 易于扩大地理范围 子网划分与vlan都可以做到隔离广播域,子网划分是三层隔离,vlan是二层隔离

image.png

14. NAT地址转换

12、网络管理 - 图8

15. Linux添加路由信息

15.1 查看路由表

  1. netstat -r route -n<br />[root@oldboy-xiaodao.com.cn ~]# netstat -r<br /> Kernel IP routing table<br /> Destination Gateway Genmask Flags MSS Window irtt Iface<br /> 0.0.0.0 10.0.0.254 0.0.0.0 UG 0 0 0 eth0<br /> 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

15.2 网络管理扩展软件

yum install -y net-tools

15.3 添加静态路由

  1. centos6 centos7<br />静态默认路由 route add default gw 10.0.0.254 ip route add default via 10.0.0.254<br />静态网段路由 route add -net 223.5.5.0/24 gw 10.0.0.254 ip route add 223.5.5.0/24 via 10.0.0.254<br />静态主机路由 route add -host 223.5.5.5/32 gw 10.0.0.254 ip route add 223.5.5.5/32 via 10.0.0.254

15.4 删除默认路由

route del -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1

15.5 永久添加静态路由(重启不消失)

在/etc/sysconfig/network-scripts/下,新建文件名为route-*的文件,(**代表网卡名)
[root@centos7 ~]# vim /etc/sysconfig/network-scripts/route-eth0
10.15.150.0/24 via 10.10.10.1 dev eth0

10.25.250.0/24 via 10.10.10.1 dev eth0

16. 网卡添加双ip地址

  1. 1.临时添加,重启后失效
  2. ifconfig eth0:1 10.0.0.123/24 up
  3. 2.永久添加
  4. vim /etc/sysconfig/network-scripts/ifcfg-eth0:1
  5. DEVICE=eth0:1 #此处修改
  6. BOOTPROTO=static
  7. BROADCAST=192.168.56.255 #IP地址的广播地址
  8. IPADDR=192.168.56.188 #设置新的IP
  9. NETMASK=255.255.255.0
  10. ONBOOT=yes
  11. systemctl restart network

17. 网卡Bond

17.1 简介

所谓bond,就是把多个物理网卡绑定成一个逻辑上的网卡,使用同一个IP工作,在增加带宽的同时也可以提高冗余性,一般使用较多的就是来提高冗余,分别和不同交换机相连,提高可靠性,但有时服务器带宽不够了也可以用作增加带宽。

17.2 网卡bond的模式

网卡绑定mode共有七种(0~6) bond0、bond1、bond2、bond3、bond4、bond5、bond6。mode 1、5、6不需要交换机设置,mode 0、2、3、4需要交换机设置。
balance-rr (mode=0) 默认, 有高可用 (容错) 和负载均衡的功能, 需要交换机的配置,每块网卡轮询发包 (流量分发比较均衡).
active-backup (mode=1) 只有高可用 (容错) 功能, 不需要交换机配置, 这种模式只有一块网卡工作, 对外只有一个mac地址。缺点是端口利用率比较低
balance-xor (mode=2) 不常用
broadcast (mode=3) 不常用
802.3ad (mode=4) IEEE 802.3ad 动态链路聚合,需要交换机配置
balance-tlb (mode=5) 不常用
balance-alb (mode=6) 有高可用 ( 容错 )和负载均衡的功能,不需要交换机配置 (流量分发到每个接口不是特别均衡)

17.3 Bond6 配置

1、关闭和停止NetworkManager服务

systemctl stop NetworkManager.service # 停止NetworkManager服务
systemctl disable NetworkManager.service # 禁止开机启动NetworkManager服务

2、加载bonding模块

modprobe —first-time bonding
没有提示说明加载成功, 如果出现modprobe: ERROR: could not insert ‘bonding’: Module already in kernel说明你已经加载了这个模块, 就不用管了
你也可以使用lsmod | grep bonding查看模块是否被加载
lsmod | grep bonding
bonding 136705 0

3、创建基于bond0接口的配置文件

vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=Bond
IPADDR=172.16.0.183
NETMASK=255.255.255.0
GATEWAY=172.16.0.1
DNS1=114.114.114.114
USERCTL=no
BOOTPROTO=none
ONBOOT=yes
BONDING_MASTER=yes
BONDING_OPTS=”mode=6 miimon=100”
上面的BONDING_OPTS=”mode=6 miimon=100” 表示这里配置的工作模式是mode6(adaptive load balancing), miimon表示监视网络链接的频度 (毫秒), 我们设置的是100毫秒, 根据你的需求也可以指定mode成其它的负载模式。

4、修改eth0接口的配置文件

DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0 # 需要和上面的ifcfg-bond0配置文件中的DEVICE的值对应
SLAVE=yes
BOOTPROTO=none

5、修改eth1接口的配置文件

DEVICE=eth1
USERCTL=no
ONBOOT=yes
MASTER=bond0 # 需要和上面的ifcfg-bond0配置文件中的DEVICE的值对应
SLAVE=yes
BOOTPROTO=none

6、重启网卡

7、查看bond0的接口状态信息 ( 如果报错说明没做成功,很有可能是bond0接口没起来)

cat /proc/net/bonding/bond0

Bonding Mode: adaptive load balancing // 绑定模式: 当前是ald模式(mode 6), 也就是高可用和负载均衡模式
Primary Slave: None
Currently Active Slave: em1
MII Status: up // 接口状态: up(MII是Media Independent Interface简称, 接口的意思)
MII Polling Interval (ms): 100 // 接口轮询的时间隔(这里是100ms)
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: em1 // 备接口: em0
MII Status: up // 接口状态: up(MII是Media Independent Interface简称, 接口的意思)
Speed: 1000 Mbps // 端口的速率是1000 Mpbs
Duplex: full // 全双工
Link Failure Count: 0 // 链接失败次数: 0
Permanent HW addr: 84:2b:2b:6a:76:d4 // 永久的MAC地址
Slave queue ID: 0

Slave Interface: em1 // 备接口: em1
MII Status: up // 接口状态: up(MII是Media Independent Interface简称, 接口的意思)
Speed: 1000 Mbps
Duplex: full // 全双工
Link Failure Count: 0 // 链接失败次数: 0
Permanent HW addr: 84:2b:2b:6a:76:d5 // 永久的MAC地址
Slave queue ID: 0

8、通过ifconfig命令查看下网络的接口信息

17.4 bond4 配置

一、交换机需配置动态链路聚合

  1. ### 配置channel
  2. configure terminal
  3. interface port-channel 10
  4. exit
  5. ### 进入端口模式
  6. interface ethernet 1/1/10
  7. no switchport
  8. channel-group 10 mode active
  9. exit
  10. ### 配置端口
  11. interface ethernet 1/1/11
  12. no switchport
  13. channel-group 10 mode active
  14. exit
  15. ### 保存保存配置
  16. save
  17. write memory

二、配置服务器

网卡eno1,eno2,eno3。eno1为管理口,eno2和eno3绑定,配置bond4。

2.1 配置eno2

  1. vim /etc/sysconfig/network-scripts/ifcfg-eno2
  2. DEVICE=eno2
  3. NAME=eno2
  4. TYPE=Ethernet
  5. ONBOOT=yes
  6. MASTER=bond_mgmt
  7. SLAVE=yes

2.2 配置eno3

  1. vim /etc/sysconfig/network-scripts/ifcfg-eno3
  2. DEVICE=eno3
  3. NAME=eno3
  4. TYPE=Ethernet
  5. ONBOOT=yes
  6. MASTER=bond_mgmt
  7. SLAVE=yes

2.3 配置bond4

  1. vim /etc/sysconfig/network-scripts/ifcfg-bond_mgmt
  2. DEVICE=bond_mgmt
  3. NAME=bond_mgmt
  4. TYPE=Bond
  5. BONDING_MASTER=yes
  6. IPADDR=172.16.32.51
  7. GATEWAY=172.16.32.1
  8. NETMASK=255.255.255.0
  9. DNS1=172.16.32.241
  10. DNS2=172.16.32.243
  11. PEERDNS=yes
  12. ONBOOT=yes
  13. BOOTPROTO=static
  14. BONDING_OPTS="miimon=100 mode=4 xmit_hash_policy=layer3+4"

2.5 一个bond下添加多个IP

  1. vim /etc/sysconfig/network-scripts/ifcfg-bond_mgmt.103
  2. DEVICE=bond_mgmt.103
  3. IPADDR=10.64.212.24
  4. NETMASK=255.255.255.0
  5. BOOTPROTO=static
  6. VLAN=yes

2.6 重启服务,使配置生效:

systemctl network restart

2.7 bonding状态查看:

  1. cat /proc/net/bonding/bond4