4_计算机网络_数据转发-ARP-ICMP-NAT-网卡模式-tcpdump

1、ping过程分析

案例一

在这里插入图片描述
ping 192.168.3.1

  • PC0
    数据从网络层icmp协议的封装开始,封装好后携带请求报文(数据类型为8)、数据,到了ip协议封装的时候,封装源ip、目的ip(查路由表);
    数据链路层,封装源mac、目的mac(先查路由表,确定走什么路由,这里走的是默认路由。后查看arp缓存表,没有对应的mac就会发arp广播,即arp请求报文);
    源mac:11 目的mac:22
    电脑里面是没有mac地址表的,此时的mac是arp缓存表里面的。

  • switch1
    对帧进行查看,交换机先看源mac在mac地址表里面有没有,没有就先学习。后转发目的mac,目的mac在mac地址表里面如果没有的话就广播,有的话就单播转发。

  • route0
    解封装。看到目的mac是route0的mac地址, 路由器就接收。后查看目的ip是192.168.3.1,查路由表做路由转发,如果没有到达3.1网段的路由,没有就丢包,有就走(添加了一条到3.0的静态路由)。根据静态路由的下一跳地址得到下一跳地址的mac(没有就arp广播)。
    重新封装帧——源mac:66 目的mac:77
    交换机不修改帧,路由器修改了帧

  • route2
    帧的解封装:查看目的mac是不是自己的77,是的话就接收。
    ip包:看目的ip是到达3.1,查路由表有没有到达3.1网段的路由,走直连路由。查看arp缓存表看有没有3.1的mac,有就单播,没有就广播。后重新封装帧——源mac:88 目的mac:99
    数据从路由器的哪个口出去,源mac就用那个口的mac地址

  • switch2
    route2的数据到达交换机后,交换机根据mac地址表做转发。

  • PC1
    数据包到达pc1后解封装,查看mac地址就是自己,看网络层的目的ip也是自己,都会接收,再解封装看icmp协议数据,发现是请求报文,数据类型为8,准备封装数据回复PC0。
    回去的过程和来的过程基本一样,只有icmp封装的数据不一样(响应报文,数据类型为0)
    在这里插入图片描述

案例二

本机ip:192.168.0.237/24
ping 192.168.90.1 的过程分析

1.拿目的ip 192.168.90.1和自己的子网掩码进行与运算,得到目的网段192.168.90.0
2.查看本机的路由表,是否有到达这个网段的路由
走默认路由
下一跳地址 192.168.0.1
3.查看arp缓存表里是否有下一跳地址 192.168.0.1的mac地址,如果有就直接封装帧,没有呢?发arp广播获得192.168.0.1的mac地址
4.得到了mac地址后,封装好数据,走物理层送出数据

如何获得整个局域网里的所有正在使用的ip地址对应的mac地址?
ping 192.168.0.1~254

[root@sc-mysql network-scripts]# arp -a|tr -d "()"|grep -v  incomplete |awk  '{print $2,$4}'  # 获取arp缓存表里面所有ip和对应的mac地址
192.168.0.36 ac:07:5f:93:ba:3c
192.168.0.2 64:6e:97:66:1e:c4
192.168.0.99 00:e0:4c:26:5b:68
192.168.0.1 3c:f5:cc:49:16:04
192.168.0.237 00:e0:4c:24:b5:81
192.168.0.10 46:69:5c:ef:e2:c7
192.168.0.66 ac:d6:18:06:66:1b

2、ARP协议

arp报文

1.请求报文 request
		广播
2.响应报文  response
		单播

为什么说arp请求包是广播?响应包是单播?
arp协议在网络层,数据链路层帧的封装用到了FF:FF:FF:FF:FF:FF, 交换机认为它是广播包。
arp协议里面,所有的ip和mac地址都是具体的,帧层面mac也是具体的,不牵扯到广播行为,根据mac地址表进行转发。

过程

arp协议的封装 --》电脑和路由器查看
		目的mac:  00:00:00:00:00:00  -->表示我需要目的mac
		目的ip:192.168.0.29
		源mac:  A4:1A:3A:38:8D:2A  
		源ip:192.168.0.4

帧的封装: 交换机查看,电脑和路由器
		 目的mac:  FF:FF:FF:FF:FF:FF    -->表示我需要目的mac
		 源mac:  A4:1A:3A:38:8D:2A  	

