基于Cisco CDP协议的家用路由器以及盒子的自动配置随想
生活随笔
收集整理的這篇文章主要介紹了
基于Cisco CDP协议的家用路由器以及盒子的自动配置随想
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
每次買來一個設備,比如一臺新的路由器,家庭盒子,就是榮耀立方,小米盒子這種,唯一覺得頭大的就是它們的初始配置。
??????? 這種盒子幾乎都有一個初始IP地址用于插上網線登錄界面后來配置盒子的IP地址,或者說更加先進一點,其本身有一個AP,然后用你的手機連上這個熱點進行手機配置,看起來簡直特別的酷!但這是假象!
??????? 手機連接這個AP期間,手機不能連別的AP,甚至無法4G/3G,或者說用筆記本配置的話,網線連接筆記本和盒子的時候,這個筆記本要添加一個盒子的初始IP地址同網段的IP,然后接入,除非筆記本有額外的無線網卡(一般都有,好吧,這沒問題!)或者雙網卡,不然筆記本就不能上網查資料(配置過程中遇到問題很正常)!萬一家里現有的網絡節點IP地址與這個初始IP地址沖突,就...要知道192.168.1.1幾乎成了通用的初始IP,如果你一下子買了多個(同型號?)盒子的話,你不得不做重復的勞動,連接AP,或者不斷插拔網線!
??????? 還有很多別的不便,請用過的人,踩過坑的人來補充...
??????? 所以說,鑒于以上的不便,這種設備一直都是極客的玩具,對于一般人而言,那簡直是噩夢。我本人是個是個方便至上的人,最討厭的就是麻煩,當有人問我如何翻墻的時候,我的回答就是不翻墻,因為太麻煩,我不用google又死不了人,所以我寧可不用我也不會折騰什么翻墻。對于我不買家庭盒子或者買了扔在那不用的原因,也一樣,不用又死不了人,所以我寧可不用也不愿意麻煩!
??????? 但是,當我在工作中發現了Mikrotik之后,我改變了想法。
??????? Mikrotik可以裝在VMWare中,這就對研究它提供了方便。而我確實也將它裝在了VMWare中。啟動后,我正愁如何配置它,上網搜索,發現了一個叫做WinBox的東西,這玩意兒可以在不配置IP地址的情況下,直接通過這個Mikrotik系統的MAC地址”連接“到系統,然后對它配置IP地址!!
??????? 這其實沒有什么不可思議的,誰告訴你建立連接一定要通過IP地址的啊!誰告訴你TCP就是一切的啊!事實上,昨天當前同事問我怎么才可以精通網絡的時候,我告訴他,把除了TCP之外的所有關于網絡的東西都精通了,你就精通網絡了。除了單播IP地址之外,我們還有組播,即便沒有組播IP地址,我們還有組播MAC地址可供利用!幾乎所有的交換機都會向所有端口轉發組播流量!
??????? 而這關于組播的,就是根本!組播是一個抽象的組織者,組播地址并不需要與任何主機綁定,它是無實體的,對于MAC組播而言,只要組播流量到達該網卡,它就能接收,對于IP組播而言,只要本機加入了一個”組播組“,它就能處理。對于還沒有IP地址的組播通信,顯然只能用MAC組播了,怎么把網卡收到的組播流量路由到應用程序,無法靠協議棧路由了,因為此時IP層是通不過的,靠什么呢?靠PACKET套接字!
??????? 當然,以上的論述有點簡單了,根本沒有涉及IGMP以及剪枝之類的,事實上,對于我的需求而言,根本不需要那些,同局域網通信,上面那些足夠了!
??????? 通過Microtik的配置,我們來一探究竟!
??????? 打開WinBox界面,出現了Mikrotik設備的MAC地址以及其”Mikrotik“標識,然后就可以配置它了!這是怎么做到的?!要知道此時這個Mikrotik設備的IP地址我完全不知道!正如我早就預料到的,它使用了組播!其實,Mikrotik設備在啟動后就往外組播發送CDP包,這個CDP是Cisco公司的協議,旨在建立一個與網絡層協議無關的鏈路層鄰居信息交換協議。它可以在沒有IP地址或者網絡層根本就不運行IP協議的情況下向外播送自己的設備信息,MAC地址等,這就是為什么WinBox可以顯示這個Mikrotik設備的原因。
一個組播數據包在沒有IP地址的情況下也是可以發送的,只要有組播端口路由項就好!接下來的問題是,我如何在外部設備上發送數據給Mikrotik設備,如果可以讓Mikrotik設備的一個偵聽程序收到我的數據包,就可以讓它執行任意程序,比如ifconfig $lan ...
??????? 但是,我錯了,雖然組播數據可以讓交換機轉發給Mikrotik設備(這其實是最根本的一步!),但由于此時Mikrotik并沒有IP地址,數據包是無法被協議棧接收的!怎么辦?!此時我就想到了pcap!pcap是一個萬能的數據包導入框架,它甚至可以將不屬于本機流量的數據導入到本機,前提是數據到達了本機網卡!而關于數據到達本機網卡這件事,組播以及解決了!
??????? 好了,到此為止,方案就有了。為了驗證一下這個方案,創建兩個虛擬機,分別為A,B,每一個虛擬機一塊網卡,這兩塊網卡全部放在Segment中,因此它們屬于一個鏈路。啟動兩個虛擬機,但是并不配置任何一個IP地址,因此兩個虛擬機都是沒有IP地址的!
Ctrl-G進入虛擬機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太多了!在執行配置命令前,起碼要有驗證...# 執行收到的字符串所代表的命令!os.system(str(payload))# 配好了就退出吧,不然豈不是隨便誰都可以扔個包過來了么?還好,上面可以增加一些驗證。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()
這是一個收包并執行命令的程序,我命名為exec.py,那么還需要一個發送命令的程序,如下:
#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。
??????? 這個程序其實也很簡單,就一個組播數據發送即可,它運行在虛擬機B。它發送exec.py所執行的payload。整個過程沒有IP地址的參與。exec.py運行在待配置的盒子上,即虛擬機A,而config則運行在與之同網段的設備上,即虛擬機B,執行conf便會發送組播,發送一個字符串到組播地址,比如發送”ifconfig eth1 1.1.1.8/10“,那么待exec.py收到
后就會執行之,最終exec.py所在機器的eth1的IP地址就會被配置成1.1.1.8/10現在的問題是,如果我買了10個盒子,我該如何區分我發送的數據會到達哪個盒子呢?此時就想到了CDP,盒子先把自己的信息,包括標識序列號,包括MAC地址組播出去,然后類似WinBox的程序接收到組播消息,用戶按照這類信息去配置具體的盒子!
??????? 這樣就完成了自動配置的全部:
0.將盒子連接在與配置機同樣的網絡內;
1.盒子啟動,組播自己的標識信息;
2.與盒子連接在一個網絡內的配置主機上運行conf.py程序根據收到的組播標識信息選擇需要配置的盒子;
3.填寫配置信息到conf.py,然后使用組播將其發送到第2步選擇的盒子;
4.如果你覺得不夠安全,那就可以使用SSL協議,不要以為SSL運行與TCP之上,其實它也可以運行與內存上,比如BIO_mem!
...
以后再也不用事先去連接盒子的固定IP地址了,換一種方法,我們換一種方式,在盒子擁有自己的IP之前,完全通過組播通信,通過組播來配置IP地址!再也不用插拔網線以及連接AP了!
??????? 不過這對于IPv4來講是一種憧憬,對于IPv6而言,這是一種自然而然的東西,因為IPv6自然就有自動配置的功能。
??????? 這種盒子幾乎都有一個初始IP地址用于插上網線登錄界面后來配置盒子的IP地址,或者說更加先進一點,其本身有一個AP,然后用你的手機連上這個熱點進行手機配置,看起來簡直特別的酷!但這是假象!
??????? 手機連接這個AP期間,手機不能連別的AP,甚至無法4G/3G,或者說用筆記本配置的話,網線連接筆記本和盒子的時候,這個筆記本要添加一個盒子的初始IP地址同網段的IP,然后接入,除非筆記本有額外的無線網卡(一般都有,好吧,這沒問題!)或者雙網卡,不然筆記本就不能上網查資料(配置過程中遇到問題很正常)!萬一家里現有的網絡節點IP地址與這個初始IP地址沖突,就...要知道192.168.1.1幾乎成了通用的初始IP,如果你一下子買了多個(同型號?)盒子的話,你不得不做重復的勞動,連接AP,或者不斷插拔網線!
??????? 還有很多別的不便,請用過的人,踩過坑的人來補充...
??????? 所以說,鑒于以上的不便,這種設備一直都是極客的玩具,對于一般人而言,那簡直是噩夢。我本人是個是個方便至上的人,最討厭的就是麻煩,當有人問我如何翻墻的時候,我的回答就是不翻墻,因為太麻煩,我不用google又死不了人,所以我寧可不用我也不會折騰什么翻墻。對于我不買家庭盒子或者買了扔在那不用的原因,也一樣,不用又死不了人,所以我寧可不用也不愿意麻煩!
??????? 但是,當我在工作中發現了Mikrotik之后,我改變了想法。
??????? Mikrotik可以裝在VMWare中,這就對研究它提供了方便。而我確實也將它裝在了VMWare中。啟動后,我正愁如何配置它,上網搜索,發現了一個叫做WinBox的東西,這玩意兒可以在不配置IP地址的情況下,直接通過這個Mikrotik系統的MAC地址”連接“到系統,然后對它配置IP地址!!
??????? 這其實沒有什么不可思議的,誰告訴你建立連接一定要通過IP地址的啊!誰告訴你TCP就是一切的啊!事實上,昨天當前同事問我怎么才可以精通網絡的時候,我告訴他,把除了TCP之外的所有關于網絡的東西都精通了,你就精通網絡了。除了單播IP地址之外,我們還有組播,即便沒有組播IP地址,我們還有組播MAC地址可供利用!幾乎所有的交換機都會向所有端口轉發組播流量!
??????? 而這關于組播的,就是根本!組播是一個抽象的組織者,組播地址并不需要與任何主機綁定,它是無實體的,對于MAC組播而言,只要組播流量到達該網卡,它就能接收,對于IP組播而言,只要本機加入了一個”組播組“,它就能處理。對于還沒有IP地址的組播通信,顯然只能用MAC組播了,怎么把網卡收到的組播流量路由到應用程序,無法靠協議棧路由了,因為此時IP層是通不過的,靠什么呢?靠PACKET套接字!
??????? 當然,以上的論述有點簡單了,根本沒有涉及IGMP以及剪枝之類的,事實上,對于我的需求而言,根本不需要那些,同局域網通信,上面那些足夠了!
??????? 通過Microtik的配置,我們來一探究竟!
??????? 打開WinBox界面,出現了Mikrotik設備的MAC地址以及其”Mikrotik“標識,然后就可以配置它了!這是怎么做到的?!要知道此時這個Mikrotik設備的IP地址我完全不知道!正如我早就預料到的,它使用了組播!其實,Mikrotik設備在啟動后就往外組播發送CDP包,這個CDP是Cisco公司的協議,旨在建立一個與網絡層協議無關的鏈路層鄰居信息交換協議。它可以在沒有IP地址或者網絡層根本就不運行IP協議的情況下向外播送自己的設備信息,MAC地址等,這就是為什么WinBox可以顯示這個Mikrotik設備的原因。
一個組播數據包在沒有IP地址的情況下也是可以發送的,只要有組播端口路由項就好!接下來的問題是,我如何在外部設備上發送數據給Mikrotik設備,如果可以讓Mikrotik設備的一個偵聽程序收到我的數據包,就可以讓它執行任意程序,比如ifconfig $lan ...
??????? 但是,我錯了,雖然組播數據可以讓交換機轉發給Mikrotik設備(這其實是最根本的一步!),但由于此時Mikrotik并沒有IP地址,數據包是無法被協議棧接收的!怎么辦?!此時我就想到了pcap!pcap是一個萬能的數據包導入框架,它甚至可以將不屬于本機流量的數據導入到本機,前提是數據到達了本機網卡!而關于數據到達本機網卡這件事,組播以及解決了!
??????? 好了,到此為止,方案就有了。為了驗證一下這個方案,創建兩個虛擬機,分別為A,B,每一個虛擬機一塊網卡,這兩塊網卡全部放在Segment中,因此它們屬于一個鏈路。啟動兩個虛擬機,但是并不配置任何一個IP地址,因此兩個虛擬機都是沒有IP地址的!
Ctrl-G進入虛擬機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太多了!在執行配置命令前,起碼要有驗證...# 執行收到的字符串所代表的命令!os.system(str(payload))# 配好了就退出吧,不然豈不是隨便誰都可以扔個包過來了么?還好,上面可以增加一些驗證。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()
這是一個收包并執行命令的程序,我命名為exec.py,那么還需要一個發送命令的程序,如下:
#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。
??????? 這個程序其實也很簡單,就一個組播數據發送即可,它運行在虛擬機B。它發送exec.py所執行的payload。整個過程沒有IP地址的參與。exec.py運行在待配置的盒子上,即虛擬機A,而config則運行在與之同網段的設備上,即虛擬機B,執行conf便會發送組播,發送一個字符串到組播地址,比如發送”ifconfig eth1 1.1.1.8/10“,那么待exec.py收到
后就會執行之,最終exec.py所在機器的eth1的IP地址就會被配置成1.1.1.8/10現在的問題是,如果我買了10個盒子,我該如何區分我發送的數據會到達哪個盒子呢?此時就想到了CDP,盒子先把自己的信息,包括標識序列號,包括MAC地址組播出去,然后類似WinBox的程序接收到組播消息,用戶按照這類信息去配置具體的盒子!
??????? 這樣就完成了自動配置的全部:
0.將盒子連接在與配置機同樣的網絡內;
1.盒子啟動,組播自己的標識信息;
2.與盒子連接在一個網絡內的配置主機上運行conf.py程序根據收到的組播標識信息選擇需要配置的盒子;
3.填寫配置信息到conf.py,然后使用組播將其發送到第2步選擇的盒子;
4.如果你覺得不夠安全,那就可以使用SSL協議,不要以為SSL運行與TCP之上,其實它也可以運行與內存上,比如BIO_mem!
...
以后再也不用事先去連接盒子的固定IP地址了,換一種方法,我們換一種方式,在盒子擁有自己的IP之前,完全通過組播通信,通過組播來配置IP地址!再也不用插拔網線以及連接AP了!
??????? 不過這對于IPv4來講是一種憧憬,對于IPv6而言,這是一種自然而然的東西,因為IPv6自然就有自動配置的功能。
總結
以上是生活随笔為你收集整理的基于Cisco CDP协议的家用路由器以及盒子的自动配置随想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: break 与 continue 的用法
- 下一篇: Day16 正则表达式