目錄
network 和 NetworkManager關(guān)系:
實(shí)驗(yàn):編寫一個(gè)掃描腳本,知道本局域網(wǎng)里哪些ip在使用,哪些沒有使用? 使用的ip對應(yīng)的mac地址都要顯示出來
計(jì)算機(jī)程序執(zhí)行的兩種不同方式:
shell語言編寫掃描腳本
思路一:通過ping命令獲取在線的IP地址,然后通過截取arp緩存表里的數(shù)據(jù)獲得IP地址對應(yīng)的mac地址
思路二:通過ping命令獲取在線的IP地址,然后對在線的IP地址通過arping命令獲取對應(yīng)的mac地址
python語言編寫掃描腳本
路由器(router)
路由器的功能:
路由器的工作原理
步驟:
路由器轉(zhuǎn)發(fā)數(shù)據(jù)包的封裝過程
路由表:
查看路由表的方式(Linux):
路由表的方式(Windows)
路由的類型:
常用的路由類型:
1、直連路由? ?(directly connected)
2、靜態(tài)路由? (static)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
3、動(dòng)態(tài)路由? (Dynamic)
4、默認(rèn)路由? (default)
路由的優(yōu)先級:直連路由? >? 靜態(tài)路由? > 動(dòng)態(tài)路由? >? 默認(rèn)路由
給路由器添加靜態(tài)路由的命令
ping某網(wǎng)址的過程
PC0(192.168.1.1/24)?--》??ping 192.168.1.254
PC0(192.168.1.1/24)?--》?ping ?192.168.2.1?
故障排除:
1、分層檢查
2、分段檢查
課后實(shí)驗(yàn):
network 和 NetworkManager關(guān)系:
network 是一個(gè)給linux機(jī)器配置網(wǎng)絡(luò)參數(shù)(ip,子網(wǎng)掩碼,dns,網(wǎng)關(guān)等)。
NetworkManager 是linux系統(tǒng)里管理所有的網(wǎng)絡(luò)連接的服務(wù),可以禁用網(wǎng)卡,啟用網(wǎng)卡。
network依賴于NetworkManage,NetworkManage將網(wǎng)卡禁用,network服務(wù)就沒有辦法給網(wǎng)卡配置ip地址了
nmcli(network manager ?client)是 ?network manager服務(wù)的客戶端命令,可以給服務(wù)傳遞參數(shù),進(jìn)行設(shè)置
nmcli n 可以查看網(wǎng)絡(luò)是否 被禁用
nmcli ?n ?on ?啟用網(wǎng)絡(luò)?
nmcli ?n ?off 禁用網(wǎng)絡(luò)
示例:
實(shí)驗(yàn):編寫一個(gè)掃描腳本,知道本局域網(wǎng)里哪些ip在使用,哪些沒有使用? 使用的ip對應(yīng)的mac地址都要顯示出來
IP地址范圍(僅供參考):192.168.2.0/24 ? ? 192.168.2.1 ~ 254
?? ??? ??? ?????????????????????????ping ? 192.168.2.1
使用shell、python或者go去編寫局域網(wǎng)掃描工具,獲取正在使用的ip和對應(yīng)的mac地址
告訴哪些ip地址在使用,哪些沒有使用?
去了解下,python/go里有哪些類似于ping命令的庫(掃描的庫)
?? ?ping庫
?? ?socket庫
?? ?pythonping
?? ?python_arptable
?? ?ipaddress
計(jì)算機(jī)程序執(zhí)行的兩種不同方式:
串行: ?按照順序進(jìn)行 --》效率低,耗時(shí)比較長
并行: ?同時(shí)執(zhí)行 ? --》效率高,耗時(shí)短
shell語言編寫掃描腳本
思路一:通過ping命令獲取在線的IP地址,然后通過截取arp緩存表里的數(shù)據(jù)獲得IP地址對應(yīng)的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 ;then
echo "192.168.1.$i is used" |tee -a ip_used.txt
else
echo "192.168.1.$i is not used"|tee -a ip_unused.txt
fi)&
done
wait
#統(tǒng)計(jì)有多少ip在使用,多少?zèng)]有使用
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的對應(yīng)關(guān)系---》arp緩存表里的內(nèi)容
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]#
(命令)& ?啟動(dòng)一個(gè)子進(jìn)程去執(zhí)行命令,在后臺執(zhí)行,不影響前臺程序執(zhí)行,達(dá)到我們想要的并發(fā)效果
wait 父進(jìn)程等待子程序執(zhí)行完畢,然后退出
思路二:通過ping命令獲取在線的IP地址,然后對在線的IP地址通過arping命令獲取對應(yīng)的mac地址
#/bin/bash
#創(chuàng)建文件保存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}')
#遍歷整個(gè)網(wǎng)段,一個(gè)一個(gè)IP地址的arping
for i in {1..254}
do
(if ping 192.168.2.$i -c 1 -w 1 &>/dev/null ;then
echo "192.168.2.$i" >> used_ip.txt
if [ "192.168.2.$i" != "$output1" ];then
arping -I ens33 192.168.2.$i -w 1 -c 1|awk -F " " '{print $4,$5}'|head -n 2|tail -n 1 >> used_ip_mac.txt
else
echo "1"
fi
else
echo "192.168.2.$i" >> unused_ip.txt
fi)&
done
wait
#統(tǒng)計(jì)沒有使用的ip地址的個(gè)數(shù)
num=$(cat unused_ip.txt |wc -l)
echo "Unused ip: $num" >>unused_ip.txt
#統(tǒng)計(jì)可以使用的ip地址的個(gè)數(shù)
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地址,然后通過正則表達(dá)式訪問arp緩存表并篩選出IP對應(yīng)的mac地址,最后將程序通過多線程完成
import os
import re
import threading
from pythonping import ping
import socket
import uuid
import ipaddress
ip_list = []
ip_mac_list = []
target = []
sort_ip_list = []
#查找出自己的IP地址和MAC地址(cmd里面使用 ipconfig /all)
def local_ip_mac1():
# 獲取本機(jī)IP地址
ip_address = socket.gethostbyname(socket.gethostname())
# 獲取本機(jī)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() 獲取主機(jī)名,然后使用 socket.gethostbyname() 函數(shù)根據(jù)主機(jī)名獲取對應(yīng)的 IP 地址。
# 我們使用 uuid.getnode() 函數(shù)獲取一個(gè)唯一的標(biāo)識符,然后將其轉(zhuǎn)換為十六進(jìn)制表示,并以冒號分隔每兩個(gè)字符。
# print(local_ip_mac1())
# 判斷該網(wǎng)段IP地址能否ping通 ip是否在線
def ip_online(target):
ping_result = ping(target,timeout=0.3)
if ping_result.success():
print(f"Ping {target} 成功!")
# print(f"平均響應(yīng)時(shí)間: {ping_result.rtt_avg_ms} ms")
ip_list.append(target)
else:
print(f"Ping {target} 失?。?)
# 通過IP查MAC
def ip2mac(ip): # 通過IP查MAC
loc_ip, mac = local_ip_mac1()
if ip == loc_ip:
return mac
cmd = f'arp -a {ip}'
output = os.popen(cmd)
outstr = ' '.join(list(output))
if '未找到 ARP 項(xiàng)' not in outstr: # 排除本機(jī)
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):
# 執(zhí)行掃描操作
# 創(chuàng)建線程列表
threads = []
# 遍歷 IP 列表,為每個(gè) IP 創(chuàng)建一個(gè)線程并啟動(dòng)它
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地址轉(zhuǎn)換成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地址轉(zhuǎn)換成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_list3
if __name__ == '__main__':
# 判定IP地址范圍
for i in range(1, 255):
target.append(f"192.168.2.{i}")
# 執(zhí)行多線程
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)
路由器的功能:
能實(shí)現(xiàn)跨網(wǎng)段通信,將數(shù)據(jù)從一個(gè)網(wǎng)絡(luò)轉(zhuǎn)發(fā)到另一個(gè)網(wǎng)絡(luò)。
跨越從源主機(jī)到目標(biāo)主機(jī)的一個(gè)互聯(lián)網(wǎng)絡(luò)來轉(zhuǎn)發(fā)數(shù)據(jù)包的過程
在轉(zhuǎn)發(fā)數(shù)據(jù)包的過程中,根據(jù)某個(gè)理由選擇最佳路徑幫助我們轉(zhuǎn)發(fā)數(shù)據(jù)
路由工作在網(wǎng)絡(luò)層,它通過路由選擇和路由轉(zhuǎn)發(fā)完成自己的功能?
交換機(jī)工作在數(shù)據(jù)鏈路層
根據(jù)“MAC地址表”轉(zhuǎn)發(fā)數(shù)據(jù)
硬件轉(zhuǎn)發(fā)
路由器的工作原理
?? ?1.查看ip包的目的ip地址
?? ?2.計(jì)算出目標(biāo)網(wǎng)段
?? ?3.到路由表里查看是否有到目標(biāo)網(wǎng)段的路由
?? ?4.如果有,就轉(zhuǎn)發(fā),沒有就告訴客戶機(jī)不能到達(dá)
步驟圖:
步驟:
1、主機(jī)1.1要發(fā)送數(shù)據(jù)到4.1
2、路由器A收到數(shù)據(jù),查看數(shù)據(jù)包中的目標(biāo)地址為4.1,查找路由表
3、路由器A根據(jù)路由表轉(zhuǎn)發(fā)數(shù)據(jù)到S0口
4、路由器B接收到數(shù)據(jù)包,查看數(shù)據(jù)包的目標(biāo)地址,并查找路由表
5、路由器B根據(jù)路由表轉(zhuǎn)發(fā)數(shù)據(jù)到E0口
6、主機(jī)4.1接收到數(shù)據(jù)包
?
路由器轉(zhuǎn)發(fā)數(shù)據(jù)包的封裝過程
路由表:
路由表路由器中維護(hù)的路由條目的集合
路由器根據(jù)路由表做路徑選擇
路由表格式:
目標(biāo)網(wǎng)段? ? ? ? 接口(下一跳)
電腦、路由器、手機(jī)等配置了IP地址的設(shè)備都有路由表
路由表里的一條記錄(一行)稱呼為一個(gè)路由條目
查看路由表的方式(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 ~]#
#路由表里的一條記錄(一行)稱呼為一個(gè)路由條目
[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 默認(rèn)路由
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 print
IPv4 路由表
===========================================================================
活動(dòng)路由:
網(wǎng)絡(luò)目標(biāo) 網(wǎng)絡(luò)掩碼 網(wǎng)關(guān) 接口 躍點(diǎn)數(shù)
0.0.0.0 0.0.0.0 192.168.2.1 192.168.2.43 45
127.0.0.0 255.0.0.0 在鏈路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在鏈路上 127.0.0.1 331
127.255.255.255 255.255.255.255 在鏈路上 127.0.0.1 331
192.168.2.0 255.255.255.0 在鏈路上 192.168.2.43 301
如果路由表里沒有對應(yīng)的路由條目,路由器就會(huì)丟棄數(shù)據(jù),不進(jìn)行轉(zhuǎn)發(fā)
路由的類型:
1、直連路由:直接和路由? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2、非直連路由
? ? 2.1? 靜態(tài)路由
? ? 2.2? 動(dòng)態(tài)路由
? ? 2.3? 默認(rèn)路由
常用的路由類型:
1、直連路由? ?(directly connected)
接口配置IP地址,并且接口需要激活(端口UP狀態(tài)),形成直連路由? ? ??--》自動(dòng)產(chǎn)生
2、靜態(tài)路由? (static)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
需要管理員手工配置的,是單向的,因此缺乏靈活性
3、動(dòng)態(tài)路由? (Dynamic)
使用動(dòng)態(tài)路由協(xié)議自動(dòng)學(xué)習(xí)和更新路由表的路由方式。
4、默認(rèn)路由? (default)
只要配置默認(rèn)網(wǎng)關(guān)就是添加一條默認(rèn)路由,當(dāng)沒有匹配到合適的直連、靜態(tài)、動(dòng)態(tài)路由的時(shí)候,就會(huì)走默認(rèn)路由,如果沒有配置默認(rèn)路由就會(huì)丟失數(shù)據(jù)
當(dāng)路由器在路由表中找不到目標(biāo)網(wǎng)絡(luò)的路由條目時(shí),路由器把請求轉(zhuǎn)發(fā)到默認(rèn)路由接口
路由的優(yōu)先級:直連路由? >? 靜態(tài)路由? > 動(dòng)態(tài)路由? >? 默認(rèn)路由
給路由器添加靜態(tài)路由的命令
ip route? ?192.168.30.0? ?255.255.255.0? ? ? ? ? ? ? ? ?192.168.2.1
? ? ? ? ? ? ? ? ?目標(biāo)網(wǎng)段? ? ? ? ?子網(wǎng)掩碼? ? ? ? ? ? ? ? ? ? ? ? ? ? 下一跳地址
下一跳地址對應(yīng)的IP
一般給末節(jié)的網(wǎng)絡(luò)配置默認(rèn)路由
給路由器添加默認(rèn)路由的命令
ip route? ? ? ?0.0.0.0????? ? 0.0.0.0? ? ? ? ? ? ? ? ?192.168.2.1
? ? ? ? ? ? ? ? ?目標(biāo)網(wǎng)段? ???子網(wǎng)掩碼? ? ? ? ? ? ?下一跳地址
ping某網(wǎng)址的過程
PC0(192.168.1.1/24)?--》??ping 192.168.1.254
步驟:
1、拿192.168.1.254 跟自己的子網(wǎng)掩碼進(jìn)行與運(yùn)算得出目標(biāo)網(wǎng)段 192.168.1.0?
192.168.1.254
255.255.255.0得:192.168.1.0 (目標(biāo)網(wǎng)段)
2、查找本機(jī)里的路由表,發(fā)現(xiàn)走直連路由能到達(dá),然后進(jìn)行數(shù)據(jù)封裝 ?
源ip:192.168.1.1 ?目的ip:192.168.1.254
3、發(fā)送數(shù)據(jù)包給路由器的LAN口(默認(rèn)網(wǎng)關(guān))
PC0(192.168.1.1/24)?--》?ping ?192.168.2.1?
步驟:
1、拿192.168.2.1 跟自己的子網(wǎng)掩碼進(jìn)行與運(yùn)算得出目標(biāo)網(wǎng)段 192.168.2.0
192.168.2.1
255.255.255.0得:192.168.2.0 (目標(biāo)網(wǎng)段)
2、查找本機(jī)里的路由表,發(fā)現(xiàn)靜態(tài)、直連、動(dòng)態(tài)路由內(nèi)都沒有該網(wǎng)段,因此走默認(rèn)路由,然后進(jìn)行數(shù)據(jù)封裝 ?
源ip:192.168.1.1 ?目的ip:192.168.2.1
根據(jù)默認(rèn)路由的下一跳地址192.168.1.254,查詢arp緩存表,是否有192.168.1.254的mac地址,如果有直接使用,如果沒有就發(fā)arp廣播得到192.168.1.254的mac地址
3、封裝幀頭部: ?源mac地址是自己 ?目的mac地址是 網(wǎng)關(guān)的mac地址
4、將數(shù)據(jù)送到交換機(jī),交換機(jī)會(huì)根據(jù)目的mac地址做轉(zhuǎn)發(fā),送給網(wǎng)關(guān)
5、數(shù)據(jù)送到了路由器的LAN口(默認(rèn)網(wǎng)關(guān)),拿192.168.2.1 跟自己(路由器)的子網(wǎng)掩碼進(jìn)行與運(yùn)算得出目標(biāo)網(wǎng)段 192.168.2.0,路由器然后查看路由表,發(fā)現(xiàn)192.168.2.1是自己的直連路由,然后直接將數(shù)據(jù)包通過直連路由轉(zhuǎn)發(fā)給了192.168.2.1。
故障排除:
1、分層檢查
從物理層檢查,查看端口狀態(tài)來排除接口、線纜等問題
查看IP地址和路由等的配置是否正確?
2、分段檢查
將網(wǎng)絡(luò)劃分成多個(gè)小的段,逐段排除錯(cuò)誤
課后實(shí)驗(yàn):
實(shí)驗(yàn)成果:?文章來源:http://www.zghlxwxcb.cn/news/detail-561546.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-561546.html
到了這里,關(guān)于計(jì)算機(jī)網(wǎng)絡(luò) day7 掃描IP腳本 - 路由器 - ping某網(wǎng)址的過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!