计算机网络 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、分段检查
将网络划分成多个小的段,逐段排除错误
课后实验:
实验成果:
相关文章:

计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程
目录 network 和 NetworkManager关系: 实验:编写一个扫描脚本,知道本局域网里哪些ip在使用,哪些没有使用? 使用的ip对应的mac地址都要显示出来 计算机程序执行的两种不同方式: shell语言编写扫描脚本 …...

gitee 配置ssh 公钥(私钥)
步骤1:添加/生成SSH公钥,码云提供了基于SSH协议的Git服务,在使用SSH协议访问项目仓库之前,需要先配置好账户/项目的SSH公钥。 绑定账户邮箱: git config --global user.name "Your Name" git config --glob…...

JAVA面试总结-Redis篇章(七)——数据淘汰策略
JAVA 面试总结-数据淘汰策略...
[SQL挖掘机] - 算术函数 - round
介绍: 当谈到 SQL 中的 round 函数时,它用于将一个数值四舍五入到指定的小数位数。 用法: round 函数的用法如下: round(number, decimals)其中,number 是要进行四舍五入的数值,decimals 是要保留的小数位数。round 函数接受两…...
php-golang-rpc spiral/goridge库和php spiral/goridge2.4.5实践
golang 代码: package main import ( "fmt" "net" "net/rpc" "github.com/spiral/goridge/v2" ) type App struct{} func (*App) Hi(name string, r *string) error { *r fmt.Sprintf("hello %s!", name) re…...
关于Kubernetes的一些零碎想法
关于Kubernetes的一些零碎想法 容器集群管理系统与容器编排系统 很多使用Kubernetes的企业可能没有认识到Kubernetes最重要的特点。许多企业将其视为一种容器集群管理系统(container management system),只使用其管理容器的能力。然而&#x…...

C—数据的储存(下)
文章目录 前言🌟一、练习一下🌏1.例一🌏2.例二🌏3.例三🌏4.例四 🌟二、浮点型在内存中的储存🌏1.浮点数🌏2.浮点数存储💫(1).二进制浮点数&#x…...

「软件测试面试干货」2023年软件测试面试题大全(持续更新)附答案..
先卖个关子,如果你是面试官,你希望招一个什么样的人进来? 如果这个问题搞明白了,那么可以说测试岗位的面试,就变得非常轻松了。 按照一般的惯例,面试官都会让你自我介绍,介绍你的项目经验&…...

YOLOv2论文对比总结
1、高分辨率图片效果提升 2、Anchor 3、Loss函数 4、小目标友好...

数据中心机房机柜配电新模式的探讨与选型
安科瑞 华楠 摘 要:对数据中心机房列头柜配电方式特征和问题进行深入研究,分析机房末端配电安全性及可用性,主要阐述了数据中心机房机柜配电新模式。 关键词:数据中心;机房机柜;配电模式 1 原始配电方案 …...
Redis未授权访问漏洞
前言 传统数据库都是持久化存储到硬盘中,所以执行某些业务时传统数据库并不是很理想。redis等数据存储在内存中的数据库就应允而生了。基于内存的Redis读速度是110000次/s,写速度是81000次/s 。但是基于内存的缺点就是断电即失,如果服务器产生了意外…...
Python 各种进制转换
def binary_to_decimal(binary_number):#2进制转换成10进制return int(binary_number, 2) def hex_to_decimal(binary_number):#hexadecimal #16进制转换成10进制return int(binary_number, 16) def octal_to_decimal(binary_number):#8进制转换成10进制return int(binary_numb…...

关于K8s的Pod的详解(一)
关于K8s的Pod的详解(一) Pod和API server的通信加快Pod启动更改Pod的资源Pod 的持久卷的单个访问模式Pod 拓扑分布约束Pod 拓扑分布中的最小域数 Pod 作为k8s创建,调度,管理的基本单位。由上级的Controller对Node上安装的Kubelet发…...

Vue3通透教程【十六】TS编译配置
文章目录 🌟 写在前面🌟 初始化配置文件⭐ target⭐ module⭐ lib⭐ types/node⭐ include⭐ outDir🌟 写在最后 🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更…...

OpenCV系列__chapter2
这里写目录标题 1 图像加减乘除位运算1.1 加法 img cv2.add(img1, img2)1.2 减法 img cv2.subtract(img1, img2)1.3 乘法 img cv2.multiply(img1, img2)1.4 除法 img cv2.divide(img1, img2)1.5 位运算 cv2.bitwise_and() 2 图像增强2.1 线性变换2.2 非线性变换 3 图像几何…...

Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
目录 Chat GPT是什么 初学者怎么使用Chat GPT 使用Chat GPT需要注意什么 一些简单的prompt示例 Chat GPT是什么 Chat GPT是由OpenAI开发的一种大型语言模型,它基于GPT(Generative Pre-trained Transformer)架构。GPT是一种基于深度学习的…...

hcip mgre与rip实验
要求: 1.toop搭建 2.IP地址规划 R1g 0/0/1 192.168.1.1 24 s 4/0/0 188.0.0.2 24 t:10.0.0.1 24R2 s 4/0/0 188.0.0.1 24 s 4/0/1 188.0.1.1 24 s 3/0/0 188.0.2.1 24 loop0 8.8.8.8 24 t:10.0.0.2 24 R3g…...

骨传导耳机对身体有没有别的危害?骨传导耳机有什么好处?
骨传导耳机对身体有没有别的危害? 在此之前,我们先了解一下骨传导的原理:骨传导就跟它的名字一样通过骨头传声,主要是借助头部颅骨传递到听觉中枢,这种传播方式省略了直接接触耳道和耳膜。打个比方,就是我们…...

c++11/c++98动态规划入门第5课,经典DP问题 --- 区间
第1题 取数问题 查看测评数据信息 有一排N个数,你和小明2个人玩游戏,每个人轮流从2端取数,每次可以从左或右取,不能从中间取。你取的所有的数的和是你的得分,小明取的所有的数的和是小明的得分。如果你先取&#x…...

vue中重新获取数据导致页面加长,要求在页面更新之后浏览器滚动条滚动到之前浏览记录的位置。以及获取当前页面中是哪个元素产生滚动条的方法。
目前的页面样式为: 代码是: <section id"detailSection"><el-tableref"multipleTable":data"logDetailList"style"width: 650px;margin:20px auto;"id"dialogDetail":show-header"fals…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...