1. 程式人生 > >配置IP隧道的核心修改,新增ip, iptables命令

配置IP隧道的核心修改,新增ip, iptables命令


CONFIG_FEATURE_IP_ADDRESS=y
CONFIG_FEATURE_IP_LINK=y
CONFIG_FEATURE_IP_ROUTE=y
CONFIG_FEATURE_IP_TUNNEL=y
CONFIG_FEATURE_IP_RULE=y
CONFIG_FEATURE_IP_SHORT_FORMS=y
CONFIG_FEATURE_IP_RARE_PROTOCOLS=y
CONFIG_IPADDR=y
CONFIG_IPLINK=y
CONFIG_IPROUTE=y
CONFIG_IPTUNNEL=y
CONFIG_IPRULE=y
CONFIG_IPCALC=y
(2)編譯
重新編譯核心。

3、iptables命令模組
(1)配置config
修改uclinux-rootfs/vendors/Broadcom/97405b0-smp/config.vendor-2.6.x 中 CONFIG_USER_IPTABLES_IPTABLES項。
(2)編譯
首先在模組目錄下單獨編譯模組,要能夠通過。核心自帶的iptables-1.2.4有錯誤,單獨編譯不通過,iptables裡一個.c的巨集缺少定義,一個結構成員的錯誤引用。因為linux版本和模組版本有對應要求,對於linux 2.6.18的話,iptables-1.2.4版本太低。
網上下載iptables-1.3.5,拷到uclinux-rootfs/user/iptables。單獨編譯不通過,報告核心程式碼裡一個巨集缺少定義。在核心stblinux-2.6.18/include/asm/byteorder.h L13加了一個巨集定義#define __MIPSEL__,單獨編譯通過(只是確認下軟體包沒問題。實際上在編譯核心的過程中,定義了這個巨集。確認後,需要把這個定義刪了,否則核心編譯錯誤)。
iptables單獨編譯的方法:
make clean
export KERNEL_DIR=你的核心路徑/stblinux-2.6.18/ 
export IPTABLES_DIR=./ 
make BINDIR=bin/ MANDIR=man LIBDIR=lib install  
單獨編譯通過後,make clean,再重新編譯核心。使用動態編譯的話(註釋掉NO_SHARED_LIBS = 1,拷貝iptables/lib/iptables下的.so檔案拷到盒子的/lib目錄),需直接修改編譯工具
#CROSS_COMPILE := mipsel-linux-
#AS := $(CROSS_COMPILE)as
#LD := $(CROSS_COMPILE)ld
#CC := $(CROSS_COMPILE)gcc
編譯核心時,出現錯誤No rule to make target `romfs'.  Stop.可能由於該iptables並非基於嵌入式linux,iptables沒編入romfs。在uclinux-rootfs/user/iptables/Makefile L124 加入以下程式碼:
romfs:
        $(ROMFSINST) /bin/iptables
        $(ROMFSINST) -l $(ROMFSDIR)/bin/iptables /bin/iptables-batch
重新編譯核心即可。
編譯romfs可用make romfs。
開啟Makefile第二行NO_SHARED_LIBS = 1,則iptables靜態編入核心,映像增大到5M。但是,執行iptables時,會出現錯誤getsockopt failed strangely: No such file or directory。這是核心的一個bug(http://bugs.gentoo.org/show_bug.cgi?id=136813), 需要修改核心程式碼:stblinux-2.6.18/net/ipv4/netfilter/ip_tables.c  L2081,增加以下幾行:

   2082                 if (ret == -ENOENT) {
   2083                         printk("Unable to load ipt_%s\n", rev.name);
   2084                         return -EPROTONOSUPPORT;
   2085                 }