顯示具有 brctl 標籤的文章。 顯示所有文章
顯示具有 brctl 標籤的文章。 顯示所有文章

2016年6月2日 星期四

如何安裝 docker

Docker 官方網頁有介紹如何在 jessie 中安裝 docker,其網址如下:

https://docs.docker.com/engine/installation/linux/debian/#debian-jessie-80-64-bit

請編輯 /etc/apt/sources.list 檔案,新增底下這行:

# Docker
deb https://apt.dockerproject.org/repo debian-jessie main

然後以 root 權限執行

# apt-get update
# apt-get install docker-engine

安裝完畢後,理論上你的 docker 服務已經開始運轉,我們可以執行

# systemctl status docker

來觀察目前狀態。在此同時,我們如果執行

# ifconfig

的話,也會看到有一個新的網路介面叫 docker0 的,其狀態如底下所示:

docker0   Link encap:Ethernet  HWaddr 02:42:48:93:4b:a0
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


docker 之預設橋接網路介面為 docker0,其預設網段為 172.17.0.0/24,如果我們希望將網段改為 192.168.20.0/24,則在啟動 docker 前,我們要先設定 docker 的網段,請編輯 /etc/default/docker
這個檔案,將 DOCKER_OPTS 改成底下設定(其中一行):

南臺校外
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --bip=192.168.20.0/24"

南臺校內
DOCKER_OPTS="--dns 120.117.2.1 --dns 120.117.2.2 --bip=192.168.20.0/24"

其中 --dns 是指 docker0 所提供 DNS 位址,而 --bip 則是所設定的網段。改完之後,要重新啟動 docker0,在那之前,要先將 docker 服務停止,指令如下:

# systemctl stop docker

關完之後可以執行

# systemctl status docker

來看目前 docker 狀態。

接著來修理 docker0,docker0 不是網路介面,而是橋接網路,因此使用底下指令可以看
到 docker0 的狀態。

# brctl show
bridge name     bridge id               STP enabled     interfaces
br10            8000.000000000000       no
docker0         8000.024248934ba0       no

現在執行底下指令可以看到 docker0 的 IP 還沒改過來。

# ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:48:93:4b:a0
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

我們將 docker0 這個橋拿掉:

# brctl delbr docker0
bridge docker0 is still up; can't delete it

這表示 docker0 這個橋接網路介面還沒關掉,我們要執行底下指令才能關掉:

# ifconfig docker0 down
# ifdown docker0
# brctl delbr docker0

如此一來 docker0 就完全不見了,可以執行 ifconfig 來驗證看看。


編輯 /etc/sudoers 檔,為自己的帳號新增 sudo 的權限 (無需打密碼)

account  ALL=(ALL:ALL) NOPASSWD:ALL

上面的 account 是指你自己的帳號。


我們也可以新增一個 br20 的橋接網路介面,然後在 /etc/default/docker 中作底下修改:

DOCKER_OPTS="--dns 120.117.2.1 --dns 120.117.2.2 -b=br20"

如此一來會讓 docker 使用 br20 這個橋接網路介面,然後再重新啟動 docker 服務:

# systemctl restart docker

接著可以觀察網路上是否有現成的影像檔可以下載:

sudo docker search debian:jessie

此時會看到有很多現成的 docker 影像檔可以下載,在下載前我們先看一下目前有的
docker 影像檔:

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

從此可以看到目前沒有下載任何 docker 影像檔,請執行底下指令下載 docker 影像檔:

$ sudo docker pull debian:jessie
jessie: Pulling from library/debian
51f5c6a04d83: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:2ca1d757fce75accad6ff84339c3327c7aa96ad6e7b7d6fdde22b2a537fac703
Status: Downloaded newer image for debian:jessie

下載完畢後再執行底下指令觀看目前是否已下載 docker image ?

herman@120:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              jessie              1742affe03b5        10 days ago         125.1 MB

執行 docker jessie

$ sudo docker run -t -i debian:jessie /bin/bash
root@58abce6c9be8:/#

恭喜你,你已經啟動第一個 docker 容器了。但是這個容器相當陽春,連 ifconfig 指令
也沒有:
root@58abce6c9be8:/# ifconfig
bash: ifconfig: command not found

我們可以至 debian packages 網站查查看 ifconfig 屬於那個套件,再補裝上去,經過
查詢,ifconfig 屬於 net-tools 套件,在安裝此套件前要執行

