發表文章

SDN 簡介

這邊是 2014.06.23 在元智大學介紹  SDN 所使用的簡報。這幾份簡報基本上已經覆蓋了 SDN 的技術研究以及實際開發所需要的背景,很適合當作入門的簡報。當中還缺少一份關於 OpenFlow 的介紹,因為那是我同事製作的,不方便放到我自己的 Blog 上面,所以之後我自己補上那一份的自行製作的投影片。另外,我很討厭我公司的簡報背景,所以我換了自己喜歡的 template 才放上來。 如果有人需要我去簡介的話,歡迎隨時跟我聯絡,我很樂意唷! 01.Introduction.to.SDN 這份投影片是從故事入手,幫助大家輕鬆學習 SDN 的概念,也同時帶出業界不同公司的不同看法。 02.SDN.Research.Tools SDN 很紅,但如果要做研究,應該要從何上手?OpenFlow Switch 很貴,我該怎麼辦?這份投影片介紹目前 SDN可使用的相關工具,並給了自己的 Comments。 03.SDN.APPs 軟體定義網路,關鍵當然在軟體(智能),該怎麼設計自己的網路才是 SDN 的真正關鍵。本份投影片介紹了 SDN App 的設計概念,透過實際的例子來帶出 SDN 創新思維。

Netfilter Hook 程式範例

圖片
Netfilter 是 Linux Kernel 裏面對於網路封包處理一個非常有趣的設計,它在 Linux Kernel 的封包處理路徑上安插了許多的 Hook Point,這樣使用者可以隨自己的高興在這些 Hook Point 上安插自己的封包處理行為(使用註冊 callback function的方式),常見的應用如防火牆檢查、NAT等。在這邊稍微提一下,很多人會說 Linux 是用 iptables 來做防火牆的,我不太喜歡這個說法(但我不會說它是錯的),因為 iptables 不過是設定 netfilter 的 user space 工具,當你使用 iptables 時,不過就是將那些功能模組配合上使用者輸入的參數,然後掛載到對應的 Hook Point。下面是來自官網的描述: netfilter is a set of hooks inside the Linux kernel that allows kernel modules to register callback functions with the network stack . A registered callback function is then called back for every packet that traverses the respective hook within the network stack . 至於有哪些 Hook Point 可以參考下面這張來自 Wiki 的圖:  這個概念是從 Linux Kernel 2.4 以後就內建在核心的機制。基本上我在研究所很常利用 iptables 這個設定工具來使用 netfilter,但一直沒有實際寫這 callback 的機會(之前工作上沒碰到,外加人懶)。但現在因為工作上有特殊的需求(來自一個莫名其妙的設計),所以就請(逼迫?)我同事撰寫了一個 Netfilter Callback 的模組範例出來(從程式裡可以找到作者),下面就是這個範例: # include < linux/module.h > # include < linux/kernel.h > # include < linux/init.h > # include ...

Linux Virtual Interface: TUN/TAP

圖片
今天要介紹的,不是什麼新技術,只是之前沒碰過,而現在工作有用到,所以做個私人紀錄。 問題描述以及過去的解決方案 工作上面遇到的問題,如何建立一張虛擬的網路介面,並且讓封包經過該介面後額外封裝一個新的 Header。建立虛擬網路介面不難,但要如何去撈封包(使封包經過該介面)呢?並且之後封包的處理又是如何?之前在公司曾經用過幾種招數: 第一個作法是透過 Bridge 來將網卡綁在一起,然後去修改 Bridge 的程式碼做自己想做的事情。第二個作法是透過 Netfilter 來攔截封包,做完事情以後再硬導到正確的網卡。這兩個作法很 亂來 ,我的亂來指的是不理會 Linux 內部封包處理流程,隨意的處理並安插封包,但我可沒說這樣做不到啊。第3種方法很好,完全符合 Linux 核心的封包處理程序,代表的例子就是 GRE,問題是現在的封裝技術亂七八糟(這個詞純粹是為了抱怨用),並不一定是單純的 IP-in-IP ,所以這個架構不一定適用。正當決定來亂搞的時候,有人提供了一個新的方向(應該是說自己孤陋寡聞):TUN/TAP。 TUN/TAP: Virtual Network Kernel Device 我們先抄一下 Wiki 上的說明: In computer networking, TUN and TAP are virtual-network kernel devices . Being network devices supported entirely in software, they differ from ordinary network devices which are backed up by hardware network adapters. TUN (namely network TUNnel) simulates a network layer device and it operates with layer 3 packets like IP packets . TAP (namely network tap) simulates a link layer device and it operates with layer 2 packets like Ethernet frames . TUN is used...

