發表文章

目前顯示的是 五月, 2014的文章

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 with routing, while TAP …

為何 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"

這就不用說明了吧