# apt-get update
# apt-get install net-tools

安裝完畢後執行:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:c0:a8:14:02
          inet addr:192.168.20.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:c0ff:fea8:1402/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3058 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2603 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:26185005 (24.9 MiB)  TX bytes:180507 (176.2 KiB)

可以看到 eth0 的 IP 為 192.168.20.2,此時我們可以從實體機來 ping 192.168.20.2
看看是否能 ping 到這台主機:

$ ping 192.168.20.2
PING 192.168.20.2 (192.168.20.2) 56(84) bytes of data.
64 bytes from 192.168.20.2: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 192.168.20.2: icmp_seq=2 ttl=64 time=0.026 ms
64 bytes from 192.168.20.2: icmp_seq=3 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=4 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=5 ttl=64 time=0.025 ms
64 bytes from 192.168.20.2: icmp_seq=6 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=7 ttl=64 time=0.023 ms
^C
--- 192.168.20.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 5999ms
rtt min/avg/max/mdev = 0.022/0.024/0.032/0.006 ms

也可以從 docker 虛擬機 ping 192.168.20.1 來看看是否能 ping 到 docker0:

root@58abce6c9be8:/# ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1): 56 data bytes
64 bytes from 192.168.20.1: icmp_seq=0 ttl=64 time=0.044 ms
64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.20.1: icmp_seq=2 ttl=64 time=0.031 ms
^C--- 192.168.20.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.031/0.035/0.044/0.000 ms

到此為止,我們已經成功啟動一台 docker 的虛擬機,並且知道其網路設定了。接下來要
進行 apache 伺服器安裝,在那之前要先設定好鏡像站來源,否則下載軟體的速度會很慢

# apt-get install vim

接著編輯 /etc/apt/sources.list 檔案:

deb http://security.debian.org jessie/updates main

#deb http://httpredir.debian.org/debian jessie main
#deb http://httpredir.debian.org/debian jessie-updates main

deb ftp://192.168.20.1/debian jessie main contrib non-free
deb ftp://192.168.20.1/debian jessie-updates main

然後執行

# apt-get update

看看是否可以從實體主機的 debian 鏡站中下載套件,接下來安裝 apache 套件:

# apt-get install apache2

下載安裝完成後,可以自實體機以瀏覽器打開 http://192.168.20.2 來看是否有網頁,
如果沒有的話請執行:

# /etc/init.d/apache2 start
[....] Starting web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.20.2. Set the 'ServerName' directive globally to suppress this message
. ok

# /etc/init.d/apache2 status
[ ok ] apache2 is running.

來啟動並觀看 apache2 這個服務是否有執行,確定 apache2 有執行後可以再使用實體機
的瀏覽器打開 192.168.20.2 以驗證網頁服務是否有啟動。

=======================================
在實體機上如果要觀察目前有那些 docker 的容器正在執行的話,可以執行:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
58abce6c9be8        debian:jessie       "/bin/bash"         53 minutes ago      Up 53 minutes                           dreamy_heisenberg

=======================================
離開 docker 容器,請在 docker 中輸入 exit:

root@58abce6c9be8:/# exit
exit
~$

此時再在實體機中執行:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

會發現剛剛運行中之系統已經不見,這表示 docker 容器已經停止。

2014年12月1日 星期一

建立一個 br10 橋接網路介面

#2019/09/23 修訂




192.168.10.0/24 -> IP 範圍為 192.168.10.0 ~ 192.168.10.255
                   Netmask為 255.255.255.0 (24 bit)
                   Gateway ?
                   DNS ?

Bridge 命名方式:最好可以一眼看出此橋之網路設定,例如:

br0 -> 192.168.0.0/24
br1 -> 192.168.1.0/24
br2 -> 192.168.2.0/24
..
br10 -> 192.168.10.0/24

我們可以執行底下指令新增 br10

# brctl addbr br10
# ifconfig br10
br10      Link encap:Ethernet  HWaddr 52:55:ae:8e:ad:d0 
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

現在可以看到 br10 沒有 IP,接下來可以指定 192.168.10.1/24 作為 br10 的 IP,指令如下:
# ifconfig br10 192.168.10.1/24 up

或是
# ifconfig br10 192.168.10.1 netmask 255.255.255.0


接著可以觀察  br10 的 IP,如下所示:
# ifconfig br10
br10      Link encap:Ethernet  HWaddr 52:55:ae:8e:ad:d0 
          inet addr:192.168.10.1  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::5055:aeff:fe8e:add0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:508 (508.0 B)

