ifconfig 與IP 建立tunnel 或GRE通道筆記 ,針對rhel5.3

5. GRE 及其它通道技術 (GRE and other tunnels)

在 Linux 裏面的 tunnel 共分三類﹐即 IP in IP tunneling﹑ GRE tunneling﹑以及核心以?nbsp;的 tunnels (例如﹕PPTP)。

5.1 關於 tunnels 的幾項注意 (A few general remarks about tunnels):

Tunnels 可以用來做一些非比尋常的酷玩意。不過﹐如果設定不慎﹐也會將事情弄得一塌糊塗。如果您並非 胸有成竹﹐那就千萬不要將您的預設網關指向 tunnel 設備。還有﹐tunneling 也會增加額?nbsp;的 overhead﹐因爲它需要額?nbsp;的 IP 標頭(header)。一般而言﹐每一個封包大概 20 byte 左右﹐這樣﹐一個正常的網絡封包體積 (MTU) 會是 1500 bytes﹐但如封包果經 tunnel 傳送﹐卻只有 1480 byte 而已。這其實也不算是什麼問題﹐但是當您有機會用 tunnels 來連接大型網絡的時候﹐請務必檢查 IP 封包的碎片和重組(fragmentation/reassembly)細節。當然囉﹐建立 tunnel 的話﹐最好是從 tunnel 的兩端同時着手﹐雙管齊下。

5.2 IP in IP tunneling

此類 tunneling 技術其實在 Linux 裏已行之有?nbsp;了。它需要兩個核心模塊﹕ipip.o 和 new_tunnel.o。

modprobe ipip

比方說﹐您有 3 個網絡﹕A 和 B 皆爲內部網絡﹐而透過網絡 C (或曰 Internet) 將兩者連接起來。這樣﹐我們的網絡 A 會是如此﹕

network 10.0.1.0

netmask 255.255.255.0

router 10.0.1.1

接網絡 C 的網關地址爲 172.16.17.18。

而網絡 B 則這般﹕

network 10.0.2.0

netmask 255.255.255.0

router 10.0.2.1

接網絡 C 的網關地址爲 172.19.20.21 。

對網絡 C 而言﹐我們假設它能夠雙向的將網絡 A 和 B 之間的封包送遞對方。您甚至可以用 Internet 啦。

好了﹐然後您要做的事情是﹕

首先﹐確定所有模塊都裝好了﹕

insmod ipip.o

insmod new_tunnel.o

modprobe ipip

然後﹐在網絡 A 的 router 上﹐這樣做﹕

ifconfig tunl0 10.0.1.1 pointopoint 172.19.20.21

route add -net 10.0.2.0 netmask 255.255.255.0 dev tunl0

然後在網絡 B 的 router 上﹕

ifconfig tunl0 10.0.2.1 pointopoint 172.16.17.18

route add -net 10.0.1.0 netmask 255.255.255.0 dev tunl0

完成後﹐將 tunnel 暫時關閉﹕

ifconfig tunl0 down

彈指間﹐就這樣搞定了。然而﹐您不能透過 IP-in-iP tunnel 傳送廣播或 IPv6 信息。您剛纔將兩個本來不能相互溝通的 IPv4 網絡連接起來了﹐然僅此而已。基於兼容考慮﹐此程序代碼由來已久﹐因而逆溯至 1.3 版核心皆兼籌幷顧。據我所知﹐ Linux 之 IP-in-IP tunneling 並不能在其它的作?nbsp;系統或 router 上工作。然而它短小精悍﹐實屬首選﹐除非您考慮用 GRE。

5.3 GRE tunneling

GRE 是一個原本由 Cisco 開發的 tunneling 協議﹐較於 IP-in-IP tunneling﹐它略爲能耐一些。例如﹐您能夠透過 GRE tunnel 傳送 multicast 和 IPv6 信息。

在 Linux 裏﹐您得藉助 ip_gre.o 模塊。

modprobe ip_gre

IPv4 Tunneling

不如先讓我們將 IPv4 tunneling 做起來吧﹕

比方說﹐您有 3 個網絡﹕A 和 B 皆爲內部網絡﹐而透過網絡 C (或曰 Internet) 將兩者連接起來。

關於網絡 A ﹐如下﹕

network 10.0.1.0

netmask 255.255.255.0

router 10.0.1.1

在網絡 C 上的 router 地址爲 172.16.17.18。然後讓我們稱這個網絡爲 neta (好了﹐萬事起頭難)。

然後﹐關於網絡 B﹕

network 10.0.2.0

netmask 255.255.255.0

router 10.0.2.1

在網絡 C 上的 router 地址爲 172.19.20.21。然後讓我們稱這網絡爲 netb 好了(革命尚未成功﹐同志仍需努力)。

對網絡 C 而言﹐我們假設它能夠雙向的將網絡 A 和 B 之間的封包送遞對方。至於何以然及何所以然﹐則非我們所要操心的。

接下來﹐在網絡 A 的 router 上﹐您如此做﹕

ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255

ip link set netb up

ip addr add 10.0.1.1 dev netb

ip route add 10.0.2.0/24 dev netb

這裏﹐我們不妨研究一下。在第一行裏面﹐我們新增了一個 tunnel 設備﹐稱之爲 netb (顯而易見﹐因爲這正是吾之所欲也)。再來﹐我們讓它使用 GRE 協議(mode gre)﹐其遠程地址爲 172.19.20.21 (於另一端的 router)﹐這樣我們的 tunneling 封包將從 172.16.17.18 從出(您的 router 在網絡 C 上可以具有好幾個 IP 地址﹐並由您決定用哪一個來做 tunneling)﹐而且﹐封包的 TTL 字段被設定爲 255 (ttl 255)。

第 2 行我們將這個設備啓動起來。

在第 3 行﹐我們爲新增的界面 netb 設定一個地址爲 10.0.1.1。用這個在小網絡上也未嘗不可﹐只是當您踏上採金旅程之際﹐您或需用其它 IP 範圍來給 tunneling 界面就是了(例如在此範例中﹐您可以使用 10.0.3.0)。

在第 4 行﹐我們爲網絡 B 設定好 router。請留意﹐此處使用的 netmask 表示法並不一樣。如果您不太瞭解其意所在﹐可以這樣來理解﹕將 netmask 換算爲二進制(binary)﹐然後數一數有多少個 1 就是了。如果您連這個也不會﹐萬一又想知道﹐那就這樣強記即可﹕255.0.0.0 是 /8﹑255.255.0.0 是 /16﹑還有 255.255.255.0 是 /24﹑而 255.255.253.0 則是 /23。

夠了真是的﹐還是讓我們看看網絡 B 的 router 吧。

ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255

ip link set neta up

ip addr add 10.0.2.1 dev neta

ip route add 10.0.1.0/24 dev neta

假如您要拿掉 router A 上的 tunnel﹐則﹕

ip link set netb down

ip tunnel del netb

當然﹐您也可以替 router B 將 netb 換成 neta。

GRE tunnels 目前所選用的 tunneling 類型。它已成標準並且也被廣泛的移植到 Linux 社羣之?nbsp;﹐誠是美事一樁。

5.4 Userland tunnels

在覈心之?nbsp;﹐還有成打形形×××的 tunneling 實作﹐絕非誇張之談。其中表表者非 PPP 和 PPTP 莫屬﹐然而其它的也爲數衆多 (有的爲專屬的﹐有的是保密的﹐有的甚至不是使用 IP)﹐不過﹐這些實在超過本 HOWTO 的範疇了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章