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

目录

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.mzph.cn/news/5317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 通过枚举类型字符串,反射到枚举上

C# 通过枚举类型字符串&#xff0c;反射到枚举上 通过类型字符串&#xff0c;反射出任意类型枚举类型通过反射调用枚举GetTypeByName(EnumName) 为空&#xff1f; 小结 通过类型字符串&#xff0c;反射出任意类型 之前老顾写过一篇博客&#xff0c;通过反射&#xff0c;使用字…

IDEA+java+spring+hibernate+jquery+mysql后台管理系统

IDEA javaspringhibernatejquerymysql后台管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.我的内容4.我的操作日志5. 我的登陆日志6. 我的登陆授权7. 内容管理8.标签管理9. 搜索词管理10.分类管理11.分类类型12.标签分类13.用户管理14.部门管理15.角色…

Linux系统编程(信号处理机制)

文章目录 前言一、中断&#xff0c;异常&#xff0c;信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制&#xff0c;信号处理在Linux操作系统中必不可少&#xff0c;这一点值得大家注意&#xff0c;信号又会与中…

golang 日志库zap和日志切割实践

介绍 在许多Go语言项目中&#xff0c;我们需要一个好的日志记录器能够提供下面这些功能&#xff1a; 能够将事件记录到文件中&#xff0c;而不是应用程序控制台。 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 支持不同的日志级别。例如INFO&#xff0c;DEBUG&a…

深度学习与神经网络

人工智能&#xff0c;机器学习&#xff0c;深度学习&#xff0c;神经网络&#xff0c;emmmm&#xff0c;傻傻分不清楚&#xff0c;这都啥呀&#xff0c;你知道吗&#xff1f;我不知道。你知道吗&#xff1f;我不知道。 来来来&#xff0c;接下来&#xff0c;整硬菜&#xff1a…

『红外图像 数据增强』DDE(Digital Detail Enhancement)算法

DDE处理的细节 分离背景层和细节层&#xff1a;使用特殊的滤波器&#xff0c;将图像分成背景层和细节层。背景层通常包含低频信息&#xff0c;而细节层包含高频信息。 对背景层进行灰度增强&#xff1a;通过对背景层应用适当的灰度增强算法&#xff0c;提高背景层的对比度和视…

轻量级应用服务器开放端口

关于使用浏览器连接自己所写的TCP进程时&#xff0c;由于没有开放端口&#xff0c;而且搜索到对应的操作来进行开放端口&#xff0c;所以在完成开放端口后特意做个笔记&#xff0c;防止忘记。 登录自己所使用的服务器的网站找到控制台 找到轻量级应用服务器 找到所需要开放端口…

【机器学习】分类算法 - KNN算法(K-近邻算法)KNeighborsClassifier

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;零基础快速入门人工智能《机器学习入门到精通》 K-近邻算法 1、什么是K-近邻算法&#xff1f;2、K-近邻算法API3、…

最强自动化框架,Pytest自动化测试-动态切换环境实战(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在开始前&#xf…

LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

ceph应用

资源池 Pool 管理 上面我们已经完成了 Ceph 集群的部署&#xff0c;但是我们如何向 Ceph 中存储数据呢&#xff1f;首先我们需要在 Ceph 中定义一个 Pool 资源池。Pool 是 Ceph 中存储 Object 对象抽象概念。我们可以将其理解为 Ceph 存储上划分的逻辑分区&#xff0c;Pool 由多…

Qt6 Qt Quick UI Prototype学习QML第一篇

Qt6 Qt Quick UI原型学习QML第一篇 开始创建项目Qt Quick UI原型简介.qmlproject文件举例Window平台小例子运行效果QML语法 了解语法 开始创建项目 创建一个具有QML入口点的Qt Quick 2 UI项目。要使用它&#xff0c;您需要设置一个QML运行时环境&#xff0c;例如gmlscene。 仅当…

消息队列——rabbitmq的不同工作模式

目录 Work queues 工作队列模式 Pub/Sub 订阅模式 Routing路由模式 Topics通配符模式 工作模式总结 Work queues 工作队列模式 C1和C2属于竞争关系&#xff0c;一个消息只有一个消费者可以取到。 代码部分只需要用两个消费者进程监听同一个队里即可。 两个消费者呈现竞争关…

安全防御 --- DDOS攻击(01)

DOS攻击&#xff08;deny of service&#xff09;--- 拒绝式服务攻击 例&#xff1a;2016年10月21日&#xff0c;美国提供动态DNS服务的DynDNS遭到DDOS攻击&#xff0c;攻击导致许多使用DynDNS服务的网站遭遇访问问题&#xff0c;此事件中&#xff0c;黑客人就是运用了DNS洪水…

golang waitgroup

案例 WaitGroup 可以解决一个 goroutine 等待多个 goroutine 同时结束的场景&#xff0c;这个比较常见的场景就是例如 后端 worker 启动了多个消费者干活&#xff0c;还有爬虫并发爬取数据&#xff0c;多线程下载等等。 我们这里模拟一个 worker 的例子 package mainimport (…

ChatGPT与Claude对比分析

一 简介 1、ChatGPT: 访问地址&#xff1a;https://chat.openai.com/ 由OpenAI研发,2022年11月发布。基于 transformer 结构的大规模语言模型,包含1750亿参数。训练数据集主要是网页文本,聚焦于流畅的对话交互。对话风格友好,回复通顺灵活,富有创造性。存在一定的安全性问题,可…

【深度学习】基于BRET的高级主题检测

一、说明 使用BERT,UMAP和HDBSCAN捕获文档主题,紧随最先进的BERTopic架构(transformer编码器)。 主题检测是一项 NLP 任务,旨在从文本文档语料库中提取全局“主题”。例如,如果正在查看书籍描述的数据集,主题检测将使我们能够将书籍分类,例如:“浪漫”、“科幻”、“旅…

Springboot+Flask+Neo4j+Vue2+Vuex+Uniapp+Mybatis+Echarts+Swagger综合项目学习笔记

文章目录 Neo4j教程&#xff1a;Neo4j高性能图数据库从入门到实战 医疗问答系统算法教程&#xff1a;医学知识图谱问答系统项目示例&#xff1a;neo4j知识图谱 Vueflask 中药中医方剂大数据可视化系统可视化技术&#xff1a;ECharts、D.jsflask教程&#xff1a;速成教程Flask w…

list模拟实现

一、结点的定义 有三个成员&#xff0c;2个指向前面和后面的指针&#xff0c;一个表示结点存储T类型的值。 对于_prev和_next&#xff0c;类型是 list_node<T>*&#xff0c;不是list_node*&#xff0c;加上类型参数T之后&#xff0c;才是模板类的类型。 构造函数中&am…

【MySQL】MySQL8.1.0版本正式发布带来哪些新特性?

文章目录 前言一、畅谈新版本二、8.1.0版本部署2.1、环境准备2.2、配置yum安装依赖2.3、用户及目录创建2.4、创建用户及组2.5、解压缩包2.6、环境变量配置2.7、创建参数文件2.8、数据库初始化2.9、启动Mysql2.10、登陆MySQL 8.1 三、新特性3.1、密码参数3.2、错误日志加强3.3、…