计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程

news/2024/5/18 16:55:14

目录

network 和 NetworkManager关系:

实验:编写一个扫描脚本,知道本局域网里哪些ip在使用,哪些没有使用? 使用的ip对应的mac地址都要显示出来

计算机程序执行的两种不同方式:

shell语言编写扫描脚本

思路一:通过ping命令获取在线的IP地址,然后通过截取arp缓存表里的数据获得IP地址对应的mac地址

思路二:通过ping命令获取在线的IP地址,然后对在线的IP地址通过arping命令获取对应的mac地址

python语言编写扫描脚本

路由器(router)

路由器的功能:

路由器的工作原理

步骤:

路由器转发数据包的封装过程

路由表:

查看路由表的方式(Linux):

路由表的方式(Windows)

路由的类型:

常用的路由类型:

1、直连路由   (directly connected)

2、静态路由  (static)                                                         

3、动态路由  (Dynamic)

4、默认路由  (default)

路由的优先级:直连路由  >  静态路由  > 动态路由  >  默认路由

给路由器添加静态路由的命令

ping某网址的过程

PC0(192.168.1.1/24) --》  ping 192.168.1.254

PC0(192.168.1.1/24) --》 ping  192.168.2.1 

故障排除:

1、分层检查

2、分段检查

课后实验:


network 和 NetworkManager关系:

network 是一个给linux机器配置网络参数(ip,子网掩码,dns,网关等)。

NetworkManager 是linux系统里管理所有的网络连接的服务,可以禁用网卡,启用网卡。

network依赖于NetworkManage,NetworkManage将网卡禁用,network服务就没有办法给网卡配置ip地址了


nmcli(network manager  client)是  network manager服务的客户端命令,可以给服务传递参数,进行设置

nmcli n 可以查看网络是否 被禁用

nmcli  n  on  启用网络 
nmcli  n  off 禁用网络

示例:

实验:编写一个扫描脚本,知道本局域网里哪些ip在使用,哪些没有使用? 使用的ip对应的mac地址都要显示出来

IP地址范围(仅供参考):192.168.2.0/24     192.168.2.1 ~ 254
                                    ping   192.168.2.1

使用shell、python或者go去编写局域网扫描工具,获取正在使用的ip和对应的mac地址
告诉哪些ip地址在使用,哪些没有使用?

去了解下,python/go里有哪些类似于ping命令的库(扫描的库)
    ping库
    socket库
    pythonping
    python_arptable
    ipaddress

计算机程序执行的两种不同方式:

串行:  按照顺序进行 --》效率低,耗时比较长
并行:  同时执行   --》效率高,耗时短

shell语言编写扫描脚本

思路一:通过ping命令获取在线的IP地址,然后通过截取arp缓存表里的数据获得IP地址对应的mac地址

[root@sc-server shell]# cat scan_lan.sh 
#!/bin/bash
# lan  network 192.168.1.0  #清空文件
>ip_used.txt
>ip_unused.txt# ping local host
for  i in {1..254}
do(if 	ping -c 1 -w 1 192.168.1.$i  &>/dev/null ;thenecho  "192.168.1.$i is used" |tee -a ip_used.txtelseecho  "192.168.1.$i is not used"|tee -a ip_unused.txt	fi)&
done
wait#统计有多少ip在使用,多少没有使用
num1=$(wc -l < ip_used.txt)
num2=$(wc -l <ip_unused.txt)echo "total ip used number: $num1"
echo "total ip unused number: $num2"
#输出ip和mac的对应关系---》arp缓存表里的内容
arp -n|grep -v  "incomplete"|tail -n +2|awk '{print $1,$3}' >ip_mac.txt
echo "ip和mac地址"
cat  ip_mac.txt
[root@sc-server shell]# 

(命令)&  启动一个子进程去执行命令,在后台执行,不影响前台程序执行,达到我们想要的并发效果

wait 父进程等待子程序执行完毕,然后退出

思路二:通过ping命令获取在线的IP地址,然后对在线的IP地址通过arping命令获取对应的mac地址

