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