目录
1、IP包头的格式
1.1、抓包
1.1.1、图形界面
1.1、tcpdump⭐⭐⭐
1.1.1、iptables
1.1.2、ICMP协议
1.2、抓包的好处
2、路由
2.1、路由器的工作原理
2.2、静态路由
2.2.1、下一跳
2.3、路由表的形成
2.3.1、静态路由
2.3.2、默认路由
2.4、哪些设备有路由表
2.4.1、路由器和交换机的区别
3、静态路由和默认路由的配置
3.1、实现两台主机互通(实验)
3.2、路由器实验(3台电脑之间都可以互相ping通)
3.2.1、使用Cisco Packet Tracer来模拟
3.2.2、用linux来模拟
3.2.3、开启linux的路由功能(⭐⭐⭐)
3.2.4、总结
4、ICMP协议
4.1、ICMP数据的封装过程
使用科莱
[1]数据类型关键字:包括ip、host、port、net、protocol、ether,例如host 192.168.1.1表示这是一台主机,net 192.168.0.0表示这是一个网络地址,port 22指明端口号是22,如果没有指明类型,则默认的类型是host。
[2]数据传输方向的关键字:包括src(source源地址)、dst(destination目的地)、dst or src、dst and src,这些关键字指明了传输的方向,比如src 192.168.1.1说明数据包源地址是192.168.1.1,dst net 192.168.0.0指明目的网络地址是192.168.0.0,默认是监控主机对主机的src和dst,即默认监听本机和目标主机的所有数据。
[3]协议关键字:包括ip、arp、rarp、tcp、udp等,
[4]其他关键字:运算类型的:or、and、not、!;辅助功能型的:gateway、less、broadcast、greater
具体详细的可以查阅这个文章:tcpdump命令使用详解 - howhy - 博客园
网络流量监控工具(只在linux里边使用)。在操作系统里监控网卡的流量。
作用:解决网络上的问题,例如,数据是否到达,里面是否有我们想要的数据。进行故障的分析和排除
(1)-i,interface:指定网卡接口
[root@fttsaxf ~]# yum install tcpdump -y
[root@fttsaxf ~]# tcpdump -i ens33 表示监听本地指定网卡的所有传输数据包
23:02:38.407889 IP fttsaxf.ssh > 192.168.29.1.51469: Flags [P.], seq 47309:47553, ack 0, win 261, length 244
23:02:38.407985 IP 192.168.29.1.51469 > fttsaxf.ssh: Flags [.], ack 47309, win 4103, length 0
23:02:38.454068 IP 192.168.29.1.51469 > fttsaxf.ssh: Flags [P.], seq 0:36, ack 47309, win 4103, length 36
^C
(2)指定抓取源IP地址的包
[root@fttsaxf menu]# tcpdump -i ens33 src host 192.168.29.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
22:20:45.826082 IP 192.168.29.1.54554 > fttsaxf.ssh: Flags [.], ack 3116985185, win 4103, length 0
22:20:45.887184 IP 192.168.29.1.54554 > fttsaxf.ssh: Flags [.], ack 141, win 4102, length 0
(3)只要IP地址中有这个IP地址的包都抓
[root@fttsaxf menu]# tcpdump -i ens33 host 192.168.29.1 # 只要IP地址中有这个IP地址的包都抓
(4)指定抓取某个目的IP的包
[root@fttsaxf menu]# tcpdump -i ens33 dst host 192.168.29.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
22:25:41.059571 IP fttsaxf.ssh > 192.168.29.1.54554: Flags [P.], seq 3117130833:3117131021, ack 3513135714, win 261, length 188
(5)组合使用,即指定端口又指定IP地址。and的优先级比or高。若是有两个条件要使用and连接
[root@fttsaxf menu]# tcpdump -i ens33 dst host 192.168.29.1 and dst port 8000
(6)指定协议抓包,-p
[root@fttsaxf ~]# tcpdump -i ens33 -p icmp # 指定协议为icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
16:47:34.488059 IP 192.168.29.1 > fttsaxf: ICMP echo request, id 1, seq 315, length 40
16:47:34.488122 IP fttsaxf > 192.168.29.1: ICMP echo reply, id 1, seq 315, length 40
16:47:35.496348 IP 192.168.29.1 > fttsaxf: ICMP echo request, id 1, seq 316, length 40
16:47:35.496394 IP fttsaxf > 192.168.29.1: ICMP echo reply, id 1, seq 316, length 40
16:47:36.509739 IP 192.168.29.1 > fttsaxf: ICMP echo request, id 1, seq 317, length 40
(7)域名解析
[root@fttsaxf ~]# tcpdump udp port 53
#监听本机udp的53端口的数据包,udp是dns协议的端口,这也是一个dns域名解析的完整过程
过滤mac地址:ether src
练习:
# 第一题:
[root@fttsaxf ~]# tcpdump -nn -i ens33 icmp or arp
# 第二题:
[root@fttsaxf ~]# tcpdump -i ens33 src host 192.168.0.1 and dst port 80 and tcp
# 第三题:
[root@fttsaxf ~]# tcpdump -nn -i ens33 src host 192.168.0.123 and dst host 114.114.114.114 and dst port 53 and udp
# 这样不会抓到包的,我们可以把src host 后边的IP地址改成自己的。然后用自己的机器来ping www.baidu.com
# 第四题:就是我们第三题的注释的这种情况
# 第五题:
[root@fttsaxf ~]# tcmpdump -i ens33 port 22
# 第六题:
[root@fttsaxf ~]# tcpdump -i ens33 port 22 and src net 192.168.0.0/24
把抓到的包储存到文件中,导出的文件可以使用wireshark打开
[root@fttsaxf rough_book]# tcpdump -i ens33 port 22 -w ./is22.packet
# 这个文件要使用wireshark或者其他的软件打开,cat和vim打开的是乱码的
读取文件里的数据
tcpdump -r is22.packet
是linux里的一个防火墙工具
[不允许别的IP地址ping自己]
[root@fttsaxf menu]# iptables -A INPUT -p icmp -j DROP
# 在网络层截断。判断依据是,当数据传到网络层的时候,发现这个IP地址是自己,然后又在网络层,内核就直接把这个包丢掉(DROP),不往上传了。
# 使用抓包工具能够抓到发送过来的请求包,所以就ping不通
[root@fttsaxf ~]# 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
17:14:09.394942 IP 192.168.29.1 > fttsaxf: ICMP echo request, id 1, seq 334, length 40
17:14:14.108488 IP 192.168.29.1 > fttsaxf: ICMP echo request, id 1, seq 335, length 40
17:14:19.100707 IP 192.168.29.1 > fttsaxf: ICMP echo request, id 1, seq 336, length 40
17:14:24.114495 IP 192.168.29.1 > fttsaxf: ICMP echo request, id 1, seq 337, length 40
请求包: echo request;相应包:echo reply
[只允许某个IP能ping,其他的都不能]
# 允许源IP地址是192.168.0.189的机器ping本机;
# -A INPUT,在进来的位置添加规则 qppend
# -s 192.168.0.189 指定源IP地址 source
# -p icmp,指定协议是icmp protocol
# -j ACCEPT 采取的动作是接受
[root@fttsaxf menu]# iptables -A -s 192.168.0.189 INPUT -p icmp -j ACCEPT
[root@fttsaxf menu]# iptables -A INPUT -p icmp -j DROP
[root@fttsaxf ~]# iptables -L # 查看防火墙里的规则。排在上边的优先级高
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 192.168.29.129 anywhere
DROP icmp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@fttsaxf ~]# iptables -F # 清除防火墙规则
可能到这里有人会想都ping不通,为什么tcpdump还能抓到包呢?
数据从网卡出来,经过kernel解封装,然后送到应用层。因为我们kernel从网卡接收到了数据,但是在解封装的过程中发现了这个ping的IP地址不是192.168.0.189,就直接丢掉了所以nginx(代表应用层)就拿不到数据了。所以就不会响应这个数据,即ping不通。但是我们tcpdump是主动调用系统调用一直去找kernel要数据,即从kernel里边dump一份出来,所以tcpdump就能看到这个包,但是应用层不知道,即ping不通。下面这段代码也可以这样解释。
# 不允许访问80端口了,访问的话,包会被丢掉
[root@fttsaxf ~]# iptables -A INPUT -p tcp --dport 80 -j DROP
[root@fttsaxf ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:http
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
(1)那么这种情况下是否可以ping通服务器? (2)网页的请求包是否到达服务器?
(1)答,能ping通。因为在封装和解封装的时候,数据解封装到网络层就可以了,而80端口在传输层。所以能够ping通
在网络层。 ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议卒的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络不通不通、主机是否可达、路由是否可用等网络本身的消息。
了解数据的封装,数据是否到达了。
-p,指定协议
首先让别人ping自己,然后输入下面这个命令。抓别人发过来自己的包。
-n/-nn,数字形式显示(取消域名显示)。只抓某个IP的包
路由(route):跨越从源主机到目的主机的一个互联网络来转发数据报的过程
路由器(router):将数据从一个网络(网络)转发到另一个网络(网段)
路由表是放在内存中的
每一行网段和接口组成路由条目
[主机1.1要发送数据到4.1的过程]
路由器收到数据,查看数据包中的目的地址为4.1,查找路由表;路由器A根据路由表转发数据到S0口。
路由器B接收到数据包查看数据包的目标地址,并查找路由表。路由器B根据路由表转发数据到E0口。主机4.1接收到数据包。若是使用1.1这个主机 ping 8.1,路由表中没有这个地址,所以这个A路由器会返回一串英文"大概意思就是目的不可达"给1.1这个主机。若是web访问的话,就直接是显示网页打不开。
路由器根据路由表来转发数据(根据IP包的目的IP地址来做转发的),有相关的路由条目就转发,没有就丢弃。并且,路由器不会扩散广播的。路由表,电脑中就有。电脑中输入"route print"就会打印出路由表。(ctrl + r)输入"cmd"启动。
[细节]
交换机不会动包里的东西,它只负责转发。路由器会动包里的东西。数据在传播的过程中一路伴随着arp广播的。
这里路由器只是修改了MAC地址
"ip route add 192.168.99.0/24 via 192.168.0.2 dev ens33"
下一跳就是"192.168.0.2"
目的网段是192.168.99.0/24
dev ens33 从ens33这个接口送出去
下一次数据该送给谁,对方路由器的IP地址。如上边那个命令的下一跳就是"192.168.0.2"
可以是自己的接口名字也可以是对方路由器的IP地址。IP地址可以在整个互联网使用,mac地址在局域网使用。IP地址在整个传输流程不会改变,但是mac地址会一直改变。
(1)直连路由(2)静态路由:人添加进去的(3)动态路由:是路由器自己学习的,rip、ospf(4)默认路由:特殊的静态路由
各种路由的优先级:直连路由、静态路由、动态路由、默认路由
非直连的网段,如果需要转发数据过去,就需要我们配置路由
2.3.1、直连路由
直连路由:给接口配置IP地址,同时接口的状态是up的(启用) ,就能形成直连路由
[root@fttsaxf ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.29.2 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
192.168.29.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
由管理员手工配置的,是单向的;缺乏灵活性
当路由器在路由表中找不到目标网络的路由条目时,路由器把请求转发到默认路由接口。特殊的静态路由,适合于末节网络,去任何地方都走这条路由。配置默认网关其实就是添加一条默认路由
(1)路由器(2)电脑(3)手机(4)三层交换机(需要配置IP地址)(5)防火墙(其实就是一台安装了安全软件的电脑,具有路由功能和VPN功能),可以对进出的数据进行检查
在linux中要在静态路由的配置命令前边加一个"add";默认路由配置中,前四个0可以理解为子网,后四个0可以理解为子网掩码
[图形模拟器]
路由器与路由器相连用交叉线;pc2的网关是192.168.100.254,pc3的网关是192.168.200.254;r1路由器先把它启动(勾选'on'),IP地址是192.168.100.254。
查看router2的路由
查看router3的路由
用pc2'ping'192.168.20.1,能够通信;因为当pc2发现192.168.20.1不是和自己一个网段的就会查自己的路由表,然后送给"192.168.100.254/24"这个接口,这个接口收到之后,发现20.1就是自己的接口,然后送到20.1。送到之后,这个响应又能够回到pc2,这才能够算一个通信。
那我们用pc2"ping"192.168.20.2/24是否能够通信?答案是不能的,虽然我们能够把信息发给20.2。但是这个20.2的响应不能够回送到pc2,因为router3没有与20.1这个网段直连的路由。所以就不能够算是通信。但是我们在router3添加一个静态路由就能能够实现通信。即只要加一条回来的路由就能够通信。
图中"192.168.100.0/24 via 192.168.20.1"表示要想到达192.168.100.0要经过192.168.20.1
那么我们使用pc2 ping "192.168.200.254/24"能不能通信?答案是不能的。因为router2不知道192.168.200.254怎么走,所以信息传不过去。所以我们要在router2中添加一条静态路由,如下图。
所以只要是跨网段通信,先查询自己的路由表。需要考虑送过去,还要考虑回来。
做完这些之后,这里所有的设备都能够互相通信。
[配置过程]
第一步:给电脑配置IP
先给p4配置IP地址和网关,pc的都依次类推
第二步:给路由器接口配置IP
然后给router7的接口激活,然后配置接口0和接口1的IP地址。其他的路由器依次类推进行配置
然后给核心路由器配置,首先你需要把这个开关打开,才能配置
给接口0配置IP地址,按照图中指示依次给1和2接口配置IP地址
第三步:添加静态路由或者默认路由
给router5配置默认路由,依次给其他的外围路由配置默认路由。这样配置表示不管去哪里,都把信息给核心路由器。
但是中间这个核心路由器不知道外围的三个网段, 不直连的网段都要加静态路由,所以要添加三条静态路由。
查看路由器的路由信息
"S",表示静态路由。"C",表示直连路由
第四步:验证
用pc6 ping 自己
用pc6 ping 它的网关(192.168.30.2 )
用pc6 ping 192.168.50.1
用pc6 ping 192.168.10.1
图片出现丢包的原因是因为是模拟器,所以有时候第一个包会丢的。再ping一次就没事了。
用pc6 ping 192.168.20.1
[排除方法]
(1)检查IP地址配置是否正确(2)检查路由器的IP地址和路由器是否配置正确(3)分段ping,一段一段的检查网络是否通
[结果查看]
准备:要准备两台有两块网卡的虚拟机
[添加网卡]
用桥接就表示它们连在一个交换机上边。
查看跳板机的网卡 (跳板机只是一个虚拟机的名字 )
和要求的不一样,所以要进行修改网卡的IP地址
若是要修改IP地址可以参考
7、linux——文件内容查看命令(推荐书籍、xshell里不能使用小键盘问题、cat、top、du、time、手工配置ip地址、head、tail、less、more、pas aux、sed)_FanMY_71的博客-CSDN博客_vim 小键盘
中的第九点"手工配置静态IP地址"。
另外若是我们添加了网卡且没有在'/etc/sysconfig/network-scripts/'中看到这个网卡名的文件夹,那么要进行手动添加,步骤如下:
配置完之后,要让配置重新生效要使用"service network restart"(centos7中使用这个命令重启网络,让新的配置生效),若是centos8的就使用"ifup ens33"
查看一下两个网卡的配置和查看路由表(这是shediao-nginx虚拟机的设置)
另外在一般在LAN口中不配置网关和dns,只在WAN口中配置网关和dns
这里有一条默认路由,一般建议添加在WAN口上
这个docker1虚拟机中做内网,配个192.168.90.2/24的IP地址和192.168.90.1的网关
用docker1来 ping192.168.90.1和192.168.0.100
再用docker1 ping 192.168.0.190,不通。
是因为没有回来的线路。所以要在跳板机中添加静态路由,使用以下命令添加路由
(若是想要删除路由,输入"ip route del + 目标网段")
当我们继续用docker1 ping 192.168.0.190,会通吗?答案还是不会,因为原因可能是你没有关闭linux里的防火墙
继续 ping,还是不通。这是因为"shediao-nginx"这台机器没有开启路由功能。所以,linux要想做为路由器使用,必须要使用命令开启路由功能。为了这个实验所有的机器都能够互相通信,跳板机也必须开启路由功能。
那么怎么开启linux的路由功能呢?
使用"echo 1 >/proc/sys/net/ipv4/ip_forward",这是只是临时开启路由功能。
这个时候,我们用docker1 ping 192.168.80.1,发现还是ping不通。我们可以滑到上边去看shediao-nginx的路由表,会发现当我们ping 80 这个网段的时候,在路由表中找不到这个网段。这是因为之前这个虚拟机的默认路由也是到192.168.0.1。所以直接导致丢包。
所以要在shediao-nginx中加一条静态路由
所以这样之后,我们要知道,没有直连的网段都要加路由。这样,这个实验就完成了
其实这个实验真正的样子是两台虚拟机之间还要加一个交换机,我们这里因为是桥接模式,所以就等价于有一台交换机。
临时开启:echo 1 >/proc/sys/net/ipv4/ip_forward。在linux里开启路由功能之后,linux就是路由器
[root@fttsaxf ~]# cat /proc/sys/net/ipv4/ip_forward
0 # 默认情况下这个值是为0的表示Linux的路由功能是关闭的。
[root@fttsaxf ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@fttsaxf ~]# cat /proc/sys/net/ipv4/ip_forward
1 # 为1,表示linux的路由功能是开启的。
永久修改:修改"/etc/sysctl.conf"文件
[root@fttsaxf network-scripts]# vim /etc/sysctl.conf
[root@fttsaxf network-scripts]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
#net.ipv4.ip_forward = 1 # 开启Linux的路由器功能,这是修改了内核参数。
[root@fttsaxf network-scripts]# sysctl -p # 让内核重新读取这个参数,重新设置
难度在于:
(1)要给三台linux服务器配置IP地址
(2)开启路由功能
(3)添加静态路由
(4)测试ping
注意:要关闭router上的firewalld服务和selinux。命令如下
永久关闭selinux为修改"/etc/selinux/config"文件中的"SELINUX"为disabled,但是这种方法修改是需要重启系统的;临时关闭selinux不需要关闭。"systemctl disable firewalld"是让开机的时候不启用防火墙。
另外!
重启网络服务,会导致更新路由表,我们手工添加的静态路由会失效,手工开启的路由功能会自动关闭
[配置网卡注意事项]
若是配置网卡的时候, BOOTPROTO为"dhcp"且又有IPADDR静态IP地址的话
会出现这块网卡有两个IP地址(centos8中)
[网络配置注意事项]
centos8中只需要ifup + 网卡就能够重启网卡;但是centos7必须要先关闭,然后再启动。
不要ifdown ens33(即把 正在连接的网卡禁用),网络接口如果被禁用会导致ssh远程连接中断。
[网络虚拟化导致的问题,因为我是用的是虚拟机]
如上图,我们用lamp-test这个路由(虚拟机),指定从ens37这个接口ping 192.168.38.2。我们能够使用抓包工具,抓到来自192.168.27.2(ens37这个接口)发过来的ping包,且这个地址也给我们指定的接口回了一个数据包,但是我们的这个接口并没有接到。所以就ping不通。因为虚拟机的问题(虚拟机问题导致ens37也连在了交换机上)导致了这种情况的发生,真实来说其实这个地址得不到这个接口发过来的ping包。
若是我们用真实的机器去ping 192.168.27.1,是不通的。因为真实机器里没有这个路由地址,所以我们不能使用ssh去配置。真实机器添加了就行,下面是真是机器添加路由的命令
shediao不能上网,是因为H3C没有回来的路由且这是桥接模式。
若是想要ping通且上网,我们可以这样
这是一条NAT策略,表示数据出去的时候,只要是192.168.27网段的,全部把原IP地址修改为192.168.0.164。做了这个操作的时候,这样就能上网了。
[添加静态路由的格式以及各选项作用]
ip route add + 网段 via + 下一跳 dev + 接口
友友们一定要自己学会这个配置网卡且了解机器互通的知识点,很重要很重要很重要!
ICMP协议属于网络层协议
头部中有两种类型,一种是request,一种是reply。