此時我們可以 ping 192.168.10.1 看看其輸出:

$ ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.045 ms
^C
--- 192.168.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2051ms
rtt min/avg/max/mdev = 0.023/0.030/0.045/0.012 ms

這表示 192.168.10.1 這個介面已經被我們「無中生有」製造出來,這就是虛擬的橋接網路介面。

如果要刪除此網路介面的話,可以用 root 權限執行:

# brctl delbr br10
bridge br10 is still up; can't delete it

此時會有錯誤訊息,告訴我們 br10 還在使用中,不能刪除。因此要用 root 權限關閉此網路介面,指令如下:

# ifconfig br10 down

接著再執行 

# brctl delbr br10 

即可刪除此網路介面,我們可以使用 brctl show 來觀察 br10 是否仍然存在。



使用 brctl 建立 br10 有個缺點,那就是 br10 在系統重開後就會不見,因此我們要建立一個永久的 br10 介面。在本課程,我們建立一個 192.168.10.0/24 之橋接網路介面,其
/etc/network/interfaces 之設定如下:

auto br10
iface br10 inet static
address 192.168.10.1            # 橋接網路介面之 IP
netmask 255.255.255.0           # NetMask
gateway 120.117.72.71           # eth0 IP,亦即橋接網路介面之 gateway。
bridge_ports tap0               # 初始 tap,之後 br10 會自動新增其它 tap。
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

設定完之後,重新啟動網路介面,或是執行底指令:

# ifconfig br10 up
# ifup br10

即可啟動 br10,我們可以執行

# ifconfig br10

來觀看其輸出,如底下所示:

br10      Link encap:Ethernet  HWaddr 8e:03:1e:8e:fe:99
          inet addr:192.168.10.1  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::8c03:1eff:fe8e:fe99/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:648 (648.0 B)

接下來要將 /usr/local/libexec/qemu-bridge-helper 這個檔案 setuid,指令如下:

# cd /usr/local/libexec
# chmod u+s qemu-bridge-helper
# ls -l qemu-bridge-helper
-rwsr-xr-x 1 root staff 39680 10月 21 10:46 qemu-bridge-helper
   ^
   此檔現在具有 u+s 屬性。

然後要修改 /usr/local/etc/qemu/bridge.conf 這個檔案,若此檔不存在的話,請自行新增,加入一行:

allow br10


接著請建立 ~/qemu_stretch 目錄,再在其中新增 buildpxe.sh 這個檔案,其內容如下:
# IP=192.168.10.254 pxeserver.my.com

CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
#HDA=pxe2.img
HDA_SIZE=4G
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-stretch-DI-rc2-amd64-netinst.iso


[ -f $HDA ] && mv $HDA ${HDA}.`date +%Y%m%d`
qemu-img create $HDA $HDA_SIZE -f qcow2

qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=qcow2 -vga qxl \
-cdrom $CDROM -boot d \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE

請注意 debian 的安裝 iso 檔要放在 /opt/iso 目錄下,不然上面這個 script 檔要修改才可以執行。




接著我們要把 runpxe.sh 改成底下格式:

# IP=192.168.10.254 pxeserver.example.org

CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
HDB=hdb.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10


qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=raw \
-boot c \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE





接著,我們要將 ARM 虛擬機接上 br10 這個橋接網路介面,請在 runarm.sh 中修改為:

qemu-system-arm -M versatilepb -m 512 \
        -kernel ./vmlinuz-3.2.0-4-versatile \
        -initrd ./initrd.img-3.2.0-4-versatile \
        -net nic,macaddr="52:54:00:12:34:56" -net bridge,br=br10 \
        -hda arm.img \
        -append "root=/dev/sda1"

全部設定完畢後,我們即可執行 sh runarm.sh 來看看新的 ARM 虛擬環境是否有在
192.168.10.0/24 之網段內。在此可以先執行

# brctl show br10
bridge name     bridge id               STP enabled     interfaces
br10            8000.fe624e24d08c       no              tap0

上述輸出告訴我們 br10 目前有一台虛擬機器掛上。接著修改虛擬 ARM 機器之 IP 設定,>在 /etc/network/interfaces 中,如底下所示:


# The primary network interface
allow-hotplug eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.10.20
netmask 255.255.255.0
gateway 120.117.72.71  # gateway IP

