Golang 學習筆記——tun/tap 程式設計

flynike發表於2021-09-09

tun/tap 是作業系統核心中的虛擬網路裝置。tap 等同於一個乙太網裝置,它操作第二層資料包如乙太網資料幀。tun 模擬了網路層裝置,操作第三層資料包比如IP資料封包。

tun 裝置

  • linux 下建立命令:
# add tun
sudo ip tuntap add tun0 mode tun
# del tun
sudo ip tuntap del tun0 mode tun

圖片描述

  • golang 建立
import (
	"fmt"
	"github.com/songgao/packets/ethernet"
	"github.com/songgao/water"
	"time"
)

func main() {
	tapconfig := water.Config{
		DeviceType: water.TAP,
		PlatformSpecificParams: water.PlatformSpecificParams{
			Name: "tun0",

		},
	}

	ifce, err := water.New(tapconfig)
	if err != nil {
		fmt.Printf("建立失敗:%v n", err)
		return
	}

	var buf ethernet.Frame

	for {
		_, err := ifce.Read(buf)
		if err != nil {
			fmt.Printf("讀取資料:%v n", err)
			return
		}

		time.Sleep(time.Second)
	}
}

tap 裝置

  • linux 下建立命令:
# add tap
sudo ip tuntap add tap0 mode tap
# del tap
sudo ip tuntap del tap0 mode tap

圖片描述

  • golang 建立
import (
	"fmt"
	"github.com/songgao/packets/ethernet"
	"github.com/songgao/water"
	"time"
)

func main() {
	tapconfig := water.Config{
		DeviceType: water.TAP,
		PlatformSpecificParams: water.PlatformSpecificParams{
			Name: "tap0",
			Persist: true,
		},
	}

	ifce, err := water.New(tapconfig)
	if err != nil {
		fmt.Printf("建立失敗:%v n", err)
		return
	}

	var buf ethernet.Frame

	for {
		_, err := ifce.Read(buf)
		if err != nil {
			fmt.Printf("讀取資料:%v n", err)
			return
		}

		time.Sleep(time.Second)
	}
}

tun 和 tap 建立除了型別其他基本一樣,引數 water.PlatformSpecificParams.Persist 表示持久化,預設為 false,程式停止,虛擬網路卡自動刪除,如果設定為 true,虛擬網路卡不會自動刪除。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2618/viewspace-2818176/,如需轉載,請註明出處,否則將追究法律責任。

相關文章