為何 sudo 無法用來設定 ip_forward

這是一個在網路上很常見的問題,因為自己碰到了,所以就留下紀錄囉。 用 Linux 開發網路設備的人,應該很常使用下面的這命令: echo 1 > /proc/sys/net/ipv4/ip_forward 想當然,這是 root 才能做的事情,那麼,在 ubuntu 裏面,很自然就會用下面的指令執行: sudo echo 1 > /proc/sys/net/ipv4/ip_forward 實際執行結果居然是 Permission Denied ?? 其實會出現這個問題, 主要的原因在於 shell 在執行 redirect 的流程 。上面的指令對 shell 來說其實等於下面兩個指令: "sudo echo 1" 以及 redirect to "/proc/sys/net/ipv4/ip_forward" 很明顯,真正需要 root 權限的第二個步驟反而沒有 root 的權限。所以系統當然會說 Permission Denied。解決的方法如下: sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" 這就不用說明了吧

列王記:約蘭(TBC)

好久沒寫了 ... 人果然是懶惰的,但願能有始有終,把整個列王給完成。下一個登場的王是以色列王約蘭。聖經中叫約蘭的王還有另外一位,這位是北國的王,在列王記下佔了眾多的篇幅唷,可見他的重要性(才怪,大部份是以利沙的紀錄,這篇是不是應該改名叫以利沙啊)。那,開始了! 姓名: 約蘭 國家:北國以色列 對應的南國君王:約沙法、約蘭、亞哈謝 (取名有創意一點吧 ...) 聖經記載: 1. 以利亞升天(王下2:1-18) 2. 醫治耶利哥的泉水(王下2:19-22) 3. 以利沙與童子(王下2:23-25) 4. 三王戰摩押(王下3) 5. 以利沙與寡婦和書念婦人(王下4:1-37) 6. 以利沙的食物神蹟(王下4:38-44) 7. 乃縵得醫治(王下5) 8. 失而復得的斧頭(王下6:1-7) 9. 與我們同在的比與他們同在的更多(王下6:8-23) 10. 撒馬利亞解圍(王下6:24-7:20) 11. 歸鄉的書念婦人(王下8:1-6) 12. 哈薛篡位(王下8:7-15) 13. 耶戶叛變(王下9:1-26) 1. 以利亞升天(王下2:1-18) 以利亞的工作要結束了,神要將他接去。他對以利沙說:「耶和華差我往伯特利去,你可以在這裡等候。」很明顯,他其實不想帶以利沙去,康來昌牧師對這一段有些有趣的解釋,他認為以利亞其實不太喜歡以利沙,因為以利亞去撿選以利沙的時候,以利沙跟他說:「求你容我先與父母親嘴,然後我便跟隨你。」而沒有直接來跟從以利亞。Well ... 也許吧,但聖經也沒明顯這樣說,所以我也不知道是不是,但毫無疑問,以利亞三次試圖要把以利沙拋下,但以利沙的立場非常堅定:「我指著永生的耶和華,又敢在你面前起誓,我必不離開你。」(王下:2:3、5、6) 為什麼以利沙這麼不聽話?看到以利沙的行為,讓我想到了聖經中的另外兩個人:雅各、路得。雅各在毘努伊勒和上帝摔跤(創32:24-30),並堅決不讓上帝離開,堅持要上帝的賜福;當拿俄米對俄珥巴和路得說:「你們各人回娘家去吧。」雖然一開始兩個人都拒絕,不過最後只有路得一個人和拿俄米回去。以利沙在以利亞身上、雅各在那個人身上、路得在拿俄米身上,我覺得他們都從這些人背後看到了上帝,他們也很了解「 神啊,你的慈愛何其寶貴!世人投靠在你翅膀的蔭下。 」(詩36:7),所以他們才會做出這...

