靈修分享:亞略巴古的演講

亞略巴古的演說是使徒行傳一篇非常著名的講道。基督徒往往用這段經文來說明上帝的屬性,同時也會參考這段經文作為和外邦人互動的一個參考方式。最近因為團契查經查到這一段,重新思想後看到了以前沒有考慮過的面向,在這邊記錄一下。

徒17:16-34保羅在雅典等候他們的時候,看見滿城都是偶像,就心裏着急;於是在會堂裏與猶太人和虔敬的人,並每日在市上所遇見的人,辯論。還有伊壁鳩魯和斯多亞兩門的學士,與他爭論。有的說:「這胡言亂語的要說甚麼?」有的說:「他似乎是傳說外邦鬼神的。」這話是因保羅傳講耶穌與復活的道。他們就把他帶到亞略‧巴古,說:「你所講的這新道,我們也可以知道嗎?因為你有些奇怪的事傳到我們耳中,我們願意知道這些事是甚麼意思。」(雅典人和住在那裏的客人都不顧別的事,只將新聞說說聽聽。)
保羅站在亞略‧巴古當中,說:「眾位雅典人哪,我看你們凡事很敬畏鬼神。我遊行的時候,觀看你們所敬拜的,遇見一座壇,上面寫着『未識之神』。你們所不認識而敬拜的,我現在告訴你們。創造宇宙和其中萬物的神,既是天地的主,就不住人手所造的殿,也不用人手服事,好像缺少甚麼;自己倒將生命、氣息、萬物,賜給萬人。他從一本本:有古卷是血脈造出萬族的人,住在全地上,並且預先定準他們的年限和所住的疆界,要叫他們尋求神,或者可以揣摩而得,其實他離我們各人不遠;我們生活、動作、存留,都在乎他。就如你們作詩的,有人說:『我們也是他所生的。』我們既是神所生的,就不當以為神的神性像人用手藝、心思所雕刻的金、銀、石。世人蒙昧無知的時候,神並不監察,如今卻吩咐各處的人都要悔改。因為他已經定了日子,要藉着他所設立的人按公義審判天下,並且叫他從死裏復活,給萬人作可信的憑據。」
眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」於是保羅從他們當中出去了。 但有幾個人貼近他,信了主,其中有亞略‧巴古的官丟尼修,並一個婦人,名叫大馬哩,還有別人一同信從。

對基督徒來說,保羅這篇講道講的真好,不但講出了上帝的超越性(像是不住人手所造的殿、也不是金銀石的彫刻),也帶出了耶穌基督復活的大能。但最近我才注意到眾人的反應:「眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」」不曉得你看到這一段有什麼感想?可能我是玻璃心吧,如果我是保羅,我大概會非常非常的難過,看起來似乎沒有人理會這個福音、這篇講道。這篇被基督…

Linux Network Namespace

今天要介紹的東西是 Linux Network Namespace。為什麼會知道這東西呢?主要是因為在研究 SDN 模擬器 mininet(正確來說是 OpenFlow 模擬器)時,發現它是透過 Linux Network Namespace 這個技術,將每個 Host 以及 Switch 獨立開來(Isolation),並在當中建立起虛擬的連線,藉這個概念在一台電腦內打造出虛擬的網路拓樸。所以就想說花點時間來看看如何使用這個技術。

我們先來看看在 Wikipedia 上關於 cgroups 的介紹:

cgroups (abbreviated from control groups) is a Linux kernel feature to limit, account, and isolate resource usage (CPU, memory, disk I/O, etc.) of process groups.

Namespace isolation
While not technically part of the cgroups work, a related feature of the Linux kernel is namespace isolation, where groups of processes are separated such that they cannot "see" resources in other groups. For example, a PID namespace provides a separate enumeration of process identifiers within each namespace. Also available are mount, UTS, network and SysV IPC namespaces.

簡單來說,就是透過 group 這樣的觀念,讓每個 process group 間所使用的資源能夠獨立開來而不會互相影響。而這樣的 group 就被稱做是 namespace。而今天要看的是 Network Namespace。用例子來看或許會比較容易了解,下面的例子主要是參考這個網頁所建立出來的。

1. 建立 Network Namespace

$ sudo ip netns add blue
$ ip netns list
blue

