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...