然後重啟虛擬機之網路,一直到執行 ifconfig 可以看到本機之 IP 為 192.168.10.20。

接下作簡單驗證:

在實體機上執行:

ping 192.168.10.20

在虛擬機上執行:

ping 192.168.10.1

如果都可以 ping 得到機器的話,再在實體機上執行 iceweasel 看是否能打開 192.168.10.20 之網頁,如果可以的話表示設定沒問題。反之,請 debug !

2014年3月13日 星期四

如何在 Linux 底下建立橋接介面給虛擬機器使用

#2019/09/23 修訂

0. 原始網路介面:enp2s0

1. 安裝需要軟體 aptitude install bridge-utils uml-utilities

   安裝完畢後我們即可使用 brctl 這個指令來觀察/新增/移除橋接網路介面。


2. 請以 root 權限執行

   brctl

   其輸出如下所示:

Usage: brctl [commands]
commands:
        addbr           <bridge>                add bridge
        delbr           <bridge>                delete bridge
        addif           <bridge> <device>       add interface to bridge
        delif           <bridge> <device>       delete interface from bridge
        hairpin         <bridge> <port> {on|off}        turn hairpin on/off
        setageing       <bridge> <time>         set ageing time
        setbridgeprio   <bridge> <prio>         set bridge priority
        setfd           <bridge> <time>         set bridge forward delay
        sethello        <bridge> <time>         set hello time
        setmaxage       <bridge> <time>         set max message age
        setpathcost     <bridge> <port> <cost>  set path cost
        setportprio     <bridge> <port> <prio>  set port priority
        show            [ <bridge> ]            show a list of bridges
        showmacs        <bridge>                show a list of mac addrs
        showstp         <bridge>                show bridge stp info
        stp             <bridge> {on|off}       turn stp on/off

a. 觀看橋接介面資訊:

我們可以執行

   brctl show

   來觀看目前橋接介面狀態,因為目前為止沒有任何橋接介面存在,因此其輸出如下:

bridge name     bridge id               STP enabled     interfaces


b. 建立空的網路橋接介面

brctl addbr br0

建立完畢後再執行 brctl show,其輸出如下:

bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no

請注意最右邊的 interfaces 欄位底下是空的。

或是執行 ip addr show 可以顯示其結果,其輸出如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:24:1d:12:5c:c7 brd ff:ff:ff:ff:ff:ff
    inet 120.117.72.71/25 brd 120.117.72.127 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::224:1dff:fe12:5cc7/64 scope link
       valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
    link/ether 8a:f7:14:d0:e3:54 brd ff:ff:ff:ff:ff:ff

上述兩種輸出我們都可以看到有新增一個介面叫 br0,這就是所謂的橋接網路介面。



3. 將 br0 橋接給 eth0 使用

brctl addif br0 eth0

eth0 -> br0 -> internet

此時我們再執行

brctl show

會出現

bridge name     bridge id               STP enabled     interfaces
br0             8000.00241d125cc7       no              eth0

這告訴我們目前 eth0 已加入 br0 橋接網路介面中。


接下來我們可以執行一些網路指令來觀看目前網路設定狀況:

3.1 ifconfig

其輸出如下:

br0       Link encap:Ethernet  HWaddr 00:24:1d:12:5c:c7
          inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31862 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:8351683 (7.9 MiB)  TX bytes:762 (762.0 B)

eth0      Link encap:Ethernet  HWaddr 00:24:1d:12:5c:c7
          inet addr:120.117.72.71  Bcast:120.117.72.127  Mask:255.255.255.128
          inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:92871708 errors:0 dropped:27 overruns:0 frame:0
          TX packets:116756678 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:59143957987 (55.0 GiB)  TX bytes:143394438170 (133.5 GiB)


lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:854820 errors:0 dropped:0 overruns:0 frame:0
          TX packets:854820 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:72657228 (69.2 MiB)  TX bytes:72657228 (69.2 MiB)

3.2 route (觀看目前主機路由) -> 什麼叫主機路由 ?

其輸出如下:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         120.117.72.126  0.0.0.0         UG    0      0        0 eth0
120.117.72.0    *               255.255.255.128 U     0      0        0 eth0

但是現在網路會出現連線的問題,因此我們要再修改一下。

4. 修改網路設定,使其開機後能自動 bridge