#/bin/bash#创建文件保存IP地址和MAC地址
>used_ip_mac.txt
>unused_ip.txt
>used_ip.txt
#得到自己的IP地址和mac地址
output1=$(ip add|grep "ens33:" -A2|head -n 3  | tail -n 1 |awk -F " " '{print $2}'|awk -F "/" '{print $1}')
output2=$(ip add|grep "ens33:" -A2|head -n 2  | tail -n 1 |awk -F " " '{print $2}') 
#遍历整个网段,一个一个IP地址的arping
for i in {1..254}
do(if ping  192.168.2.$i -c 1 -w 1 &>/dev/null ;thenecho "192.168.2.$i" >> used_ip.txtif  [ "192.168.2.$i" != "$output1" ];thenarping -I ens33 192.168.2.$i -w 1 -c 1|awk -F " " '{print $4,$5}'|head -n 2|tail -n 1  >> used_ip_mac.txtelseecho "1"fielseecho "192.168.2.$i" >> unused_ip.txt fi)&
done
wait#统计没有使用的ip地址的个数
num=$(cat  unused_ip.txt |wc -l)
echo "Unused ip: $num"  >>unused_ip.txt#统计可以使用的ip地址的个数
num=$(cat  used_ip.txt |wc -l)
echo "Used ip: $num"  >>used_ip.txt#添加自己的IP地址和MAC地址
echo "${output1} ${output2}" >> used_ip_mac.txt

python语言编写扫描脚本

思路:通过socket库获取自己的IP地址,然后通过pythonping库获取在线的IP地址,然后通过正则表达式访问arp缓存表并筛选出IP对应的mac地址,最后将程序通过多线程完成

import os
import re
import threading
from pythonping import ping
import socket
import uuid
import ipaddressip_list = []
ip_mac_list = []
target = []
sort_ip_list = []#查找出自己的IP地址和MAC地址(cmd里面使用 ipconfig /all)
def local_ip_mac1():# 获取本机IP地址ip_address = socket.gethostbyname(socket.gethostname())# 获取本机MAC地址# 将读取的倒叙的全大写的MAC地址保存在列表list中list = [('{:02x}'.format((uuid.getnode() >> i) & 0xFF)).upper() for i in range(0, 48, 8)]mac_address = '-'.join(list[::-1])return ip_address,mac_address
# 我们使用 socket.gethostname() 获取主机名,然后使用 socket.gethostbyname() 函数根据主机名获取对应的 IP 地址。
# 我们使用 uuid.getnode() 函数获取一个唯一的标识符,然后将其转换为十六进制表示,并以冒号分隔每两个字符。
# print(local_ip_mac1())# 判断该网段IP地址能否ping通   ip是否在线
def ip_online(target):ping_result = ping(target,timeout=0.3)if ping_result.success():print(f"Ping {target} 成功!")# print(f"平均响应时间: {ping_result.rtt_avg_ms} ms")ip_list.append(target)else:print(f"Ping {target} 失败!")# 通过IP查MAC
def ip2mac(ip):  # 通过IP查MACloc_ip, mac = local_ip_mac1()if ip == loc_ip:return maccmd = f'arp -a {ip}'output = os.popen(cmd)outstr = ' '.join(list(output))if '未找到 ARP 项' not in outstr:  # 排除本机macs = re.findall('(([A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2})', outstr, re.S)for i in macs[0]:if len(i) == 17:return i
#多线程扫描
def scan(ip_online, ip):# 执行扫描操作# 创建线程列表threads = []# 遍历 IP 列表,为每个 IP 创建一个线程并启动它for ip in target:t = threading.Thread(target=ip_online, args=(ip,))t.start()threads.append(t)# 等待所有线程完成for t in threads:t.join()#IP地址排序
def sorted1(ip_list):#定义列表ip_list2 = []ip_list3 = []# 将str类型的ip地址转换成IPv4Address类型的IP地址,方便排序for i in ip_list:ip_network = ipaddress.ip_address(i)ip_list2.append(ip_network)ip_list2 = sorted(ip_list2)# print(ip_list2)# 将排序好的IPv4Address地址转换成str类型的并输出for i in ip_list2:# print(i,type(i))ip_str1 = i.__str__()# print(ip_str1,type(ip_str1))ip_list3.append(ip_str1)return ip_list3if __name__ == '__main__':# 判定IP地址范围for i in range(1, 255):target.append(f"192.168.2.{i}")# 执行多线程scan(ip_online,target)# 输出在线的IP地址列表# print(ip_list)# 排序IP地址sort_ip_list = sorted1(ip_list)print(sort_ip_list)#将得到的IP地址和mac地址放入ip_mac_list列表中for ip in sort_ip_list:ip_mac_list.append(ip + " " + ip2mac(ip))# 输出ip_mac_list表print(ip_mac_list)