arp相关命令

arp -a: 查看arp缓存表
arp -d:清除arp缓存
arp -s: arp绑定(将某个ip与mac绑定)

[root@sc-mysql network-scripts]# arp -d 192.168.0.36
[root@sc-mysql network-scripts]# arp -s 192.168.0.1 3c:f5:cc:49:16:04
[root@sc-mysql network-scripts]# arp -a
? (192.168.0.36) at <incomplete> on ens33
? (192.168.0.199) at <incomplete> on ens33
? (192.168.0.2) at 64:6e:97:66:1e:c4 [ether] on ens33
? (192.168.0.99) at 00:e0:4c:26:5b:68 [ether] on ens33
_gateway (192.168.0.1) at 3c:f5:cc:49:16:04 [ether] PERM on ens33  --》静态的arp记录

arp病毒

让局域网里的机器找不到正确的网关对应的mac地址
欺骗: 让你的arp缓存表里的网关的mac地址发生变化,使用它告诉你的新的mac地址
防范措施
.安装防火墙(静态绑定正确的网关的mac地址)
.抓包工具分析出病毒源
.静态绑定正确的网关的mac地址

多个网卡配置了多个默认网关,导致不能上网?
一个电脑不要配置2个默认网关(其实就是2条默认路由),会导致走错路的,导致上不了网。
解决办法就是:只有一个网卡配置网关就可以了

ip地址不能和网关冲突,如果冲突会导致其他的电脑会得到冲突的ip的mac地址,导致不能上网了
网关的ip地址是和你的接口的ip地址在同一个网段的; 下一跳地址(网关的地址) 是你的ip地址在同一个网段的

linux里的
tracepath 是路由追踪的命令: 可以知道从我们的电脑到目的地主机,经过哪些路由器 trace -n www.baidu.com
windows里的
E:>tracert www.baidu.com

[root@sc-mysql network-scripts]# ip route
default via 192.168.0.1 dev ens33 proto static metric 106   --》metric值小的优先级要高
default via 192.168.20.1 dev ens37 proto static metric 107 
192.168.0.0/24 dev ens33 proto kernel scope link src 192.168.0.133 metric 106 
192.168.20.0/24 dev ens37 proto kernel scope link src 192.168.20.254 metric 107 

route print :windows查看路由表

E:\>route print  在windows里查看路由表
===========================================================================
接口列表
 14...00 ff 14 43 2b be ......TAP-Windows Adapter V9
 11...00 e0 4c 24 b5 81 ......Realtek PCIe FE Family Controller
 12...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1
 13...00 50 56 c0 00 08 ......VMware Virtual Ethernet Adapter for VMnet8
  1...........................Software Loopback Interface 1
===========================================================================

IPv4 路由表
===========================================================================
活动路由:
           网络目标        网络掩码          网关         接口              跃点数(metric)
          0.0.0.0          0.0.0.0      192.168.0.1    192.168.0.237       276
        127.0.0.0        255.0.0.0            在链路上         127.0.0.1    306
        127.0.0.1  255.255.255.255            在链路上         127.0.0.1    306
  127.255.255.255  255.255.255.255            在链路上         127.0.0.1    306
      192.168.0.0    255.255.255.0            在链路上     192.168.0.237    276
    192.168.0.237  255.255.255.255            在链路上     192.168.0.237    276
    192.168.0.255  255.255.255.255            在链路上     192.168.0.237    276
     192.168.88.0    255.255.255.0            在链路上      192.168.88.6    276

0.0.0.0 0.0.0.0 代表任意ip地址,任意的子网掩码
如何判断ip地址是否冲突?
接口就是网卡
-I 指定接口 interface

[root@sc-mysql network-scripts]# arping -I ens33  192.168.0.1
ARPING 192.168.0.1 from 192.168.0.133 ens33
Unicast reply from 192.168.0.1 [3C:F5:CC:49:16:04]  5.340ms
Unicast reply from 192.168.0.1 [3C:F5:CC:49:16:04]  1.628ms
Unicast reply from 192.168.0.1 [3C:F5:CC:49:16:04]  7.291ms
^CSent 3 probes (1 broadcast(s))
Received 3 response(s) 

在这里插入图片描述

不能arping自己的ip地址

