因為這門課是基礎課程,而且配合音頻的形式發布,所以我多以理論為主來進行講解,在專欄更新的程序中,不斷有同學讓我推薦一些網路方面的書籍,還有同學說能不能配合一些實驗來說明理論,
的確,網路是一門實驗性很強的學科,就像我在開篇詞里面說的一樣:一看覺得懂,一問就打鼓,一用就糊涂, 在寫專欄的程序中,我自己也深深體會到了,這個時候,我常常會拿一個現實的環境,上手操作一下,抓個包看看,這樣心里就會有定論,
《TCP/IP 詳解》實驗環境搭建
對于網路方面的書籍,我當然首推 Rechard Stevens 的《TCP/IP illustrated》(《TCP/IP 詳解》),這本書把理論講得深入淺出,還配有大量的上手實踐和抓包,看到這些抓包,原來不理解的很多理論,一下子就能懂了,
這本書里有個拓撲圖,書上的很多實驗都是基于這個圖的,但是這個拓撲圖還是挺復雜的,我這里先不說,一會兒詳細講,
Rechard Stevens,因為作業中有這么一個環境,很方便做實驗,最終才寫出了這樣一本書,而我們一般人學習網路,沒有這個環境應該怎么辦呢?
時代不同了,咱們現在有更加強大的工具了,例如,這里這么多的機器,我們可以用 Docker 來實作,多個網路可以用 Open vSwitch 來實作,你甚至不需要一臺物理機,只要一臺 1 核 2G 的虛擬機,就能將這個環境搭建起來,
搭建這個環境的時候,需要一些腳本,我把腳本都放在了Github里面,你可以自己取用,
1. 創建一個 Ubuntu 虛擬機
在你的筆記本電腦上,用 VirtualBox 創建就行,1 核 2G,隨便一臺電腦都能搭建起來,
首先,我們先下載一個 Ubuntu 的鏡像,我是從Ubuntu 官方網站下載的,

然后,在 VirtualBox 里面安裝 Ubuntu,安裝程序網上一大堆教程,你可以自己去看,我這里就不詳細說了,
這里我需要說明的是網路的配置,
對于這個虛擬機,我們創建兩個網卡,一個是 Host-only,只有你的筆記本電腦上能夠登錄進去,這個網卡上的 IP 地址也只有在你的筆記本電腦上管用,這個網卡的配置比較穩定,用于在 SSH 上做操作,這樣你的筆記本電腦就可以搬來搬去,在公司里安裝一半,回家接著安裝另一半都沒問題,

這里有一個虛擬的網橋,這個網路可以在管理 > 主機網路管理里面進行配置,

在這里可以虛擬網橋的的 IP 地址,同時啟用一個 DHCP 服務器,為新創建的虛擬機配置 IP 地址,
另一個網卡配置為 NAT 網路,用于訪問互聯網,配置了 NAT 網路之后,只要你的筆記本電腦能上網,虛擬機就能上網,由于咱們在 Ubuntu 里面要安裝一些東西,因而需要聯網,
你可能會問了,這個配置復雜嗎?一點兒都不復雜,咱們講虛擬機網路的時候,講過這個,

安裝完了 Ubuntu 之后,需要對 Ubuntu 里面的網卡進行配置,對于 Ubuntu 來講,網卡的配置在 /etc/network/interfaces 這個檔案里面,在我的環境里,NAT 的網卡名稱為 enp0s3,Host-only 的網卡的名稱為 enp0s8,都可以配置為自動配置,
auto lo iface lo inet loopback auto enp0s3 iface enp0s3 inet dhcp auto enp0s8 iface enp0s8 inet dhcp
這樣,重啟之后,IP 就配置好了,
2. 安裝 Docker 和 Open vSwitch
接下來,在 Ubuntu 里面,以 root 用戶,安裝 Docker 和 Open vSwitch,
你可以按照 Docker 的官方安裝檔案來做,我這里也貼一下我的安裝程序,
apt-get remove docker docker-engine docker.io apt-get -y update apt-get -y install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg > gpg apt-key add gpg apt-key fingerprint 0EBFCD88 add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt-get -y update apt-cache madison docker-ce apt-get -y install docker-ce=18.06.0~ce~3-0~ubuntu
之后,還需要安裝 Open vSwitch 和 Bridge,
apt-get -y install openvswitch-common openvswitch-dbg openvswitch-switch python-openvswitch openvswitch-ipsec openvswitch-pki openvswitch-vtep apt-get -y install bridge-utils apt-get -y install arping
3. 準備一個 Docker 的鏡像

