Linux虛擬網路之tun(一)基本使用

2021-07-30 22:56:34 字數 2685 閱讀 2690

tun/tap 裝置是一種讓使用者態程式向核心協議棧注入資料的裝置,乙個工作在三層,乙個工作在二層。理論知識可以看:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

void task(char* dev, int net_addr)

memset(&ifr, 0, sizeof(ifr));

ifr.ifr_flags = iff_tun | iff_no_pi;

strncpy(ifr.ifr_ifrn.ifrn_name, dev, ifnamsiz);

if(0 > ioctl(tun_fd, tunsetiff, &ifr))

// bring up the inte***ce

int sock = socket(pf_packet, sock_raw, htons(eth_p_all));

if(0 > ioctl(sock, siocgifflags, &ifr))

ifr.ifr_flags |= iff_up | iff_running | iff_promisc;

if(0 > ioctl(sock, siocsifflags, &ifr))

ifr.ifr_addr.sa_family = af_inet;

((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr = net_addr;

if(0 > ioctl(sock, siocsifaddr, &ifr))

ifr.ifr_netmask.sa_family = af_inet;

((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr.s_addr = inet_addr("255.255.255.0");

if(0 > ioctl(sock, siocsifnetmask, &ifr))

if (ioctl(sock, siocgifindex, &ifr) < 0)

struct sockaddr_ll addr;

memset (&addr, 0, sizeof (addr));

addr.sll_family = af_packet;

addr.sll_ifindex = ifr.ifr_ifindex;

addr.sll_protocol = htons(eth_p_all);

printf("addr.sll_ifindex %d" ,addr.sll_ifindex);

if (-1 == bind(sock, (struct sockaddr *)&addr, sizeof(addr)))

int n_bytes;

unsigned

char msg[8000];

in_addr ip_addr;

ip_addr.s_addr = net_addr;

int j = 500;

while(j-- > 0)

}while(true)

}}int main()

1、上面**建立了兩個tun裝置(tun0和tun1),每個裝置有自己的位址。

2、task中演示了兩種訪問tun裝置的方式 – 檔案方式和socket方式(為了讓socket能收發所有的包,用了sock_raw,這裡可以根據自己的需要建立其他協議型別的socket)。

3、假設有個目標位址是 10.0.0.10,執行下面的命令,程式就可以列印所接收到的包了。

ping 10.0.0.10 -i tun0
curl可以如下使用:

sudo curl --inte***ce tun_srsue -o target_url
4、如果使用tun方式,收到的包都是ip包;如果使用tap方式,收到的是乙太網幀。

5、跟netlink其實有點像,很多場景下可以互換。不過從使用方便程度看,tun佔很大優勢,因為不用編寫核心驅動。跟netlink的效能沒有對比測試,有空了測測。

說到使用方便性,在go語言中體現更明顯。目前為止還沒有哪個netlink庫能很方便的使用,但是tun庫是有的,**如下:

LINUX 虛擬網絡卡tun例子

linux tun 例子 來至 和 建立乙個tun0的虛擬網絡卡進行通訊,程式關閉後將消失。ping 10.0.0.1 documentation networking tuntap.txt br select.c bridge based on select system call.br sigi...

Ubuntu14 04虛擬網路裝置TUN安裝

1 檢測系統中是否存在tun模組,ctrl alt t開啟ubuntu終端,輸入 modinfo tun modinfo error module tun not found.modprobe tun lsmod grep tun 沒有任何輸出 就是說沒有這個tun模組 2 更新ubuntu 以ro...

網路虛擬化之linux虛擬網路基礎

在linux裡面devic 裝置 與傳統網路概念裡的物理裝置 如交換機 路由器 不同,linux所說的裝置,其背後指的是乙個類似於資料結構 核心模組或裝置驅動這樣的含義。就是說device可能只是軟體系統裡的乙個驅動,乙個函式介面。tap位於二層資料鏈路層,tun位於三層網路層,兩者在linux裡的...