[root@sc-mysql network-scripts]# arping -I ens33  192.168.0.133
ARPING 192.168.0.133 from 192.168.0.133 ens33
^CSent 11 probes (11 broadcast(s))
Received 0 response(s) 

3、ICMP协议

**定义:**互联网控制报文协议(Internet Control Messages Protocol)
ICMP是一个“错误侦测与回馈机制”,是通过IP数据包封装的,用来发送错误和控制消息 --》用来探测网络是否通畅的
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。

ICMP头部内容:类型、数据
数据包的类型: 请求包 类型8;响应包 类型
封装层次图
在这里插入图片描述

头部封装:8个字节
icmp头部封装会消耗8个字节的空间
icmp协议的封装里面数据的多少实际没有什么价值。从网络安全的角度来讲有一定的价值,ping的时候携带的数据越多回复的也越多(ping之死)。
ping之死: 利用了icmp协议,必须要回复对方,而且对方给你发多少数据多少个包,你就要回复多少数据多少个包。
目前已经被内核修复。

[root@slave-mysql ~]# ping  -s 100  192.168.0.1    # size 100个字节数据+8字节icmp头部   
PING 192.168.0.1 (192.168.0.1) 100(128) bytes of data.
108 bytes from 192.168.0.1: icmp_seq=1 ttl=128 time=10.7 ms
108 bytes from 192.168.0.1: icmp_seq=2 ttl=128 time=12.2 ms
108 bytes from 192.168.0.1: icmp_seq=3 ttl=128 time=1.17 ms
108 bytes from 192.168.0.1: icmp_seq=4 ttl=128 time=9.12 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3023ms
rtt min/avg/max/mdev = 1.169/8.300/12.184/4.258 ms
[root@slave-mysql ~]# 
[root@slave-mysql ~]# ping  -s 1000  192.168.0.1
PING 192.168.0.1 (192.168.0.1) 1000(1028) bytes of data.
1008 bytes from 192.168.0.1: icmp_seq=1 ttl=128 time=5.08 ms
1008 bytes from 192.168.0.1: icmp_seq=2 ttl=128 time=6.99 ms
1008 bytes from 192.168.0.1: icmp_seq=3 ttl=128 time=7.80 ms
# 通过设置防火墙规则,禁止icmp协议过来
[root@slave-mysql ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP 
# 单独放行,允许某个ip通过
[root@slave-mysql ~]# iptables -I INPUT -s 192.168.0.237 -p icmp --icmp-type 8 -j ACCEPT

在这里插入图片描述
系统和内核的关系:是车和发动机的关系

[root@localhost ~]# uname -a  # 查看内核版本(全)
Linux localhost.localdomain 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# uname -r # 查看内核版本
4.18.0-240.el8.x86_64  #4.18.0大版本  240小版本 el8企业版(enterprise linux8) x86_64设计架构
[root@localhost ~]# cat /etc/centos-release # 查看系统版本
CentOS Linux release 8.3.2011

4、NAT

Linux系统内部有一个内核(kernel),对tcp、ip协议族——》netfilter模块(专门对进出系统的数进行过滤)
iptables 是给netfilter模块传递参数的一个工具
iptables 防火墙的传参工具

iptables和netfilter的关系?
在这里插入图片描述

4.1 NAT的工作原理

Network Address Translation 网络地址转换

NAT解决了ipv4地址不足的问题,隐藏了局域网的地址。
将私有转公有,公有转私有。
再者要换ipv6的话设备要支持新的协议,协议就是一个软件,需要在原来的交换机、路由器、电脑上面安装这个软件,让全球的设备都支持ipv6都要换,成本高。所以ipv4目前仍然是主流的。

私网:
A类:10.
B类:172.16~172.31
C类:192.168.

linux网关服务器:理解为就是一台路由器
NAT功能是通过netfilter模块实现的,iptables是给netfilter传递参数

4.2 SNAT

SNAT(源地址转换):目标地址不免,改写源地址,实现内网多用户使用同一个公网IP上网的情况。

SNAT 解决了什么问题?
让局域网的电脑能够连到外网上网,共享一个公网ip。
(站在用户的角度,帮助用户上网的)

在这里插入图片描述
源ip为什么会自动转换?
linux的内核里的netfilter模块里面,有一个nat 转换表(映射表)。

静态转换

什么时候私网IP与公网ip能够一一对应?
云服务器,一个服务器一个公网,只能一个ip使用
一个主机出去的时候 对应一个公网ip。NAT映射表里面记录了局域网ip和公网ip的映射。只适用于有很多公网ip地址的场景;

在这里插入图片描述

动态转换PAT

共享一个公网ip,通过端口号区别;
TCP的封装格式:源端口号(16位)、目标端口号(16位)、

在这里插入图片描述

SNAT实验演示

在这里插入图片描述

如何开启路由转发功能:
1.临时开启

	0 表示内核里的路由转发功能是关闭的
	1 开启的
[root@sc-mysql ~]# echo  1 >/proc/sys/net/ipv4/ip_forward
[root@sc-mysql ~]# cat  /proc/sys/net/ipv4/ip_forward
0
[root@sc-mysql ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@sc-mysql ~]# cat  /proc/sys/net/ipv4/ip_forward
1

2.永久开启

[root@sc-mysql ~]# vim /etc/sysctl.conf  
net.ipv4.ip_forward=1 -->添加配置,开启路由转发功能
[root@sc-mysql ~]# 
[root@sc-mysql ~]# sysctl -p  让内核重新加载新的配置,开启路由转发功能
net.ipv4.ip_forward = 1

如何添加使用SNAT策略的防火墙规则

开启snat功能
iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o ens33 -j SNAT --to-source 192.168.0.133

-t nat 指定在nat表里操作
-A POSTROUTING 在POSTROUTING位置追加一条规则 append
-s 192.168.66.0/24 指定从防火墙过的数据包里的源ip地址来自 192.168.66.0/24 网段
-o ens33 从ens33接口出去 out-interface
-j SNAT 采取SNAT策略,进行源ip地址的转换
–to-source 192.168.0.133 将ip包里的源ip地址修改为192.168.0.133

[root@sc-mysql ~]# iptables -t nat -L -n  查看nat表里的规则  table   list -n 以数字形式显示

最后编写成脚本

#!/bin/bash
# 关闭防火墙
service firewalld stop
#清除原来iptables里的防火墙规则
iptables -F
iptables -t nat -F
#添加开启路由功能
echo  1 >/proc/sys/net/ipv4/ip_forward
#开启snat功能
iptables  -t nat  -A POSTROUTING -s 192.168.66.0/24  -o ens33  -j SNAT --to-source 192.168.0.133

为什么此刻数据出得去同时也回得来呢?
出去的时候,源ip已经换成了外网卡(WAN口)的ip地址,外网口是0网段的

4.3 DNAT

DNAT(目标地址转换):源地址不变重新修改目标地址。
DNAT 解决了什么问题?
在Internet中发布位于企业局域网内的服务器
在Internet中发布内网的服务器
将内网的服务器发布到外网
(站在企业的角度将服务器发布出去)
发布: 公开出去,将一个网络里的服务器发布出来让另外的网络能够访问
发布 背后是对内部资源的管控
在这里插入图片描述
DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标IP地址

DNAT实验演示

步骤:
1.内网的服务器配置后ip和网关,dns,关闭防火墙
2.内网的服务器搭建好web服务,启动nginx
3.网关服务器开启路由功能配置好dnat策略

iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport  80 -j DNAT --to-destination 192.168.1.6

-t nat 指定nat表里操作
-A PREROUTING 在 PREROUTING位置追加一条规则 append
-i eth0 从eth0接口进入系统 in-interface
-d 218.29.30.31 目的ip地址
-p tcp 传输层采用tcp
–dport 80 目的端口
-j DNAT 采取DNAT策略
–to-destination 192.168.1.6 修改目的ip为192.168.1.6

最后编写成脚本,将snat、dnat合在一起

[root@slave-mysql ~]# cat snat_dnat.sh 
#!/bin/bash
iptables -F
iptables -t nat -F

#stop firewalld service
service firewalld stop

#open routing function
echo  1 > /proc/sys/net/ipv4/ip_forward

#setting  snat policy
iptables  -t  nat  -A POSTROUTING  -s 192.168.88.0/24  -o ens33  -j SNAT --to-source 192.168.0.127

#setting dnat policy
iptables -t nat -A PREROUTING   -d 192.168.0.127 -p tcp --dport 80  -i ens33 -j DNAT  --to-destination 192.168.88.27

DNAT如何发布内网不同的服务器呢?
使用不同的端口号来对应内网不同的ip地址服务器

iptables -t nat -A PREROUTING   -d 192.168.0.127 -p tcp --dport 80  -i ens33 -j DNAT  --to-destination 192.168.88.27
iptables -t nat -A PREROUTING   -d 192.168.0.127 -p tcp --dport 80  -i ens33 -j DNAT  --to-destination 192.168.88.27:80
iptables -t nat -A PREROUTING   -d 192.168.0.127 -p tcp --dport 8080  -i ens33 -j DNAT  --to-destination 192.168.88.88:8080
iptables -t nat -A PREROUTING   -d 192.168.0.127 -p tcp --dport 3306  -i ens33 -j DNAT  --to-destination 192.168.88.136:3306
iptables -t nat -A PREROUTING   -d 192.168.0.127 -p tcp --dport 2233  -i ens33 -j DNAT  --to-destination 192.168.88.27:22

dnat修改ip包的目的ip地址,还可以修改tcp或者udp里的目的端口号

5、网卡的3种模式

网络适配器Network adapter——》就是网卡
电源适配器——》充电器

VMware Network Adapter VMnet1 hostonly模式
VMware Network Adapter VMnet8 nat模式
VMnet0 桥接模式

hostonly模式:仅主机模式,虚拟机只能跟正式的主机通信
模拟出一个交换机,只能和自己正式机器通信,没有别的路由器转发到别的电脑里面去。
虚拟机没有配网关,路由器也没有转发。
nat模式
桥接模式:虚拟机可以和本机通信,也可以和局域网里面其他桥接模式的虚拟机通信。虚拟机和真实机器一样,和真实机器在相同网段,和外界一样能通信。

在这里插入图片描述

6、tcpdump抓包工具

抓包的好处:了解数据的封装,看是否到达

-i选项 : 指定网卡接口 interface

[root@localhost ~]# tcpdump -i ens33 src host 192.168.169.169
20:11:07.683723 IP 192.168.169.169.ssh > 192.168.169.1.50885: Flags [P.], seq 3837597749:3837597829, ack 1880647664, win 306, length 80
20:11:08.142699 IP 192.168.169.169.ssh > 192.168.169.1.50885: Flags [P.], seq 80:144, ack 65, win 306, length 64

-v选项:更详细的信息

[root@localhost ~]# tcpdump -i ens33 src host 192.168.169.169 -v
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
20:28:13.428652 IP (tos 0x10, ttl 64, id 33621, offset 0, flags [DF], proto TCP (6), length 120)
    192.168.169.169.ssh > 192.168.169.1.50885: Flags [P.], cksum 0x6cda (correct), seq 3837598581:3837598661, ack 1880647856, win 306, length 80
20:28:14.304633 IP (tos 0x10, ttl 64, id 33622, offset 0, flags [DF], proto TCP (6), length 120)
    192.168.169.169.ssh > 192.168.169.1.50885: Flags [P.], cksum 0x19f7 (correct), seq 80:160, ack 65, win 306, length 80
20:28:15.198668 IP (tos 0x10, ttl 64, id 33623, offset 0, flags [DF], proto TCP (6), length 104)
    192.168.169.169.ssh > 192.168.169.1.50885: Flags [P.], cksum 0x5761 (correct), seq 160:224, ack 129, win 306, length 64 

-p 指定协议,icmp,arp

[root@localhost ~]# tcpdump -i ens33 -p icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
20:38:32.448626 IP 192.168.169.169 > localhost.localdomain: ICMP echo request, id 23180, seq 1, length 64
20:38:32.448694 IP localhost.localdomain > 192.168.169.169: ICMP echo reply, id 23180, seq 1, length 64
20:38:33.448937 IP 192.168.169.169 > localhost.localdomain: ICMP echo request, id 23180, seq 2, length 64
20:38:33.448964 IP localhost.localdomain > 192.168.169.169: ICMP echo reply, id 23180, seq 2, length 64
20:38:34.451364 IP 192.168.169.169 > localhost.localdomain: ICMP echo request, id 23180, seq 3, length 64
20:38:34.451388 IP localhost.localdomain > 192.168.169.169: ICMP echo reply, id 23180, seq 3, length 64
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个手刹不太灵儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值