路由器(router)

路由器的功能:

能实现跨网段通信,将数据从一个网络转发到另一个网络。

跨越从源主机到目标主机的一个互联网络来转发数据包的过程

在转发数据包的过程中,根据某个理由选择最佳路径帮助我们转发数据

路由工作在网络层,它通过路由选择路由转发完成自己的功能 

交换机工作在数据链路层

根据“MAC地址表”转发数据

硬件转发

路由器的工作原理

    1.查看ip包的目的ip地址
    2.计算出目标网段
    3.到路由表里查看是否有到目标网段的路由
    4.如果有,就转发,没有就告诉客户机不能到达

步骤图:

步骤:

1、主机1.1要发送数据到4.1

2、路由器A收到数据,查看数据包中的目标地址为4.1,查找路由表

3、路由器A根据路由表转发数据到S0口

4、路由器B接收到数据包,查看数据包的目标地址,并查找路由表

5、路由器B根据路由表转发数据到E0口

6、主机4.1接收到数据包

 

路由器转发数据包的封装过程

路由表:

路由表路由器中维护的路由条目的集合

路由器根据路由表做路径选择

路由表格式:

目标网段        接口(下一跳)

电脑、路由器、手机等配置了IP地址的设备都有路由表

路由表里的一条记录(一行)称呼为一个路由条目

查看路由表的方式(Linux):

[root@iZ2ze3xtpuz7jd2c0ex7nzZ ~]# ip route
default via 172.31.95.253 dev eth0 
169.254.0.0/16 dev eth0 scope link metric 1002 
172.31.80.0/20 dev eth0 proto kernel scope link src 172.31.84.18 
[root@iZ2ze3xtpuz7jd2c0ex7nzZ ~]# 
#路由表里的一条记录(一行)称呼为一个路由条目[root@iZ2ze3xtpuz7jd2c0ex7nzZ ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.31.95.253   0.0.0.0         UG    0      0        0 eth0    默认路由
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0    直连路由
172.31.80.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0    直连路由
[root@iZ2ze3xtpuz7jd2c0ex7nzZ ~]# 

0.0.0.0 代表任意地址

路由表的方式(Windows)

C:\Users\23843>route printIPv4 路由表
===========================================================================
活动路由:
网络目标        网络掩码          网关       接口   跃点数0.0.0.0          0.0.0.0      192.168.2.1     192.168.2.43     45127.0.0.0        255.0.0.0            在链路上         127.0.0.1    331127.0.0.1  255.255.255.255            在链路上         127.0.0.1    331127.255.255.255  255.255.255.255            在链路上         127.0.0.1    331192.168.2.0    255.255.255.0            在链路上      192.168.2.43    301

如果路由表里没有对应的路由条目路由器就会丢弃数据,不进行转发

路由的类型:

1、直连路由:直接和路由                                         

2、非直连路由

    2.1  静态路由

    2.2  动态路由

    2.3  默认路由

常用的路由类型:

1、直连路由   (directly connected)

接口配置IP地址,并且接口需要激活(端口UP状态),形成直连路由      --》自动产生

2、静态路由  (static)                                                         

需要管理员手工配置的,是单向的,因此缺乏灵活性

3、动态路由  (Dynamic)

使用动态路由协议自动学习和更新路由表的路由方式。

4、默认路由  (default)

只要配置默认网关就是添加一条默认路由,当没有匹配到合适的直连、静态、动态路由的时候,就会走默认路由,如果没有配置默认路由就会丢失数据

当路由器在路由表中找不到目标网络的路由条目时,路由器把请求转发到默认路由接口

路由的优先级:直连路由  >  静态路由  > 动态路由  >  默认路由

给路由器添加静态路由的命令

ip route   192.168.30.0   255.255.255.0                 192.168.2.1

                 目标网段         子网掩码                            下一跳地址

下一跳地址对应的IP

一般给末节的网络配置默认路由

给路由器添加默认路由的命令

ip route       0.0.0.0        0.0.0.0                 192.168.2.1

                 目标网段     子网掩码             下一跳地址

ping某网址的过程

PC0(192.168.1.1/24) --》  ping 192.168.1.254

步骤:

1、拿192.168.1.254 跟自己的子网掩码进行与运算得出目标网段 192.168.1.0 

192.168.1.254
255.255.255.0

