Home Assistant:簡介、目標與系統選擇

本人最近踩坑,有鑑於臺灣的教學實在很少,可能稍嫌過時,所以決定把最新的經驗寫下來,供「沒有任何經驗的初學者」參考,可以少走一點冤枉路,會玩得比較順一點。

關於 Home Assistant 是什麼?它是智慧控制系統中樞,類似米家、Homekit,可以控制裝置或者取得資訊。因為它的支援度相當高且多,因此當家中有許多不同廠牌的裝置時,使用 Home Assistant 就可以一肩攬起中控的責任。

自由度高,也意味著會需要一定的知識背景支持,所以入門到堪用並不容易。除非都是買一些好納入的設備,不然很難順利。這裡建議先學習python跟yaml,只要能初階看懂就可以了。

個人使用:樹梅派4B 8GB、Home Assistant Operating System(HAOS)。

官方文件

Taiwan Home Assistant 同好交流

簡介

Home Assistant(HA) 是系統家族的名稱,衍生的子系統都有些許不同,功能也不同,差別在哪?這點可以從官方文件下方找到表格說明。

Operating System: 主要作業系統或是虛擬機
Container: 以Docker架設,架設出來的是Core。
Core: 以Python架設。
Supervised: 以Docker架設,接入Core後,能使用Supervisor的功能。

Home Assistant Community Store(HACS)是一個由各路大神製作的成品商店,由於 Home Assistant 並未能把每套智控系統完美接入,所以得自製套件去接入那些系統,尤其是米家設備,如果沒有HACS去下載整合,是很難輕鬆地接入米家設備。此外還有主題跟Lovelace UI,對於美化面板是很實用的。

Home Assistant Supervisor能安裝第三方的套件,讓HA具有其他非智控的功能,像是SSH、DNS等,重要性取決於自己對於HA有沒有要勝任其他角色,如果沒有,其實也不用Supervisor。當然最好是有,以後才方便做一些延伸。

如果HA會需要使用Wifi或是藍牙,不論是VM、Container還是Core都會有使用權限跟連接問題,因此直接安裝OS會比較容易上手些。

目標

個人使用Home Assistant是為了要整合住處的米家,雖然是米家全家餐,不過有些地方的控制並不是很到位,尤其是多條件的判斷,這使得用HA會比較容易進行。

規劃好目標是很重要的,尤其是HA擔任的角色,要整入那些設備?與要使用的功能,有沒有用加一點特別的功能?這會影響到系統選擇,要是之後才發現自己安裝的系統不支援,就會花上很大的工夫去嘗試或重灌,重灌也意味著進度歸零。

確定好要納入的設備,就能照著以下的主要步驟進行,這會讓你打造一個屬於自己風格的HA。

  1. 整入設備
  2. 美化面板
  3. 設定智慧

系統選擇

建議直接使用OS,OS的功能是最齊全的。

硬碟配置單位大小與讀寫速度測試

今天在整理檔案,發現行動硬碟有個autorun.inf刪不掉,實在很礙眼,只好先把檔案取出來,再來格式化。

要測試的主角是ST1000LM024 HN-M101MBB 1000.2 GB,這顆行動硬碟從大學就買了,已經過了好幾年。宣稱可以持續傳輸145MBps,實際使用也差不多在100MBps以上,速度很穩定,不會亂飄,不像是迷你隨身碟,一開始很快,後面一熱就廢掉了。

搭配的測速是CrystalDiskMark8_0_1 ,會試著用各種檔案配置單位大小去做測試。每種測試5種,測試檔案大小為1GB,速度單位為MB/s,連續測試。

檔案系統配置單位大小 SEQ1M
Q8T1
Read
SEQ1M
Q8T1
Write
SEQ1M
Q1T1
Read
SEQ1M
Q1T1
Write
RND4K
Q32T1
Read
RND4K
Q32T1
Write
RND4K
Q1T1
Read
RND4K
Q1T1
Write
NTFS4KB120.46118.63119.30119.430.541.030.461.04
NTFS 8KB120.51120.06119.39120.110.551.030.451.03
NTFS 16KB120.78120.33119.32119.450.531.000.441.02
NTFS 32KB120.53122.42119.19119.080.540.860.450.99
NTFS 64KB120.32120.07119.39118.880.540.880.461.02

