官术网_书友最值得收藏!

第2章 Linux虛擬網(wǎng)絡(luò)基礎(chǔ)

Neutron在構(gòu)建網(wǎng)絡(luò)服務(wù)時(shí),利用了很多Linux虛擬網(wǎng)絡(luò)功能(Linux內(nèi)核中的虛擬網(wǎng)絡(luò)設(shè)備以及其他網(wǎng)絡(luò)功能)。為了對(duì)Neutron有一個(gè)全面的理解,掌握一些Linux虛擬網(wǎng)絡(luò)知識(shí)是必要的。本章將從使用方法入手,對(duì)與Neutron密切相關(guān)的Linux虛擬網(wǎng)絡(luò)功能進(jìn)行簡(jiǎn)單介紹。

2.1 tap

Linux在談到tap時(shí),經(jīng)常會(huì)與tun并列談?wù)摗烧叨际遣僮飨到y(tǒng)內(nèi)核中的虛擬網(wǎng)絡(luò)設(shè)備。tap位于二層,tun位于三層。需要說明的是,這里所說的設(shè)備(Device)是Linux的概念,不是我們平時(shí)生活中所說的設(shè)備。比如,生活中,我們常常把一臺(tái)物理路由器稱為一臺(tái)設(shè)備,如圖2-1所示。

圖2-1 一臺(tái)路由器設(shè)備

而Linux所說的設(shè)備,其背后指的是一個(gè)類似于數(shù)據(jù)結(jié)構(gòu)、內(nèi)核模塊或設(shè)備驅(qū)動(dòng)這樣的含義。像tun/tap這樣的設(shè)備,它的數(shù)據(jù)結(jié)構(gòu)如下參考http://blog.chinaunix.net/uid-7220314-id-208711.html。

struct tun_struct {
    char name[8];                           //設(shè)備名
    unsigned long flags;                  //區(qū)分tun和tap設(shè)備
    struct fasync_struct *fasync;       //文件異步通知結(jié)構(gòu)
    wait_queue_head_t read_wait;         //等待隊(duì)列
    struct net_device dev;                //Linux抽象網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)
    struct sk_buff_head txq;             //網(wǎng)絡(luò)緩沖區(qū)隊(duì)列
        struct net_device_stats stats;  //網(wǎng)卡狀態(tài)信息結(jié)構(gòu)
};

我們看到,甚至連數(shù)據(jù)結(jié)構(gòu),tap與tun的定義都是同一個(gè),兩者僅僅是通過一個(gè)Flag來區(qū)分。不過從背后所承載的功能而言,兩者還是有比較大的區(qū)別:tap位于網(wǎng)絡(luò)OSI模型的二層(數(shù)據(jù)鏈路層), tun位于網(wǎng)絡(luò)的三層。本節(jié)暫時(shí)只介紹tap, tun會(huì)在后面的章節(jié)專門介紹。

tap從功能定位上來講,位于數(shù)據(jù)鏈路層,數(shù)據(jù)鏈路層的主要協(xié)議有:

1)點(diǎn)對(duì)點(diǎn)協(xié)議(Point-to-Point Protocol);

2)以太網(wǎng)(Ethernet);

3)高級(jí)數(shù)據(jù)鏈路協(xié)議(High-Level Data Link Protocol);

4)幀中繼(Frame Relay);

5)異步傳輸模式(Asynchronous Transfer Mode)。

但是tap只是與其中一種協(xié)議以太網(wǎng)(Ethernet)協(xié)議對(duì)應(yīng)。所以,tap有時(shí)也稱為“虛擬以太設(shè)備”。

要想使用Linux命令行操作一個(gè)tap,首先Linux得有tun模塊(Linux使用tun模塊實(shí)現(xiàn)了tun/tap),檢查方法如下:

# 如果敲擊Linux命令行modinfo tun,有如下輸出,則說明具有tun模塊
modinfo tun
filename:        /lib/modules/4.5.5-300.fc24.x86_64/kernel/drivers/net/tun.ko.xz
alias:             devname:net/tun
alias:             char-major-10-200
......

當(dāng)Linux版本具有tun模塊時(shí),還得看看其是否已經(jīng)加載,檢查方法如下:

lsmod | grep tun
tun    28672   2

如果已經(jīng)加載,則會(huì)出現(xiàn)上述的“tun***”那一行。如果沒有加載,則使用如下命令進(jìn)行加載:

modprobe tun

當(dāng)我們確認(rèn)Linux加載了tun模塊以后,我們還需要確認(rèn)Linux是否有操作tun/tap的命令行工具tunctl。在Linux中輸入以下命令:

tunctl help

輸入這個(gè)命令后,如果Linux有輸出,則說明OK,否則我們執(zhí)行如下命令行以安裝tunctl:

yum install tunctl

具備了tun和tunctl以后,我們就可以創(chuàng)建一個(gè)tap設(shè)備了,命令行也很簡(jiǎn)單,如下:

tunctl -t tap_test
Set 'tap_test' persistent and owned by uid 0

我們可以通過如下命令來查看剛剛創(chuàng)建的tap(名字是tap_test):

ip link list
...
13: tap_test: <BROADCAST, MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
    group default qlen 1000
link/ether 2e:72:30:19:4e:bb brd ff:ff:ff:ff:ff:ff

我們也可以通過如下命令來查看:

ifconfig -a
...
tap_test: flags=4098<BROADCAST, MULTICAST>   mtu 1500
ether 2e:72:30:19:4e:bb   txqueuelen 1000   (Ethernet)
...

通過上面的命令行輸出,我們看到,這個(gè)tap_test還沒有綁定IP地址。執(zhí)行如下命令,給其綁定IP地址:

# 使用ip addr命令綁定IP地址命令
ip addr add local 192.168.100.1/24 dev tap_test
# 或者使用ifconfig命令綁定IP地址命令
ifconfig tap_test 192.168.100.1/24

使用ifconfig -a命令再查看一下:

ifconfig -a
......
tap_test: flags=4099<UP, BROADCAST, MULTICAST>   mtu 1500
        inet 192.168.100.1   netmask 255.255.255.0   broadcast 0.0.0.0
        ......

配置完IP以后,一個(gè)tap設(shè)備就創(chuàng)建完畢了。我們會(huì)在后面的章節(jié)中通過測(cè)試用例,繼續(xù)講述tap的用法。

主站蜘蛛池模板: 同德县| 赣榆县| 永仁县| 平南县| 长乐市| 桃园市| 宁陵县| 滦平县| 高青县| 巧家县| 来安县| 姚安县| 堆龙德庆县| 鹤峰县| 遵义县| 平阳县| 金门县| 金湖县| 涟水县| 霍林郭勒市| 额济纳旗| 都昌县| 德格县| 剑阁县| 永平县| 宾阳县| 鄂州市| 淮北市| 永清县| 子长县| 新竹市| 峨眉山市| 宣汉县| 颍上县| 视频| 铜鼓县| 怀宁县| 皮山县| 桂林市| 高邑县| 扎囊县|