文章

顯示從 八月, 2021 起發佈的文章

Rootless Router(Part: 3) EtherGuard

圖片
前篇:  Rootless Router (Part2): BIRD-vpp 前情提要: 總之BIRD確定了要用python糊以後,我就來決定來搞多節點互連了 Mesh VPN 我決定弄一個layer 2 的mesh VPN,用於我之後會架設的多個節點之間的互聯。 至於為什麼我要自己弄這個VPN呢?  首先,因為幾乎沒見到別的VPN軟體支援VPP VPP雖然有內建VPN,但是沒有一個支援udp打洞 我想要有一個VPN能夠用在VPP上,又能夠udp打洞,似乎只能些修改/重寫了 比較過幾個,最後還是決定以go語言為基礎 因為之前弄 wireguard-go-vpp 的時候,go語言下的libmemif環境都弄好了 如果要基於C++的改成memif後端,不知道環境又要搞多久 順帶一提,go語言的環境設計,真的太神了,不得不吹 不像C++有各種路徑要設定,ld_library_path,還有gcc加上LDFLAGS之類的設定 還有namespace的問題,C++的include真的就只是單純把那段code貼到#include的地方 這個設計,簡單是很簡單,但是各種變數汙染也是不好弄 go語言就方便多了。go get XXX,go mod vender,所有需要的檔案通通搬去vender子資料夾 mod之間也不會互相汙染,真是太神奇了! go語言萬歲! EtherGuard 花了半個月,我終於寫完了! 最後我決定把新弄得VPN取名叫做Etherguard。為什麼叫做Etherguard呢? 是因為code是從wireguard-go改來的,所以加密方法,header之類都和wireguard一樣,就取guard部分 又是二層VPN,layer 2又叫Ethernet。就取Etger的部分。組合再一起變成Etherguard 而且我想順便引入單向延遲選路的功能 OSPF能夠根據cost自動選路 但是實際上,我們偶爾會遇到去程/回程不對等的問題 之前我就在想,能不能根據單向延遲選路呢? 例如我有2條線路,一條去程快,一條回程快。就自動過去回來各自走快的? 而且市面上也完全沒有類似的VPN軟體能做到這點(或是我不知道) 因為這個我開始擔心了。因為 測量單向延遲是不可能的 。 難道要做出有上述效果(根據單向延遲選路)的VPN是不可能的? 單向延遲選路 於是我又在想了,有時鐘誤差下的單

(轉載) Azure for Students的一些改动

轉載自:  https://xrenblog.com/article/000007/.html 据观察,对于前些阵子的azure子域泛滥,微软也是对Azure for Students做出些许改动,改动包括但不限于以下几条: Azure for Students的资格认证从以往的只看域名变成了域名+许可,也就是说未激活的无许可账号将无法获取Azure for Students,只能获取到Azure for Students Starter。 Azure for Students Starter是Azure for Students的入门版,跟Azure for Students的区别在于,前者没有100美元的额度,所以只能用免费层的服务,而且超过90天不登录账号的话,账号就会被删除。 但并不是说az子域就不能用了,最廉价的方案就是偷渡a1搭配az子域,其余方案此处不变展开。 鉴于微软已经逐步对Azure for Students重拳出击,可以预测到Azure for Students会逐步加大审核力度,变成像是GitHub那样的人工证件审核也说不定。 就先说那么多,有什么新发现会再补充。 

Rootless Router (Part2): BIRD-vpp

圖片
前 篇:  Rootless Router (Re:0): VPP Host stack 前情提要: exabgp / gobgp / frr / python3-http-server 沒有一個能正常運作,我正心灰意冷的時候,發現有一個居然能夠正常運作,就是BIRD BIRD-vpp https://zstas.github.io/jekyll/update/2020/03/07/vcl.html   這篇文章作者讓BIRD在VPP host stack底下成功運作起來了 我一開始一直沒辦法成功運作,出現 Socket error: IP_TTL: Operation not supported 詢問了群友們沒有結果,畢竟這個玩法不是這麼的常見,那麼只能自己看源碼了 發現... 沒辦法,只能改原碼,BIRD不提供任何設定檔關掉這個行為 經過一番 patch ,BIRD 終於運作起來了。 其中讓我覺得最雷的是這一段 因為VPP是按照POSIX規範進行實作,但BIRD居然沒有遵照POSIX規範呼叫,導致無法正常運作!! linux給你方便,其他人好歹也遵守一下POSIX標準吧。能遵守POSIX盡量遵守,害我在這邊花超多時間QQ 好的開始 但是我發現BIRD雖然起來了,但是peer一直都是idle狀態,就是不肯連線。 lsof查看,也沒有監聽任何port。 網路上查詢過以後發現別人也遇過這個問題,只要加上multihop就可以了。 此時我也不知道multihop是什麼,但是ipv4 / ipv6都能Eastablish,路由也有正常過來 大部分都運作正常,但是就只有ipv6 link-local沒辦法正常運作 這裡可以看到,link-local一定要綁定interface才能運作 我以為只要解決ipv6 link local問題,就萬事大吉。沒想到這才是惡夢的開始... IPV6 Link Local 問題 首先我們要知道BIRD運作的環境。也就是VPP Host Stack 一般情況我們程式想要監聽port,多半會呼叫bind()這個系統呼叫。 想要連線,就會呼叫socket()這個系統呼叫。如果呼叫成功,就會拿到一個file descriptor,是一個整數 之後呼叫Read/Write function時,傳入fd,OS就會把資料弄去buffer了 這一切,OS會

Rootless Router (Re:0): VPP Host stack

圖片
前篇:  Rootless Router (Part 1): wggo-vpp 前情提要: wireguard和vpp終於串在一起了,接下來就是讓BGP Daemon跑起來了。 為什麼是Re:0 呢? 當然是因為進度歸零了。之前弄的東西,今天發現都不能用了,我難過QQ😢 因為主機上是看不到VPP裡面的interface的,所以socket() bind()一定連不到東西。 這時就如一開始預期的,使用VPP Host stack的功能。 VPP會內部維護一個網路堆疊,應用程式設定LD_PRELOAD來攔截程式內的socket(), bind(), sendmsg(), recvmsg(),轉去VPP內部的網路堆疊 理想是美好的...但是經測試這功能根本不是一個可以用的狀態 當初開始前有大致測試一下,python3 -m http.server 然後 wget ,能正常運作,我才放心地開始弄wggo-vpp 結果多測試幾下就不行了 先用普通的 python3 -m http.server 架設一個簡單的web server 我從另一端(普通的linux+wireguard)用 wget 10.127.111.1:8080 來發送請求,第2個請求以後,VPP端的python必定當掉 可以看到第3個wget就沒反應了 這邊看到第二個請求以後,disconnected VPP 裡面,可以看到API client died 之後我又陸續測試了 frr/bgpd(with no_kernel and no_zebra option) gobgp exabgp 沒有一個能變成Established狀態 只有wget/nc 之類的程式有正常運作 哀,我沒想到VPP Host stack的bug這麼多,連python3 -m http.server都沒能正常運作,更別指望exabgp之類要求更高的程式了... 現在又回到 最初的狀態 ,弄一個在userspace運作的網路堆疊,並把bgp daemon+wireguard整合進去了 不知道gVisor和UML哪個比較好。 不過這2個無論哪個,相容性都變差了。 因為他們是用ptrace來達到kernel bypass的效果,然而docker預設不開放這個權限 我的dn42 in heroku計畫就🈚️了 😭 😭 😭 目前我找到的