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

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

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

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

Netfilter Hook 程式範例

Netfilter 是 Linux Kernel 裏面對於網路封包處理一個非常有趣的設計,它在 Linux Kernel 的封包處理路徑上安插了許多的 Hook Point,這樣使用者可以隨自己的高興在這些 Hook Point 上安插自己的封包處理行為(使用註冊 callback function的方式),常見的應用如防火牆檢查、NAT等。在這邊稍微提一下,很多人會說 Linux 是用 iptables 來做防火牆的,我不太喜歡這個說法(但我不會說它是錯的),因為 iptables 不過是設定 netfilter 的 user space 工具,當你使用 iptables 時,不過就是將那些功能模組配合上使用者輸入的參數,然後掛載到對應的 Hook Point。下面是來自官網的描述:

netfilter is a set of hooks inside the Linux kernel that allows kernel modules to register callback functions with the network stack. A registered callback function is then called back for every packet that traverses the respective hook within the network stack.

至於有哪些 Hook Point 可以參考下面這張來自 Wiki 的圖:

http://inai.de/images/nf-packet-flow.png
 這個概念是從 Linux Kernel 2.4 以後就內建在核心的機制。基本上我在研究所很常利用 iptables 這個設定工具來使用 netfilter,但一直沒有實際寫這 callback 的機會(之前工作上沒碰到,外加人懶)。但現在因為工作上有特殊的需求(來自一個莫名其妙的設計),所以就請(逼迫?)我同事撰寫了一個 Netfilter Callback 的模組範例出來(從程式裡可以找到作者),下面就是這個範例:




#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/skbuff.h>
#include <linux/netfilter.h>
#include <uapi/linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/types.h>

#define DRIVER_AUTHOR "JWGUO"
#define DRIVER_DESC "HELLO WORLD"

struct sk_buff *sock_buff;
static struct nf_hook_ops nfho;

/* Older kernel has different funcion definition. */
static unsigned int hook_func(
        const struct nf_hook_ops *ops,
        struct sk_buff *skb,
        const struct net_device *in,
        const struct net_device *out,
        int (*okfn)(struct sk_buff *))
{
    char *ifname = (char *)(in->name);
    struct ethhdr *mac_header = (struct ethhdr *)skb_mac_header(skb);
    struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb);
    sock_buff = skb;

    if (!sock_buff) {
        return NF_ACCEPT;
    }

    // Do something to the pkt.
    printk(KERN_INFO "======HELLO WAYNE@net_dev: %s=====\n", ifname);

    printk(KERN_INFO "src_mac: %pM", mac_header->h_source);
    printk(KERN_INFO "dst_mac: %pM", mac_header->h_dest);

    printk(KERN_INFO "src_ip: %pI4", &ip_header->saddr);
    printk(KERN_INFO "dst_ip: %pI4", &ip_header->daddr);

    printk(KERN_INFO "\n");
    return NF_ACCEPT;
}

static int __init init_main(void)
{
    nfho.hook = hook_func;
    nfho.hooknum = NF_INET_PRE_ROUTING; // For older kernel: NF_IP_PRE_ROUTING
    nfho.pf = PF_INET;
    nfho.priority = NF_IP_PRI_FIRST;
    nf_register_hook(&nfho);

    printk(KERN_INFO "Successfully inserted a hook into kernel\n");

    return 0;
}

static void __exit cleanup_main(void)
{
    nf_unregister_hook(&nfho);

    printk(KERN_INFO "Successfully unloaded the hook\n");
}

module_init(init_main);
module_exit(cleanup_main);

MODULE_LICENSE("GPLv3");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
這個 callback function 的功能非常簡單,就只是把經過封包的相關資訊給印出來,包含來源網卡、src mac、dst mac、src IP、dst IP,hooknum 填的地方就是 Hook Point。可能的選項可以參考 Linux/include/uapi/linux/netfilter_ipv4.h:


/* IP Hooks */
/* After promisc drops, checksum checks. */
#define NF_IP_PRE_ROUTING       0
/* If the packet is destined for this box. */
#define NF_IP_LOCAL_IN          1
/* If the packet is destined for another interface. */
#define NF_IP_FORWARD           2
/* Packets coming from a local process. */
#define NF_IP_LOCAL_OUT         3
/* Packets about to hit the wire. */
#define NF_IP_POST_ROUTING      4
#define NF_IP_NUMHOOKS          5
#endif /* ! __KERNEL__ */
附帶一提,這 module 是在 Linux Kernel 3.14.4  編譯並測試的。最後補上 makefile:


MOD := nfhook
obj-m += $(MOD).o
KVERSION := $(shell uname -r)

all:
 $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

clean:
 $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

install:
 /sbin/insmod $(MOD).ko

remove:
 /sbin/rmmod $(MOD).ko

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

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

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