得:192.168.1.0 (目标网段)

2、查找本机里的路由表,发现走直连路由能到达,然后进行数据封装  

源ip:192.168.1.1  目的ip:192.168.1.254

3、发送数据包给路由器的LAN口(默认网关)

PC0(192.168.1.1/24) --》 ping  192.168.2.1 

步骤:

1、拿192.168.2.1 跟自己的子网掩码进行与运算得出目标网段 192.168.2.0

192.168.2.1
255.255.255.0

得:192.168.2.0 (目标网段)

2、查找本机里的路由表,发现静态、直连、动态路由内都没有该网段,因此走默认路由,然后进行数据封装  

源ip:192.168.1.1  目的ip:192.168.2.1

根据默认路由的下一跳地址192.168.1.254,查询arp缓存表,是否有192.168.1.254的mac地址,如果有直接使用,如果没有就发arp广播得到192.168.1.254的mac地址

3、封装帧头部:  源mac地址是自己  目的mac地址是 网关的mac地址

4、将数据送到交换机,交换机会根据目的mac地址做转发,送给网关

5、数据送到了路由器的LAN口(默认网关),拿192.168.2.1 跟自己(路由器)的子网掩码进行与运算得出目标网段 192.168.2.0,路由器然后查看路由表,发现192.168.2.1是自己的直连路由,然后直接将数据包通过直连路由转发给了192.168.2.1。

故障排除:

1、分层检查

从物理层检查,查看端口状态来排除接口、线缆等问题

查看IP地址和路由等的配置是否正确 

2、分段检查

将网络划分成多个小的段,逐段排除错误

课后实验:

实验成果: 


http://www.mrgr.cn/p/61378142

相关文章

如何维护你的电脑:提升性能和延长使用寿命

如何维护你的电脑&#xff1a;提升性能和延长使用寿命 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

在自定义数据集上微调Alpaca和LLaMA

本文将介绍使用LoRa在本地机器上微调Alpaca和LLaMA&#xff0c;我们将介绍在特定数据集上对Alpaca LoRa进行微调的整个过程&#xff0c;本文将涵盖数据处理、模型训练和使用流行的自然语言处理库(如Transformers和hugs Face)进行评估。此外还将介绍如何使用grado应用程序部署和…

高算力AI模组前沿应用:基于ARM架构的SoC阵列式服务器

本期我们带来高算力AI模组前沿应用&#xff0c;基于ARM架构的SoC阵列式服务器相关内容。澎湃算力、创新架构、异构计算&#xff0c;有望成为未来信息化社会的智能算力底座。 ▌性能优势AI驱动&#xff0c;ARM架构服务器加速渗透 一直以来&#xff0c;基于ARM架构的各类处理器…

对比CahtGPT Bard Claude2对中文的理解

对比CahtGPT Bard Claude2对中文的理解 今天简单测试了一下目前这三个很火的模型对中文的理解能力 简单问题 鲁迅和周树人的关系 Bard CahtGPT Claude 介绍一下平凡的世界这本书 Bard CahtGPT

GitHub仓库如何使用

核心&#xff1a;GitHub仓库如何使用 目录 1.创建仓库&#xff1a; 2.克隆仓库到本地&#xff1a; 3.添加、提交和推送更改&#xff1a; 4.分支管理&#xff1a; 5.拉取请求&#xff08;Pull Requests&#xff09;&#xff1a; 6.合并代码&#xff1a; 7.其他功能&…

网络安全行业相关证书

一&#xff1a;前言 对于考证这个话题&#xff0c;笔者的意见是&#xff1a;“有比没有好&#xff0c;有一定更好&#xff0c;但不一定必须&#xff1b;纸上证明终觉浅&#xff0c;安全还得实力行”。很多人对于各种机构的考证宣传搞得是云里雾里&#xff0c;不知道网络安全行业…

虚拟局域网VLAN

概述 广播域 使用一个或多个以太网交换机互连接起来的交互式以太网&#xff0c;其所有站点都属于同一个广播域&#xff0c;随着交换式以太网规模的扩大&#xff0c;广播域响应扩大&#xff0c;从而形成一个巨大的广播域。 但是巨大的广播域会带来很多的弊端&#xff1a; 广…

Ubuntu 放弃了战斗向微软投降