編輯 /etc/network/interfaces,將 eth0 由 底下片段:

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
        address 120.117.72.71
        netmask 255.255.255.128
        gateway 120.117.72.126
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 120.117.2.1
        dns-search eecs.stust.edu.tw

改為:

# The primary network interface
#allow-hotplug eth0
#iface eth0 inet static
#        address 120.117.72.71
#        netmask 255.255.255.128
#        gateway 120.117.72.126
#        # dns-* options are implemented by the resolvconf package, if installed
#        dns-nameservers 120.117.2.1
#        dns-search eecs.stust.edu.tw


iface eth0 inet manual

auto br0
iface br0 inet static
address 120.117.72.71
netmask 255.255.255.128
gateway 120.117.72.126
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

重新編輯 /etc/network/interfaces 檔案後,我們可以執行

/etc/init.d/networking restart

來重新啟動網路介面,其輸出如下:

[....] Running /etc/init.d/networking restart is deprecated because it may not r[warnble some interfaces ... (warning).
[....] Reconfiguring network interfaces...
Waiting for br0 to get ready (MAXWAIT is 20 seconds).
Starting rpcbind daemon...Already running..
Starting NFS common utilities: statd idmapd.
done.

接著我們執行 ifconfig 來觀看網路狀況,其輸出如下:

br0       Link encap:Ethernet  HWaddr 00:24:1d:12:5c:c7
          inet addr:120.117.72.71  Bcast:120.117.72.127  Mask:255.255.255.128
          inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:33183 errors:0 dropped:0 overruns:0 frame:0
          TX packets:427 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:8487100 (8.0 MiB)  TX bytes:33164 (32.3 KiB)

eth0      Link encap:Ethernet  HWaddr 00:24:1d:12:5c:c7
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:92875730 errors:0 dropped:27 overruns:0 frame:0
          TX packets:116759427 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:59145121172 (55.0 GiB)  TX bytes:143394914474 (133.5 GiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:857668 errors:0 dropped:0 overruns:0 frame:0
          TX packets:857668 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:72951279 (69.5 MiB)  TX bytes:72951279 (69.5 MiB)

我們可以發現此時 br0 有網路 ip 等設定,而 eth0 沒有了。接下來我們可以重啟電腦,
來觀看是否重開機後網路設定仍然存在。

另外我們可以觀察 route 來看看主機路由為何,其輸出如下:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         120-117-72-126. 0.0.0.0         UG    0      0        0 br0
120.117.72.0    *               255.255.255.128 U     0      0        0 br0


從上面資訊可以看到目前的對外路由為 br0 介面。


5. 新增 br1 網路介面

請在 /etc/network/interfaces 中新增底下片段:

auto br1
iface br1 inet static
address 192.168.1.1
netmask 255.255.255.0
gateway 120.117.72.71
bridge_ports tap0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

請注意上述設定中之 gateway 要為本機 ip,而 bridge ports 要設為 tap0,設定完畢後
請執行:

/etc/init.d/networking restart

其輸出如下:

[....] Running /etc/init.d/networking restart is deprecated because it may not r[warnble some interfaces ... (warning).
[....] Reconfiguring network interfaces...
Waiting for br0 to get ready (MAXWAIT is 20 seconds).
if-up.d/mountnfs[br0]: waiting for interface br1 before doing NFS mounts ... (warning).
interface tap0 does not exist!

Waiting for br1 to get ready (MAXWAIT is 20 seconds).
RTNETLINK answers: Network is unreachable
Failed to bring up br1.
done.

此時我們再執行一次 ifconfig 來觀看網路介面,其輸出如下:


br0       Link encap:Ethernet  HWaddr 00:24:1d:12:5c:c7
          inet addr:120.117.72.71  Bcast:120.117.72.127  Mask:255.255.255.128
          inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1144 (1.1 KiB)  TX bytes:364 (364.0 B)

br1       Link encap:Ethernet  HWaddr 36:88:01:09:0f:26
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::3488:1ff:fe09:f26/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:238 (238.0 B)

eth0      Link encap:Ethernet  HWaddr 00:24:1d:12:5c:c7
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:123634 errors:0 dropped:0 overruns:0 frame:0
          TX packets:108003 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:102252702 (97.5 MiB)  TX bytes:96428415 (91.9 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:6489 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6489 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:364364 (355.8 KiB)  TX bytes:364364 (355.8 KiB)


我們可以看到多了一個 br1 網路介面,其網段是 192.168.1.1/24