測試結果沒有太大的差異,可能是因為這是一顆傳統硬碟(HDD),所以配置單位大小會選用4KB,以節省不必要的空間浪費。

(本文是為了紀錄要如何產生測試報告

快速打開網路內容

身為一個網路相關的工作者,打開網路內容是家常便飯,每次要點個好幾次,再測試的時候動不動就要點出來,真的很累人。

在Windows有個指令可以打開控制台,網路內容在控制台內,應該也有相對應的指令。

按下 win+R 輸入cmd,再輸入以下指令,就可以打開網路內容。

control ncpa.cpl

更多指令參考:如何藉由輸入指令來執行控制台工具

接著把指令做成批次檔(.bat),然後產生捷徑改圖案,釘選在開始功能表,就可以只用兩次點擊就能開啟網路內容。

用批次檔開啟服務後執行程式

一台電腦裝了很多程式之後,除了開機時執行程式,也可能會順帶執行自身的服務。如VMware跟線上銀行元件等,要是沒有把服務手動中止,電腦開機之後就會一直執行不常用到的服務。

有鑑於筆電效能越來越慢,所以把服務手動中止,等到要使用時才去開啟服務。不過每次都要從服務海中去搜尋,實在很慢。

寫一個批次檔(.bat),先執行服務後,再開啟執行檔(.exe),就能順利執行。當然也可以寫個關閉服務的。

流程如下:

  1. 撰寫批次檔(.bat)
  2. 產生捷徑,修改成管理員權限跟更改icon。

啟用服務是需要管理員權限,而且批次檔是無法從檔案內容去更改icon,所以產生捷徑就能解決這些要求。

撰寫批次檔(.bat)

範例

net start "服務名稱" "服務名稱"
start "" "執行檔位置"

以VMware Workstation為例

net start "VMAuthdService" "VMAuthdService"
net start "VMnetDHCP" "VMnetDHCP"
net start "VMware NAT Service" "VMware NAT Service"
net start "VMUSBArbService" "VMUSBArbService"
net start "VMwareHostd" "VMwareHostd"
start "" "D:\Program Files (x86)\VMware\VMware Workstation\vmware.exe"

net start是啟用服務。而start是執行後馬上繼續下一行,這能讓cmd可以順利關掉。

start帶空格的參考

捷徑的icon

產生捷徑跟預設成以管理員權限執行的方法就不贅述了。

這裡要提icon,捷徑最好的icon就是執行檔icon,所以要去撈出icon來。

以VMware為例,在「內容」>「變更圖示」,貼上執行檔路徑「 D:\Program Files (x86)\VMware\VMware Workstation\vmware.exe 」,按「確定」,就會抓到 vmware.exe 裡面的icon,也包含其正在使用的icon。

只要帶有icon的執行檔,這招通常八成可以取得出來,如果沒有成功,就要進執行檔去看圖示的位置。

用筆電發出帶802.1Q的tag封包

今天碰到一個情境,有一台設備的管理IP在VLAN20,只有一Port為trunk,其餘皆為Access Default Vlan(1),為了測試設定有沒有正常,尤其是管理IP能不能通,就需要想辦法讓筆電發出帶tag的封包,能Ping到管理IP就沒有問題了。

關於Windows10,正常情況下已經不支援發出帶tag的,但是可以接收。網路上關於windows的教學都是舊的Windows,這邊就不再琢磨。

今天要完成,需要藉助VM,使用非Windows系統的去做到這件事情。

個人使用:kali linux。 參考

步驟如下:

首先提高權限,(kali的預設密碼為kali)

sudo su

如果使用外接網卡,直接切換去跟VM做連結。如果使用VM網卡,那就用在連外網卡上使用Bridge模式。

下指令看一看目前的網路介面卡,可以取得網路介面卡的ID。

ifconfig

接著使用vconfig,去添加子介面,這跟路由器的設定很像。

vconfig <interface id> add <vlan>

如果是eth0、vlan100,會新增一個 eth0.100 網路介面卡。而這個卡有沒有添加成功?可以用下列指令去查詢。

ifconfig -a |grep -i <interface id>

接著下指令,指定子介面的IP位置。

ifconfig <interface id> <ip address> netmask <netmask>

網路線接在Trunk Port,最後測試ping管理ip,有成功。馬上再安裝telnet,連線進去,也順入看到要求輸入帳號的訊息,代表筆電有順利發出帶tag的封包。

樹莓派-設備選購、2021年適合的SD卡

最近被樹莓派(Raspberry Pi)燒到,工作上也有接觸到迷你電腦,運算能力不比一般電腦遜色,具有輕巧、體積小而好攜帶,還有節能跟PD支援。這使得迷你電腦能用在更多的場景,勝任一些角色。

樹莓派本體是主機板,上面焊死處理器跟記憶體,沒有內建儲存空間。因此除了本體之外,還要再準備影像輸出、電源跟SD卡,才能做基本使用。

這裡我是選擇4B版本,8GB的RAM。

影像輸出

樹莓派4版內建兩個MicroHDMI孔,MicroHDMI線相比HDMI線是比較少見的,因此有一條MicroHDMI to HDMI線,就可以把影音輸出到顯示器上。

電源

樹莓派4版使用USB C接頭供電,個人也有很多PD的充電產品。 樹莓派電壓5V電流3A,只要一般USB C線材就可以跑得動。

SD卡

在4B版本中,是microSD,要小心不要買成大卡。SD卡仍然持續進步,更快的傳輸速度,A3規格的卡也出現了,但是樹莓派能跑得好嗎?一查才發現,買太好反而可能會是一種退步。

A1跟A2的測試規則不同,不少文章更是直接給出建議「不要買A2的SD卡」,直接翻船。

128GB現在主流就A2的SD卡,選擇也非常多。但評測也多半是用A1等級,表現上,各家差異也不小,如果想要找一點好用的SD,就不能隨意買張來用,得找型號去選擇,只好再找更多的評測。

以下是找到可以參考的文章。

最後照著A2等級SD卡評測,選擇最佳表現的 Kingston 128GB Canvas Go plus A2

需求選配

想把樹莓派做甚麼用?

第一個是Home Assistant,用來作為智慧家庭的管家;
第二個是影音播放器,可以直接輸出到電視上,或是搭配Google Cast投放;
第三個是資訊顯示跟互動,在前陣子沒有手錶看時間的日子,真的會不清楚時間;
第四個是臨時Server,最基本是DHCP跟RADIUS。這對於工作中的某些時候可以啟到神效。

根據虛擬機的經驗,我把記憶體跟SD卡容量都選到一定等級,相信這能撐到它的生命週期,可能是五年吧。

為了找到最超值的買法,搭配信用卡回饋,所以只好把更部分都拆開來買,沒有直接買一個全家餐。

外殼

材質有鋁殼、塑膠,因為有無線使用需求,直接捨棄鋁殼,工作上碰到的無線基地台都沒有使用鋁殼,以免無線訊號被卡在金屬屏蔽效應大幅減損。

觸控螢幕

外殼可以直接套上3.5吋觸控螢幕,就當作一個套件一起買。目前是沒有甚麼研究,如果好用就再來分享。

東西已經下訂,期待拿到的那天,可以讓我好好玩個一個月。

iperf3環境測速:只用一台筆電做兩端

iperf3是測速工具,優勢是可以侷限測速範圍,不像測速網站,一定要經過狹窄的對外頻寬,這樣可以盡情發揮內部網路效能。

此方法的需求:VM、VM用的外接網卡。

一台筆電安裝了iper3之後,可以當Server也可以當Client,如果當指向自己的網路介面卡IP,就會走電腦內部,可以看到內部處理效能的表現,不過也就無法測得經由外部的網路速度,結果也就不能做為參考。

我們做測速,需要先走到電腦外,再回來,這樣才會貼近現實數據。

如果要一台當二台用,自然就會想到VM。一般VM的設定是共用電腦網卡,如果是這種方式,測速路徑依舊是電腦內部。

VM是對的方向,而測速會走電腦內部,是因為測速兩端的介面卡同時存在於一台電腦中,或在內部路由就能到達。因此只要能做出「區別」,把介面卡隔開,一個接在筆電,另一個接在VM,兩卡能通一定得走外部,就可以達到期望的效果。

如果網路介面卡是「On Board」,VM要用就只能共享。但使用「外接」,就可以選擇在接在筆電還是VM,只要選擇接到VM,就能達到介面卡邏輯上分隔,強迫走外部,出去再回來。

VMware有個USB Tool,使用USB tool就可以實現讓外接網卡只跟VM連接。

這方法可以在有線1G測得900Mb,作測速是能勝任的。接下來就可以在筆電跟VM啟動iperf3互打,下圖為筆電連wifi,VM接網路線。

用iperf3測AP傳輸速度

使用情境,只有一個人,然後要在兩端啟iperf3測速。去客戶端測試,環境準備最好都自己,這能少掉很多麻煩。人手不足也是需要考量的,只有一人是無法在兩端同時移動,自己架了兩台,當在其中一台時,另外一台就沒有人可以留意了,要是出了什麼狀況,是無法即時處理。

因此使用這個方法,是可以只用一台電腦就做到iperf3測速,就能降低很多要求。雖然這個方法會有網點距離的要求,以及額外的外接網卡。

不過一個人能進行的話,就大幅減少缺人就做不了的困擾。

Port Mirror 初嘗試

Port Mirror是側錄封包,並且往其中一埠或一個目的端傳送錄下的封包,這些封包會用於分析,多半目的是用於流量分析或惡意檢測。

Port Mirror要具備兩個:

  • 可以側錄封包的設備,通常為Switch其自身功能。
  • 可以接收封包的設備。

在Switch,大廠牌通常都具有Mirror的功能。我個人用的也買了一台 NETGEAR GS305E,看中其有網管功能,終於有機會用到這項功能。

NETGEAR GS305E 設定 Port Mirror

接收設備是用Windows 10 + Wireshark,網卡接在Port 3,執行Wireshark後,可以看到Port2的封包。建議把接收Mirror網卡的IPv4跟IPv6給取消掉,這樣錄起來會比較乾淨。

基於資安,就不秀出成功圖片。

使用Port Mirror是一個很好的實戰教學,前提是先具有多半的IP跟Protocol知識,否則會一頭霧水而卡住。

在TroubleShooting時,對於一個熟悉網路的人,OSI的一到四層是很容易看出來的,狀況明顯,判斷也很明確。不過在更高層的地方出了問題,像是應用層出現了狀況,要是思考範圍只陷於低層級,就會覺得莫名其妙。

下了指令,卻沒有作用。確認一到四層沒問題之後,那麼指令是真的執行嗎?還是執行失敗呢?這是很耐人尋味的了。

Android11 802.1x CA憑證問題 – 以Aruba解決方案

今天終於親自讓Pixel5連上802.1x認證的Wifi,在這裡先留下一些筆記。

造成Android11連不上802.1x的問題根源是數位憑證認證機構(英語:Certificate Authority, CA)憑證,CA憑證一定得選擇,就意味著得匯入CA憑證到Android裝置,才可以解決問題。

CA憑證有許多解決方案,Windows Server也可以當CA。只是這裡選擇用Aruba ClearPassPolicyManager(CPPM)。

對於一個憑證菜鳥,這邊會一一講解概念。

先講最終的目標:手機上面的Wifi憑證的CA要跟Radius Server憑證的CA是可以對上的。

每個單位可以自行產生憑證(如:Radius Server),而替人簽署憑證的機構為CA,CA自己也有憑證,稱為CA憑證。

CA的運作模式是一條鏈,鏈的最上頭稱為「Root CA」,也是最源頭的簽署憑證機構。其他設備可以去向CA要求簽署設備自身的憑證,「請求簽署憑證」這項功能在設備上可以找到,按下後,設備會產生一串代碼,這串代碼傳至CA後,CA會簽署而產生簽署過的憑證,最後再把 簽署過的憑證傳到設備上,就完成加入這串CA鏈。

即使不是Root CA,也可以去簽署別台設備的憑證,然後別的設備繼續串在CA鏈的後方,成為次一級的CA。因此下游設備可以不斷簽署跟幫人簽署,這失去了公共監控,公信力不高。

使用CA本身的目的是在於驗證真偽,沒辦法控管第二級與之後的CA,但只要控管Root CA,就可以解決濫發跟公信力的問題,因此針對Root CA就有了許多要求,符合要求的就能合法CA,這些合法CA的清單也能在各種裝置上找到。

如果使用者使用CA憑證作認證,使用者在連線的時候會去查看認證伺服器的憑證,然後查看「自身使用CA憑證的CA」跟「 認證伺服器憑證的CA」是否相同,是的話就能信任。

將CPPM作為Radius Server,本身預設是自簽CA,因此得替換上面的憑證,去換成一張被CA簽署過的憑證。

而在CPPM裡面的On board,是可以作為Root CA。

因此使用CPPM policy manager(PM)去向CPPM on board(CA)請求簽署憑證,然後再把on board上的簽署憑證(Trust)匯回PM,就能完成替換 Radius Server 憑證的動作。(※https跟其他服務又有自己的憑證)

接著處理客戶端,客戶端缺甚麼?就是CA憑證。因為合格CA清單其中不會有自己起的CA,於是就把手動匯入。

現在 CPPM on board 上可以看到三張憑證,一張是PM的,另一張是自簽的,最後一張是Root CA,也是所謂的 CA憑證 。(CA簽署過的憑證,唯獨憑證所有者(請求簽署憑證的設備)才能使用的,因此可以排除PM跟自簽的。)

把Root CA的CA憑證匯出,放到客戶端上。在Android11上從「設定」>「安全性」裡找到安裝憑證,並選擇「Wi-Fi憑證」,並且在wifi連線設定中的「CA憑證」選項選擇剛剛匯入的憑證。

設定 > 安全性
安全性 > 進階 > 加密和憑證
安裝憑證
Wi-Fi憑證

只差最後一步了。

Android11 Wifi使用WPAx-Enterprise作認證,在設定中有項「網域」是強制輸入的,這要填甚麼呢?這裡要填「認證伺服器CA憑證的名稱」也就是Common Name(CN),這跟網址的Domain是不一樣的。在CA憑證的世界中, Common Name通常是用公司的名稱去申請,使用者在還沒通過之前是無法得知DNS的Domain,但能看到認證伺服器CA憑證的 CN,這是特別容易搞混的地方,所以得寫長一點去強調它。

已經完成了所有步驟,如果其他環節沒有出差錯,Android11就能連上802.1x認證的SSID。

特定路由走VPN,其他走當地

今天發現VPN被鎖,只能存取部分設備,不能上網,這是基於安全性的設置,是比較好的作為。環境:Windows 10、Global Protect (SSL VPN)。

不過也讓人頭痛,自動化如果要正常運作,不僅要能存取設備,還要可以上網回報,這樣子讓運作卡住。

說說VPN的運作,只要連上去後,除了特定網段,其餘流量都會走VPN出去。至於去哪裡往哪個介面送,這就是路由表的功能,查表決定封包方向,而Windows也有內建路由功能,可以做修改。

首先要先解決Default Route(預設閘道),透過 cmd 輸入「route print」 ,可以看到 0.0.0.0 0.0.0.0 這類的,由於我使用 Global Protect,所以沒有像這篇,可以取消遠端網路的預設閘道。

明明有兩個預設閘道,為什麼會都走VPN出去?這是因為Metric的關係。比起改Metric,更建議的做法是直接刪除走VPN的預設閘道。

透過「route delete 0.0.0.0 mask 0.0.0.0」就能刪除預設閘道。(記得用管理員權限執行cmd

接著把當地的預設閘道加回去「route add 0.0.0.0 mask 0.0.0.0 [Gateway IP]」。

不過路由表中有路由的預設閘道是「在連結上」,這個其實很簡單,就是把Gateway設定成介面IP。如果我的VPN介面是10.123.234.111,那麼Gateway就是 10.123.234.111 。

因此,如果想要透過VPN到達網段為「xxx.xxx.xxx.xxx/24」,就這樣輸入「route add xxx.xxx.xxx.xxx mask 255.255.255.0 [VPN介面IP]」。

EVE-NG 安裝在 ESXi 上與映像檔部署

遇到了很多困難,所以紀錄一下方式。

EVE-NG 安裝在 ESXi 上

關於EVENG VM有兩種版本,一種是OVF,另外一種是ISO。如果要快速部署,會使用OVF。

失敗,在ESXi上說需要更高的權限。

就算使用更高的權限,匯入OVF檔案也是失敗。

換個方式,使用ISO。教學影片

先把ISO匯入資料存放區,然後新增一個VM,最後要選擇ISO檔開機。如果沒有選對配置,就不會成功。最重要是要用BIOS開機。

  • 客體作業系統:Linux
  • 客體作業系統版本:Ubuntu Linux (64位元)
  • 開機選項 > 韌體:BIOS

順利安裝完成,重開完機,進入下一個階段。

映像檔部署

由於之前都在GNS3練習,手邊剛好有Cisco c7200跟L2、L3 IOU Switch的映像檔。至於要去哪裡取得,其實搜尋一下就會有了。

首先透過ESXi進入EVE-NG,預設帳/密為 root/eve ,然後會做一點基本設定,之後會再重開,再次進入,就能看到熟悉的Linux。

這裡推薦使用SSH連線跟WinSCP傳輸檔案,使用SSH連線,可以方便複製貼上,使用WinSCP可以快速把檔案傳到目錄,甚至可以直接把文件做修改,像是改成固定IP,會方便許多。

官方教學文件:

關於IOU的License,只要system name沒有更改,算出來都會是一樣的,可以不執行keygen.py,直接新增一個檔案 /opt/unetlab/addons/iol/bin/iourc 內容為下列代碼。

[license]
eve-ng = 972f30267ef51616;

這裡提兩個重要的提醒事項

  1. Cisco Dynamips images是吃 image 檔,bin檔可以解壓縮,解壓縮出來的檔案副檔名改成 image、主檔名就是bin檔的主檔名,直接透過WinSCP傳到對的目錄,或是照著文件去改。
  2. 凡是傳入檔案或做修改,請在根目錄執行指令「/opt/unetlab/wrappers/unl_wrapper -a fixpermissions」,因為預設讀寫權限會造成無法正常運行,下了指令就可以修改權限,讓映像檔正常運作。

簡記

因為GNS3的WEB介面太難用,也不能順利跑IOU。昨天同事傳給我看一個PNET,不過PNET不適合用在ESXi上,設計給Workstation,不過PNET算是目前看到最不錯的,畢竟映像檔是這類虛擬機LAB的入門障礙,PNET不需要自己去尋找。

於是嘗試使用EVE-NG去架設,需求是可以建立一個WEB,讓別人可以去存取練習,設計一些LAB給新人練習。最後也順利架起來,順便改成固定IP。

BGP – TTL Security

關於這個,大部分只有看到可以防止惡意的更新,消耗設備的CPU資源。

這邊先講解要如何進行防禦。

今天有兩個Router,彼此直連,因此當收到對方的BGP報文時,TTL沒有被減少過的,為最大值如255。

有一個攻擊者,接在任何一顆Router上,要攻擊另外一顆BGP Router,封包會轉送一次,這樣子TTL會減少1,然後才被BGP Router收到。

TTL Security是去檢查TTL的剩餘次數,如上述案例,TTL Security hop設定為1,就會丟棄TTL為254(255-1)以下的BGP報文。

不過呢!BGP的角色可以分為eBGP跟iBGP。在eBGP傳遞BGP報文時,TTL預設是為1;而iBGP則為255。因此,要用在eBGP上面,就要修改TTL。

目的

瞭解eBGP的TTL,修改BGP的TTL,最後施用TTL Security。

設定

R1、R2、R3彼此皆為eBGP關係。

!R1
conf t
int loopback 1
ip addr 1.1.1.1 255.255.255.255
no sh
int g0/0
ip addr 10.1.12.1 255.255.255.0
no sh
router bgp 1
network 1.1.1.1 mask 255.255.255.255
network 10.1.12.0 mask 255.255.255.0
neighbor 10.1.12.2 remote-as 2
neighbor 10.1.13.3 remote-as 3
exit

!R2
conf t
int loopback 1
ip addr 2.2.2.2 255.255.255.255
no sh
int g0/0
ip addr 10.1.12.2 255.255.255.0
no sh
int g1/0
ip addr 10.1.23.2 255.255.255.0
no sh
exit
router bgp 2
network 2.2.2.2 mask 255.255.255.255
network 10.1.12.0 mask 255.255.255.0
network 10.1.23.0 mask 255.255.255.0
neighbor 10.1.12.1 remote-as 1
neighbor 10.1.23.3 remote-as 3
exit

!R3
conf t
int loopback 1
ip addr 3.3.3.3 255.255.255.255
no sh
int g0/0
ip addr 10.1.23.3 255.255.255.0
no sh
int g1/0
ip addr 10.1.34.3 255.255.255.0
no sh
exit
router bgp 3
network 3.3.3.3 mask 255.255.255.255
network 10.1.23.0 mask 255.255.255.0
neighbor 10.1.12.1 remote-as 1
neighbor 10.1.23.2 remote-as 2
exit

設定為後,R1跟R2形成鄰居,R2跟R3形成鄰居,而R1跟R3卻沒有形成鄰居。

R3#show ip bgp summary
Neighbor        V          AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.1.12.1       4          1       0       0        0    0    0 never    Idle

設著用R3去ping到R1(10.1.12.1),是互通的。

這是因為eBGP的預設TTL為1,所以傳到R2就被丟棄了。要調整一下eBGP的TTL。

R1(config-router)#neighbor 10.1.23.3 ebgp-multihop 255
R3(config-router)#neighbor 10.1.12.1 ebgp-multihop 255

接著,R1跟R3就形成鄰居關係了。

用wireshark看,R1發出的TTL變成255,R1收到的變成254,但到R2只有1。

接著在R2下 TTL Security,然後去影響R3的Route,看R2能不能更新。

R2(config-router)#neighbor 10.1.23.3 ttl-security hops 1

R3(config)#
int loopback 2
ip addr 3.3.4.3 255.255.255.0
router bgp 3
network 3.3.4.0 mask 255.255.255.0
exit

接著觀察R2有沒有從R3收到Loopback2的Route,結果收到從R1傳來的R3的Loopback2,這是因為BGP的收斂速度比較慢,過一陣子就會斷了。

要讓R2跟R3重新建立起鄰居關係,那麼R2收到的TTL需要超過254,因此可以在R3下指令,改成255。

R3(config-router)#neighbor 10.1.23.2 ebgp-multihop 255

很快R2跟R3就建立起鄰居關係了。

接著在R3對R1下TTL Security。

R3(config-router)#neighbor 10.1.12.1 ttl-security hops 1

Remove ebgp-multihop before configuring ttl-security

這裡收到一句提示,其實當我們在R2下TTL-Security時,R2對R3發的BGP報文TTL就已經改為255。這也是因為TTL Security的機制,只有從TTL最大值開始算,對方收到才會是最大值,才能去防禦攻擊。

正確的設定方式兩鄰居同時啟用ttl-security!

R1(config-router)#neighbor 10.1.23.3 ttl-security hops 2

R3(config-router)#
no neighbor 10.1.12.1 ebgp-multihop
neighbor 10.1.12.1 ttl-security hops 1

R1跟R3中間經過R2轉了一手,因此TTL會減1,等R3收到時,TTL為254,就會被丟棄,於是就沒有辦法更新route。

R3(config-router)#

neighbor 10.1.12.1 ttl-security hops 10

在R3收到TTL為254,新的TTL Security設定只要小於244才會丟棄,254 > 244 所以接收,因此就可以找回鄰居關係。

這樣的機制,除了鄰居直連之外,理論上,只要ttl-security hops超過1,攻擊者可以從中間轉送的Router去偽造BGP報文TTL為255也能成功。

不過TTL-Security已經可以防止從遠處攻擊,降低了不少潛在風險。