导读这几天看到 Ubuntu 放弃 Unity 和 Mir 开发&#xff0c;转向 Gnome 作为默认桌面环境的新闻&#xff0c;作为一个Linux十几年的老兵和Linux桌面的开发者&#xff0c;内心颇感良多。Ubuntu 做为全世界Linux界的桌面先驱者和创新者&#xff0c;突然宣布放弃自己多年开发的Uni…

REST API的基础:HTTP

在本文中&#xff0c;我们将深入探讨万维网数据通信的基础 - HTTP。 什么是超文本&#xff1f; HTTP&#xff08;超文本传输协议&#xff09;的命名源于“超文本”。 那么&#xff0c;什么是超文本&#xff1f; 想象一下由超链接组成的文本、图像和视频的混合物。这些链接充当我…

使用TensorFlow训练深度学习模型实战(下)

大家好&#xff0c;本文接TensorFlow训练深度学习模型的上半部分继续进行讲述&#xff0c;下面将介绍有关定义深度学习模型、训练模型和评估模型的内容。 定义深度学习模型 数据准备完成后&#xff0c;下一步是使用TensorFlow搭建神经网络模型&#xff0c;搭建模型有两个选项…

Android 中 app freezer 原理详解(一):S 版本

基于版本&#xff1a;Android S 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理&#xff0c;为什么叫这个名字&#xff0c;而不…

k8s一站式使用笔记

前言 个人感觉比较磨心态&#xff0c;要坐住&#xff0c;因为细节太多&#xff0c;建议&#xff1a;一遍看个大概&#xff0c;二遍回来细品&#xff0c;不要当成任务&#xff0c;把握零碎时间 一、k8s安装 1、配置准备 硬件要求 内存&#xff1a;2GB或更多RAMCPU: 2核CPU或更…

【RabbitMQ】Linux系统服务器安装RabbitMQ

一、下载 首先应该下载erlang&#xff0c;rabbitmq运行需要有erland环境。 官网地址&#xff1a;https://www.erlang.org/downloads 下载rabbitmq 官网环境&#xff1a;https://www.rabbitmq.com/download.html 注意&#xff1a;el7对应centos7&#xff0c;el8对应centos8…

centos下安装ftp-读取目录列表失败-

1.下载安装ftp服务器端和客户端 #1.安装yum -y install vsftpdyum -y install ftp #2.修改配置文件vim /etc/vsftpd.conflocal_enablesYESwrite_enableYESanonymous_enableYESanon_mkdir_write_enableYES //允许匿名用户在FTP上创建目录anon_upload_enableYES //允许匿名用户…

数值线性代数: 共轭梯度法

本文总结线性方程组求解的相关算法&#xff0c;特别是共轭梯度法的原理及流程。 零、预修 0.1 LU分解 设&#xff0c;若对于&#xff0c;均有&#xff0c;则存在下三角矩阵和上三角矩阵&#xff0c;使得。 设&#xff0c;若对于&#xff0c;均有&#xff0c;则存在唯一的下三…

kotlin 编写一个简单的天气预报app(四)

编写界面来显示返回的数据 用户友好性&#xff1a;通过界面设计和用户体验优化&#xff0c;可以使天气信息更易读、易理解和易操作。有效的界面设计可以提高用户满意度并提供更好的交互体验。 增加城市名字的TextView <TextViewandroid:id"id/textViewCityName"…

matlab使用教程(5)—矩阵定义和基本运算

本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言&#xff0c;数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形&#xff0c;在这种意义上沿任何维度的分量向量的长度…

【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

Yan-英杰的主 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 【粉丝福利】 【文末送书】 目录&#xff1a; 本书特色&#xff1a; 问题描述 报错信息如下 Description:An attempt…

三、前端高德地图、测量两个点之前的距离

点击测距工具可以开启测量&#xff0c;再次点击关闭测量&#xff0c;清除地图上的点、连线、文字 再次点击测量工具的时候清除。 首先 上面的功能条河下面的地图我搞成了两个组件&#xff0c;他们作为兄弟组件存在&#xff0c;所以简单用js写了个事件监听触发的对象&#xff…

视频怎么加水印?这几种加水印方法非常简单

给视频加水印是一种保护知识产权的方法。水印是一种数字标记&#xff0c;可以包括作者的名称、品牌标识或其他信息&#xff0c;以便识别和追踪视频的来源。通过给视频加水印&#xff0c;能够有效地防止视频被盗用或未经授权的使用&#xff0c;让我们的知识产权得到更好的保护。…