每個節點都是一個 Docker,對應要有一個 Docker 鏡像,這個鏡像我已經打好了,你可以直接使用,
docker pull hub.c.163.com/liuchao110119163/ubuntu:tcpip
當然你也可以自己打這個鏡像,Dockerfile 就像這樣:
FROM hub.c.163.com/public/ubuntu:14.04 RUN apt-get -y update && apt-get install -y iproute2 iputils-arping net-tools tcpdump curl telnet iputils-tracepath traceroute RUN mv /usr/sbin/tcpdump /usr/bin/tcpdump ENTRYPOINT /usr/sbin/sshd -D
4. 啟動整個環境
啟動這個環境還是比較復雜的,我寫成了一個腳本,在 Git 倉庫里面,有一個檔案 setupenv.sh ,可以執行這個腳本,里面有兩個引數,一個引數是 NAT 網卡的名字,一個是鏡像的名稱,
git clone https://github.com/popsuper1982/tcpipillustrated.git cd tcpipillustrated docker pull hub.c.163.com/liuchao110119163/ubuntu:tcpip chmod +x setupenv.sh ./setupenv.sh enp0s3 hub.c.163.com/liuchao110119163/ubuntu:tcpip
這樣,整個環境就搭建起來了,所有的容器之間都可以 ping 通,而且都可以上網,
不過,我寫的這個腳本對一些人來說可能會有點兒復雜,我這里也解釋一下,
首先每一個節點,都啟動一個容器,使用–privileged=true 方式,網路先不配置–net none,有兩個二層網路,使用 ovs-vsctl 的 add-br 命令,創建兩個網橋,
pipework 是一個很好的命令列工具,可以將容器連接到兩個二層網路上,
但是我們上面那個圖里有兩個比較特殊的網路,一個是從 slip 到 bsdi 的 P2P 網路,需要創建一個 peer 的兩個網卡,然后兩個 Docker 的網路 namespace 里面各塞進去一個,
有關操作 Docker 的網路 namespace 的方式,咱們在容器網路那一節講過 ip netns 命令,
這里需要注意的是,P2P 網路和下面的二層網路不是同一個網路,P2P 網路的 CIDR 是 140.252.13.64/27,而下面的二層網路的 CIDR 是 140.252.13.32/27,如果按照 /24,看起來是一個網路,但是 /27 就不是了,至于CIDR 的計算方法,你可以回去復習一下,
另外需要配置從 sun 到 netb 的點對點網路,方法還是通過 peer 網卡和 ip netns 的方式,
這里有個特殊的地方,對于 netb 來講,不是一個普通的路由器,因為 netb 兩邊是同一個二層網路,所以需要配置 arp proxy,
為了所有的節點之間互通,要配置一下路由策略,這里需要通過 ip route 命令,
- 對于 slip 來講,bsdi 左面 13.66 這個網口是網關,
- 對于 bsdi 和 svr4 來講,如果去外網,sun 下面的網口 13.33 是網關,
- 對于 sun 來講,上面的網口 1.29 屬于上面的二層網路了,它如果去外網,gateway 下面的網口 1.4 就是外網網關,
- 對于 aix,solaris,gemini 來講,如果去外網,網關也是 gateway 下面的網口 1.4,如果去下面的二層網口,網關是 sun 上面的網口 1.29,
配置完了這些,圖中的所有的節點都能相互訪問了,最后還要解決如何訪問外網的問題,
我們還是需要創建一個 peer 網卡對,一個放在 gateway 里面,一個放在 gateway 外面,外面的網卡去外網的網關,
在虛擬機上面,還需要配置一個 iptables 的地址偽裝規則 MASQUERADE,其實就是一個 SNAT,因為容器里面要訪問外網,因為外網是不認的,所以源地址不能用容器的地址,需要 SNAT 成為虛擬機的地址出去,回來的時候再 NAT 回來,
配置這個環境還是挺復雜的,要用到咱們學到的很多知識,如果沒有學習前面那些知識,直接就做這個實驗,你肯定會很暈,但是只學理論也不行,要把理論都學過一遍,再做一遍實驗,這才是一個不斷迭代、更新知識庫的程序,
有了這個環境,《TCP/IP 詳解》里面的所有實驗都能做了,而且我打的這個 Docker 鏡像里面,tcpdump 等網路工具都安裝了,你可以“為所欲為”了,
Open vSwitch 的實驗
做了 TCP/IP 詳解的實驗之后,網路程式設計這部分,你就有了堅實的基礎,但是涉及到資料中心內部的一些網路技術,什么 VLAN、VXLAN、STP 等偏運維方向的,學習還是會比較困難,好在我們有 Open vSwitch,也可以做大量的實驗,
Open vSwitch 門檻比較高,里面的概念也非常多,可謂千頭萬緒,不過,通過我這么多年研究的經驗,可以告訴你,這里面有一個很好的線索,那就是 Open vSwitch 會將自己對于網路的配置保存在一個本地庫里面,這個庫的表結構之間的關系就像這樣:

這個庫其實是一個 JSON,如果把這個 JSON 列印出來,能夠看到更加詳細的特性,按照這些特性一一實驗,可以逐漸把 Open vSwitch 各個特性都掌握,

這里面最重要的概念就是網橋,一個網橋會有流表控制網路包的處理程序,會有控制器下發流表,一個網橋上會有多個埠,可以對埠進行流控,一個埠可以設定 VLAN,一個埠可以包含多個網卡,可以做系結,網卡可以設定成為 GRE 和 VXLAN,
我寫過一個 Open vSwitch 的實驗教程,也放在了 Github 里面,這里面有這么幾個比較重要的實驗,你可以看一看,
- 實驗一:查看 Open vSwitch 的架構,我們在講 Open vSwitch 的時候,提過 Open vSwitch 的架構,在這個實驗中,我們可以查看 Open vSwitch 的各個模塊以及啟動的引數,
- 實驗五:配置使用 OpenFlow Controller,體驗一把作為小區物業在監控室里面管控整個小區道路的樣子,
- 實驗八:測驗 Port 的 VLAN 功能,看一下 VLAN 隔離究竟是什么樣的,
- 實驗十:QoS 功能,體驗一把如果使用 HTB 進行網卡限流,
- 實驗十一:GRE 和 VXLAN 隧道功能,看虛擬網路如何進行租戶隔離,
- 實驗十五:對 Flow Table 的操作,體驗流表對網路包隨心所欲的處理,
好了,關于整個環境的搭建我就講到這里了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/211571.html
標籤:其他
下一篇:復習隨筆