SDN Switch OS ... 這是啥?

圖片
這篇文章的起因是 ... 有個長官要求我們去 "study SDN Switch OS",因為覺得如果以計劃的力量去開發這個「作業系統」可能資源不夠,所以集中資源直接向已經有的公司買個一套,然後在計劃內直接移植。 但什麼是 SDN Switch OS?先說結論, 根本沒有這東西!! SDN Switch OS這個名字的由來是 Pica8 這家公司這家公司推出的,他們宣稱他們公司有 PicOS 。我們直接看看他們網頁是怎麼說的: Our hardware-agnostic, Debian-based , and OpenFlow-supporting switching operating system—PicOS™—is loaded onto commoditized, or "white box" bare-metal switches purchased from our ODM (original design manufacturer) partners. 首先,根據作業系統的定義,他們的作業系統就是 Linux,其他的功能不應該屬於作業系統層級。而且根本就是 Debian。第二,什麼是 OpenFlow supporting switching?說穿了 就是把 openvswitch 移植上去 。這樣說起來,請問你要跟這些公司買啥東西啊? 當然這些公司不是沒有他們優化(正確來說比較是平台移植的問題)的厲害之處。他們做的事情以下圖所示:  左邊的圖示單純把 Openvswitch 移植到平台上,如果之前 Blog 所示範的,我已經成功的將 Openvswitch 移植到 pandaboard 上面(另外一位同事也移植到了 raspberry pi 上面)。這樣的效能當然好不到哪裡去,但是可以用。右邊的圖是這些廠商所著重的部份,就是把 openvswitch 的 kernel module 整合 現有的硬體網路晶片 ,來提升網路傳輸的效能。所以他們會做一層 HAL。問題是現有的晶片根本不支援 OpenFlow ... 所以反而在功能層面會有所缺乏。相反地,左邊的解決方案是純軟體的,所以功能層面齊全的更多。如果要實際細分的話,大概在 Action 和 Set Field 這兩樣功能現有晶片支...

如何下載 TED 的字幕

TED是一個演講計劃,也可以用做練習英聽的題目,問題是和增進英文比較起來,我對演講內容比較有興趣,所以我還是寧可看中文字幕。以往我都是透過 http://tedtalksubtitledownload.appspot.com/ 來下載字幕,問題是 TED 的網頁改版了!!所以上面這個網頁沒辦法用,因此本人就決定自己來打造一個 TED 的字幕下載工具(順便當作 Python 的程式練習)。 import urllib def parseTime ( str ) : time = str . split ( "data-time='" ) [ 1 ] . split ( "'" ) [ 0 ] return time def parseSub ( str ) : subtitle = str . split ( ">" ) [ 1 ] . split ( "<" ) [ 0 ] return subtitle def time2Str ( time ) : minisecond = time % 1000 second = ( time / 1000 ) % 60 minute = ( ( time / 1000 ) / 60 ) % 60 hour = ( ( ( time / 1000 ) / 60 ) / 60 ) % 60 miniSecStr = str ( minisecond ) secStr = str ( second ) minStr = str ( minute ) hrStr = str ( hour ) # SRT time format: 00:02:52,184 --> 00:02:53,617 if len ( miniSecStr ) < 3 : for i in range ( 0 , ( 3 - len ( ...