上面的指令應該可以很輕易的解讀,就是產生一個叫作 blue 的 network namespace。要注意的是,雖然 ip netns list 只顯示出 blue 這個 namespace,但其實預設還有一筆 default network namespace 是不顯示的。基本上如果不指定的話,所有的網路介面、程式都是使用 default network namespace 的。

2. 建立虛擬的網路介面與虛擬連線並加入到 Network Namespace

$ sudo ip link add veth0 type veth peer name veth1
$ ip link list
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 00:08:a1:36:6f:ab brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:22:15:8b:3b:8c brd ff:ff:ff:ff:ff:ff
4: veth1:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether a6:f1:91:9b:2c:0e brd ff:ff:ff:ff:ff:ff
5: veth0:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether f2:e9:8a:05:da:56 brd ff:ff:ff:ff:ff:ff

可以看到上面的指令新增了兩張 interface,分別是 veth0 和  veth1,而且兩張往卡間還有一條虛擬的連線(virtual link)。接下來我們用下面的指令來將 veth1 加到 blue 這個 network namespace 裏面。

$ sudo ip link set veth1 netns blue
$ ip link list
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 00:08:a1:36:6f:ab brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:22:15:8b:3b:8c brd ff:ff:ff:ff:ff:ff
5: veth0:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether f2:e9:8a:05:da:56 brd ff:ff:ff:ff:ff:ff
$ ip netns exec blue ip link list
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth1:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether a6:f1:91:9b:2c:0e brd ff:ff:ff:ff:ff:ff

很明顯可以看到,在原先的 default network namespace 中少了 veth1 ,而在 blue 這個 network namespace 中則出現了 veth1 這個 interface。

3. 設定網路

接下來我們要替 veth1 設定 IP Address。

$ ifconfig veth1
veth1: error fetching interface information: Device not found
$ sudo ip netns exec blue ifconfig veth1 192.168.200.3/24 up

很明顯,直接用 ifconfig 是沒用的。這是因為 ifconfig 預設是在 default network namespace 上作用的,而在 default network namespace 中根本沒有 veth1 這個 interface。所以 ifconfig  這個指令必須要執行在 blue 這個 network namespace 上。我們可以再做一個實驗:


$ ping 192.168.200.3
PING 192.168.200.3 (192.168.200.3) 56(84) bytes of data.
^C
--- 192.168.200.3 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3022ms

完全 ping 不到,可是只要替 veth0 設定 IP 以後就沒問題了,畢竟 veth0 和 veth1 中間有一條虛擬的連線:


$ sudo ifconfig veth0 192.168.200.2/24
$ ping 192.168.200.3 -c 1
PING 192.168.200.3 (192.168.200.3) 56(84) bytes of data.
64 bytes from 192.168.200.3: icmp_seq=1 ttl=64 time=0.032 ms

--- 192.168.200.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.032/0.032/0.032/0.000 ms
$ sudo ip netns exec blue ping 192.168.200.2 -c 1
PING 192.168.200.2 (192.168.200.2) 56(84) bytes of data.
64 bytes from 192.168.200.2: icmp_seq=1 ttl=64 time=0.038 ms

--- 192.168.200.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms


上面的例子也說明了可以從 veth1 ping 回 veth0。上面的這些實驗說明了如何切割 Network Namespace 以及如何讓彼此間互通,那麼 mininet 的模擬方法看起來也就沒那麼神奇了。

問題

其實我在做實驗的時候遇到了個問題,請看下面的指令:

$ sudo ip netns exec blue ping 192.168.200.3 -c 1
PING 192.168.200.3 (192.168.200.3) 56(84) bytes of data.

--- 192.168.200.3 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

我還在想到底為什麼 ...

問題解決 2014/07/04

找到原因了,一個很蠢的原因 ... 那就是我沒把 blue 上面的 lo 給叫起來。只要透過下面的指令就沒問題了: 


$ sudo ip netns exec blue ifconfig lo up
$ sudo ip netns exec blue ping 192.168.200.3 -c 1
PING 192.168.200.2 (192.168.200.2) 56(84) bytes of data.
64 bytes from 192.168.200.2: icmp_seq=1 ttl=64 time=0.039 ms

--- 192.168.200.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.039/0.039/0.039/0.000 ms

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包