基于Cisco CDP协议的家用路由器以及盒子的自动配置随想
生活随笔
收集整理的這篇文章主要介紹了
基于Cisco CDP协议的家用路由器以及盒子的自动配置随想
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
每次買來一個設(shè)備,比如一臺新的路由器,家庭盒子,就是榮耀立方,小米盒子這種,唯一覺得頭大的就是它們的初始配置。
??????? 這種盒子幾乎都有一個初始IP地址用于插上網(wǎng)線登錄界面后來配置盒子的IP地址,或者說更加先進(jìn)一點(diǎn),其本身有一個AP,然后用你的手機(jī)連上這個熱點(diǎn)進(jìn)行手機(jī)配置,看起來簡直特別的酷!但這是假象!
??????? 手機(jī)連接這個AP期間,手機(jī)不能連別的AP,甚至無法4G/3G,或者說用筆記本配置的話,網(wǎng)線連接筆記本和盒子的時候,這個筆記本要添加一個盒子的初始IP地址同網(wǎng)段的IP,然后接入,除非筆記本有額外的無線網(wǎng)卡(一般都有,好吧,這沒問題!)或者雙網(wǎng)卡,不然筆記本就不能上網(wǎng)查資料(配置過程中遇到問題很正常)!萬一家里現(xiàn)有的網(wǎng)絡(luò)節(jié)點(diǎn)IP地址與這個初始IP地址沖突,就...要知道192.168.1.1幾乎成了通用的初始IP,如果你一下子買了多個(同型號?)盒子的話,你不得不做重復(fù)的勞動,連接AP,或者不斷插拔網(wǎng)線!
??????? 還有很多別的不便,請用過的人,踩過坑的人來補(bǔ)充...
??????? 所以說,鑒于以上的不便,這種設(shè)備一直都是極客的玩具,對于一般人而言,那簡直是噩夢。我本人是個是個方便至上的人,最討厭的就是麻煩,當(dāng)有人問我如何翻墻的時候,我的回答就是不翻墻,因?yàn)樘闊?#xff0c;我不用google又死不了人,所以我寧可不用我也不會折騰什么翻墻。對于我不買家庭盒子或者買了扔在那不用的原因,也一樣,不用又死不了人,所以我寧可不用也不愿意麻煩!
??????? 但是,當(dāng)我在工作中發(fā)現(xiàn)了Mikrotik之后,我改變了想法。
??????? Mikrotik可以裝在VMWare中,這就對研究它提供了方便。而我確實(shí)也將它裝在了VMWare中。啟動后,我正愁如何配置它,上網(wǎng)搜索,發(fā)現(xiàn)了一個叫做WinBox的東西,這玩意兒可以在不配置IP地址的情況下,直接通過這個Mikrotik系統(tǒng)的MAC地址”連接“到系統(tǒng),然后對它配置IP地址!!
??????? 這其實(shí)沒有什么不可思議的,誰告訴你建立連接一定要通過IP地址的啊!誰告訴你TCP就是一切的啊!事實(shí)上,昨天當(dāng)前同事問我怎么才可以精通網(wǎng)絡(luò)的時候,我告訴他,把除了TCP之外的所有關(guān)于網(wǎng)絡(luò)的東西都精通了,你就精通網(wǎng)絡(luò)了。除了單播IP地址之外,我們還有組播,即便沒有組播IP地址,我們還有組播MAC地址可供利用!幾乎所有的交換機(jī)都會向所有端口轉(zhuǎn)發(fā)組播流量!
??????? 而這關(guān)于組播的,就是根本!組播是一個抽象的組織者,組播地址并不需要與任何主機(jī)綁定,它是無實(shí)體的,對于MAC組播而言,只要組播流量到達(dá)該網(wǎng)卡,它就能接收,對于IP組播而言,只要本機(jī)加入了一個”組播組“,它就能處理。對于還沒有IP地址的組播通信,顯然只能用MAC組播了,怎么把網(wǎng)卡收到的組播流量路由到應(yīng)用程序,無法靠協(xié)議棧路由了,因?yàn)榇藭rIP層是通不過的,靠什么呢?靠PACKET套接字!
??????? 當(dāng)然,以上的論述有點(diǎn)簡單了,根本沒有涉及IGMP以及剪枝之類的,事實(shí)上,對于我的需求而言,根本不需要那些,同局域網(wǎng)通信,上面那些足夠了!
??????? 通過Microtik的配置,我們來一探究竟!
??????? 打開WinBox界面,出現(xiàn)了Mikrotik設(shè)備的MAC地址以及其”Mikrotik“標(biāo)識,然后就可以配置它了!這是怎么做到的?!要知道此時這個Mikrotik設(shè)備的IP地址我完全不知道!正如我早就預(yù)料到的,它使用了組播!其實(shí),Mikrotik設(shè)備在啟動后就往外組播發(fā)送CDP包,這個CDP是Cisco公司的協(xié)議,旨在建立一個與網(wǎng)絡(luò)層協(xié)議無關(guān)的鏈路層鄰居信息交換協(xié)議。它可以在沒有IP地址或者網(wǎng)絡(luò)層根本就不運(yùn)行IP協(xié)議的情況下向外播送自己的設(shè)備信息,MAC地址等,這就是為什么WinBox可以顯示這個Mikrotik設(shè)備的原因。
一個組播數(shù)據(jù)包在沒有IP地址的情況下也是可以發(fā)送的,只要有組播端口路由項(xiàng)就好!接下來的問題是,我如何在外部設(shè)備上發(fā)送數(shù)據(jù)給Mikrotik設(shè)備,如果可以讓Mikrotik設(shè)備的一個偵聽程序收到我的數(shù)據(jù)包,就可以讓它執(zhí)行任意程序,比如ifconfig $lan ...
??????? 但是,我錯了,雖然組播數(shù)據(jù)可以讓交換機(jī)轉(zhuǎn)發(fā)給Mikrotik設(shè)備(這其實(shí)是最根本的一步!),但由于此時Mikrotik并沒有IP地址,數(shù)據(jù)包是無法被協(xié)議棧接收的!怎么辦?!此時我就想到了pcap!pcap是一個萬能的數(shù)據(jù)包導(dǎo)入框架,它甚至可以將不屬于本機(jī)流量的數(shù)據(jù)導(dǎo)入到本機(jī),前提是數(shù)據(jù)到達(dá)了本機(jī)網(wǎng)卡!而關(guān)于數(shù)據(jù)到達(dá)本機(jī)網(wǎng)卡這件事,組播以及解決了!
??????? 好了,到此為止,方案就有了。為了驗(yàn)證一下這個方案,創(chuàng)建兩個虛擬機(jī),分別為A,B,每一個虛擬機(jī)一塊網(wǎng)卡,這兩塊網(wǎng)卡全部放在Segment中,因此它們屬于一個鏈路。啟動兩個虛擬機(jī),但是并不配置任何一個IP地址,因此兩個虛擬機(jī)都是沒有IP地址的!
Ctrl-G進(jìn)入虛擬機(jī)A的終端編程,寫Python腳本,腳本非常簡單:
#!/usr/local/bin/pythonimport sys import os import time from time import sleep,ctimeimport signal import threading from scapy.all import *flt_in = "dst 224.1.2.3 and udp"def signal_handler(signal, frame):os._exit(0)class ThreadWraper(threading.Thread):def __init__(self,func,args,name=''):threading.Thread.__init__(self)self.name=nameself.func=funcself.args=argsdef run(self):apply(self.func,self.args)def recv_in(pktdata):if UDP in pktdata and pktdata[UDP]:payload = pktdata[UDP].payloadprint str(payload)# TODO太多了!在執(zhí)行配置命令前,起碼要有驗(yàn)證...# 執(zhí)行收到的字符串所代表的命令!os.system(str(payload))# 配好了就退出吧,不然豈不是隨便誰都可以扔個包過來了么?還好,上面可以增加一些驗(yàn)證。os._exit(0)def recv_packet_in():sniff(iface ="eth1", prn = recv_in, store = 0, filter = flt_in)if __name__ == '__main__':signal.signal(signal.SIGINT, signal_handler)in_thread = ThreadWraper(recv_packet_in,(), recv_packet_in.__name__)in_thread.setDaemon(True) in_thread.start()signal.pause()
這是一個收包并執(zhí)行命令的程序,我命名為exec.py,那么還需要一個發(fā)送命令的程序,如下:
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h>int main() {int sd;struct sockaddr_in addr_to_config;char *buf = "ifconfig eth0 1.1.1.8/10";memset(&addr_to_config, 0, sizeof(addr_to_config));addr_to_config.sin_family = AF_INET;addr_to_config.sin_addr.s_addr = inet_addr("224.1.2.3");addr_to_config.sin_port = htons(1111);sd = socket(AF_INET, SOCK_DGRAM, 0);if(sd < 0) {return 0;}if(sendto(sd, buf, strlen(buf), 0, (struct sockaddr*)&addr_to_config, sizeof(addr_to_config)) < 0) {return 0;}return 1; }
編譯成config。
??????? 這個程序其實(shí)也很簡單,就一個組播數(shù)據(jù)發(fā)送即可,它運(yùn)行在虛擬機(jī)B。它發(fā)送exec.py所執(zhí)行的payload。整個過程沒有IP地址的參與。exec.py運(yùn)行在待配置的盒子上,即虛擬機(jī)A,而config則運(yùn)行在與之同網(wǎng)段的設(shè)備上,即虛擬機(jī)B,執(zhí)行conf便會發(fā)送組播,發(fā)送一個字符串到組播地址,比如發(fā)送”ifconfig eth1 1.1.1.8/10“,那么待exec.py收到
后就會執(zhí)行之,最終exec.py所在機(jī)器的eth1的IP地址就會被配置成1.1.1.8/10現(xiàn)在的問題是,如果我買了10個盒子,我該如何區(qū)分我發(fā)送的數(shù)據(jù)會到達(dá)哪個盒子呢?此時就想到了CDP,盒子先把自己的信息,包括標(biāo)識序列號,包括MAC地址組播出去,然后類似WinBox的程序接收到組播消息,用戶按照這類信息去配置具體的盒子!
??????? 這樣就完成了自動配置的全部:
0.將盒子連接在與配置機(jī)同樣的網(wǎng)絡(luò)內(nèi);
1.盒子啟動,組播自己的標(biāo)識信息;
2.與盒子連接在一個網(wǎng)絡(luò)內(nèi)的配置主機(jī)上運(yùn)行conf.py程序根據(jù)收到的組播標(biāo)識信息選擇需要配置的盒子;
3.填寫配置信息到conf.py,然后使用組播將其發(fā)送到第2步選擇的盒子;
4.如果你覺得不夠安全,那就可以使用SSL協(xié)議,不要以為SSL運(yùn)行與TCP之上,其實(shí)它也可以運(yùn)行與內(nèi)存上,比如BIO_mem!
...
以后再也不用事先去連接盒子的固定IP地址了,換一種方法,我們換一種方式,在盒子擁有自己的IP之前,完全通過組播通信,通過組播來配置IP地址!再也不用插拔網(wǎng)線以及連接AP了!
??????? 不過這對于IPv4來講是一種憧憬,對于IPv6而言,這是一種自然而然的東西,因?yàn)镮Pv6自然就有自動配置的功能。
??????? 這種盒子幾乎都有一個初始IP地址用于插上網(wǎng)線登錄界面后來配置盒子的IP地址,或者說更加先進(jìn)一點(diǎn),其本身有一個AP,然后用你的手機(jī)連上這個熱點(diǎn)進(jìn)行手機(jī)配置,看起來簡直特別的酷!但這是假象!
??????? 手機(jī)連接這個AP期間,手機(jī)不能連別的AP,甚至無法4G/3G,或者說用筆記本配置的話,網(wǎng)線連接筆記本和盒子的時候,這個筆記本要添加一個盒子的初始IP地址同網(wǎng)段的IP,然后接入,除非筆記本有額外的無線網(wǎng)卡(一般都有,好吧,這沒問題!)或者雙網(wǎng)卡,不然筆記本就不能上網(wǎng)查資料(配置過程中遇到問題很正常)!萬一家里現(xiàn)有的網(wǎng)絡(luò)節(jié)點(diǎn)IP地址與這個初始IP地址沖突,就...要知道192.168.1.1幾乎成了通用的初始IP,如果你一下子買了多個(同型號?)盒子的話,你不得不做重復(fù)的勞動,連接AP,或者不斷插拔網(wǎng)線!
??????? 還有很多別的不便,請用過的人,踩過坑的人來補(bǔ)充...
??????? 所以說,鑒于以上的不便,這種設(shè)備一直都是極客的玩具,對于一般人而言,那簡直是噩夢。我本人是個是個方便至上的人,最討厭的就是麻煩,當(dāng)有人問我如何翻墻的時候,我的回答就是不翻墻,因?yàn)樘闊?#xff0c;我不用google又死不了人,所以我寧可不用我也不會折騰什么翻墻。對于我不買家庭盒子或者買了扔在那不用的原因,也一樣,不用又死不了人,所以我寧可不用也不愿意麻煩!
??????? 但是,當(dāng)我在工作中發(fā)現(xiàn)了Mikrotik之后,我改變了想法。
??????? Mikrotik可以裝在VMWare中,這就對研究它提供了方便。而我確實(shí)也將它裝在了VMWare中。啟動后,我正愁如何配置它,上網(wǎng)搜索,發(fā)現(xiàn)了一個叫做WinBox的東西,這玩意兒可以在不配置IP地址的情況下,直接通過這個Mikrotik系統(tǒng)的MAC地址”連接“到系統(tǒng),然后對它配置IP地址!!
??????? 這其實(shí)沒有什么不可思議的,誰告訴你建立連接一定要通過IP地址的啊!誰告訴你TCP就是一切的啊!事實(shí)上,昨天當(dāng)前同事問我怎么才可以精通網(wǎng)絡(luò)的時候,我告訴他,把除了TCP之外的所有關(guān)于網(wǎng)絡(luò)的東西都精通了,你就精通網(wǎng)絡(luò)了。除了單播IP地址之外,我們還有組播,即便沒有組播IP地址,我們還有組播MAC地址可供利用!幾乎所有的交換機(jī)都會向所有端口轉(zhuǎn)發(fā)組播流量!
??????? 而這關(guān)于組播的,就是根本!組播是一個抽象的組織者,組播地址并不需要與任何主機(jī)綁定,它是無實(shí)體的,對于MAC組播而言,只要組播流量到達(dá)該網(wǎng)卡,它就能接收,對于IP組播而言,只要本機(jī)加入了一個”組播組“,它就能處理。對于還沒有IP地址的組播通信,顯然只能用MAC組播了,怎么把網(wǎng)卡收到的組播流量路由到應(yīng)用程序,無法靠協(xié)議棧路由了,因?yàn)榇藭rIP層是通不過的,靠什么呢?靠PACKET套接字!
??????? 當(dāng)然,以上的論述有點(diǎn)簡單了,根本沒有涉及IGMP以及剪枝之類的,事實(shí)上,對于我的需求而言,根本不需要那些,同局域網(wǎng)通信,上面那些足夠了!
??????? 通過Microtik的配置,我們來一探究竟!
??????? 打開WinBox界面,出現(xiàn)了Mikrotik設(shè)備的MAC地址以及其”Mikrotik“標(biāo)識,然后就可以配置它了!這是怎么做到的?!要知道此時這個Mikrotik設(shè)備的IP地址我完全不知道!正如我早就預(yù)料到的,它使用了組播!其實(shí),Mikrotik設(shè)備在啟動后就往外組播發(fā)送CDP包,這個CDP是Cisco公司的協(xié)議,旨在建立一個與網(wǎng)絡(luò)層協(xié)議無關(guān)的鏈路層鄰居信息交換協(xié)議。它可以在沒有IP地址或者網(wǎng)絡(luò)層根本就不運(yùn)行IP協(xié)議的情況下向外播送自己的設(shè)備信息,MAC地址等,這就是為什么WinBox可以顯示這個Mikrotik設(shè)備的原因。
一個組播數(shù)據(jù)包在沒有IP地址的情況下也是可以發(fā)送的,只要有組播端口路由項(xiàng)就好!接下來的問題是,我如何在外部設(shè)備上發(fā)送數(shù)據(jù)給Mikrotik設(shè)備,如果可以讓Mikrotik設(shè)備的一個偵聽程序收到我的數(shù)據(jù)包,就可以讓它執(zhí)行任意程序,比如ifconfig $lan ...
??????? 但是,我錯了,雖然組播數(shù)據(jù)可以讓交換機(jī)轉(zhuǎn)發(fā)給Mikrotik設(shè)備(這其實(shí)是最根本的一步!),但由于此時Mikrotik并沒有IP地址,數(shù)據(jù)包是無法被協(xié)議棧接收的!怎么辦?!此時我就想到了pcap!pcap是一個萬能的數(shù)據(jù)包導(dǎo)入框架,它甚至可以將不屬于本機(jī)流量的數(shù)據(jù)導(dǎo)入到本機(jī),前提是數(shù)據(jù)到達(dá)了本機(jī)網(wǎng)卡!而關(guān)于數(shù)據(jù)到達(dá)本機(jī)網(wǎng)卡這件事,組播以及解決了!
??????? 好了,到此為止,方案就有了。為了驗(yàn)證一下這個方案,創(chuàng)建兩個虛擬機(jī),分別為A,B,每一個虛擬機(jī)一塊網(wǎng)卡,這兩塊網(wǎng)卡全部放在Segment中,因此它們屬于一個鏈路。啟動兩個虛擬機(jī),但是并不配置任何一個IP地址,因此兩個虛擬機(jī)都是沒有IP地址的!
Ctrl-G進(jìn)入虛擬機(jī)A的終端編程,寫Python腳本,腳本非常簡單:
#!/usr/local/bin/pythonimport sys import os import time from time import sleep,ctimeimport signal import threading from scapy.all import *flt_in = "dst 224.1.2.3 and udp"def signal_handler(signal, frame):os._exit(0)class ThreadWraper(threading.Thread):def __init__(self,func,args,name=''):threading.Thread.__init__(self)self.name=nameself.func=funcself.args=argsdef run(self):apply(self.func,self.args)def recv_in(pktdata):if UDP in pktdata and pktdata[UDP]:payload = pktdata[UDP].payloadprint str(payload)# TODO太多了!在執(zhí)行配置命令前,起碼要有驗(yàn)證...# 執(zhí)行收到的字符串所代表的命令!os.system(str(payload))# 配好了就退出吧,不然豈不是隨便誰都可以扔個包過來了么?還好,上面可以增加一些驗(yàn)證。os._exit(0)def recv_packet_in():sniff(iface ="eth1", prn = recv_in, store = 0, filter = flt_in)if __name__ == '__main__':signal.signal(signal.SIGINT, signal_handler)in_thread = ThreadWraper(recv_packet_in,(), recv_packet_in.__name__)in_thread.setDaemon(True) in_thread.start()signal.pause()
這是一個收包并執(zhí)行命令的程序,我命名為exec.py,那么還需要一個發(fā)送命令的程序,如下:
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h>int main() {int sd;struct sockaddr_in addr_to_config;char *buf = "ifconfig eth0 1.1.1.8/10";memset(&addr_to_config, 0, sizeof(addr_to_config));addr_to_config.sin_family = AF_INET;addr_to_config.sin_addr.s_addr = inet_addr("224.1.2.3");addr_to_config.sin_port = htons(1111);sd = socket(AF_INET, SOCK_DGRAM, 0);if(sd < 0) {return 0;}if(sendto(sd, buf, strlen(buf), 0, (struct sockaddr*)&addr_to_config, sizeof(addr_to_config)) < 0) {return 0;}return 1; }
編譯成config。
??????? 這個程序其實(shí)也很簡單,就一個組播數(shù)據(jù)發(fā)送即可,它運(yùn)行在虛擬機(jī)B。它發(fā)送exec.py所執(zhí)行的payload。整個過程沒有IP地址的參與。exec.py運(yùn)行在待配置的盒子上,即虛擬機(jī)A,而config則運(yùn)行在與之同網(wǎng)段的設(shè)備上,即虛擬機(jī)B,執(zhí)行conf便會發(fā)送組播,發(fā)送一個字符串到組播地址,比如發(fā)送”ifconfig eth1 1.1.1.8/10“,那么待exec.py收到
后就會執(zhí)行之,最終exec.py所在機(jī)器的eth1的IP地址就會被配置成1.1.1.8/10現(xiàn)在的問題是,如果我買了10個盒子,我該如何區(qū)分我發(fā)送的數(shù)據(jù)會到達(dá)哪個盒子呢?此時就想到了CDP,盒子先把自己的信息,包括標(biāo)識序列號,包括MAC地址組播出去,然后類似WinBox的程序接收到組播消息,用戶按照這類信息去配置具體的盒子!
??????? 這樣就完成了自動配置的全部:
0.將盒子連接在與配置機(jī)同樣的網(wǎng)絡(luò)內(nèi);
1.盒子啟動,組播自己的標(biāo)識信息;
2.與盒子連接在一個網(wǎng)絡(luò)內(nèi)的配置主機(jī)上運(yùn)行conf.py程序根據(jù)收到的組播標(biāo)識信息選擇需要配置的盒子;
3.填寫配置信息到conf.py,然后使用組播將其發(fā)送到第2步選擇的盒子;
4.如果你覺得不夠安全,那就可以使用SSL協(xié)議,不要以為SSL運(yùn)行與TCP之上,其實(shí)它也可以運(yùn)行與內(nèi)存上,比如BIO_mem!
...
以后再也不用事先去連接盒子的固定IP地址了,換一種方法,我們換一種方式,在盒子擁有自己的IP之前,完全通過組播通信,通過組播來配置IP地址!再也不用插拔網(wǎng)線以及連接AP了!
??????? 不過這對于IPv4來講是一種憧憬,對于IPv6而言,這是一種自然而然的東西,因?yàn)镮Pv6自然就有自動配置的功能。
總結(jié)
以上是生活随笔為你收集整理的基于Cisco CDP协议的家用路由器以及盒子的自动配置随想的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: break 与 continue 的用法
- 下一篇: Day16 正则表达式