配置IP隧道的内核修改,添加ip, iptables命令

来源:互联网 发布:菜鸟网络物流加盟 编辑:程序博客网 时间:2024/06/01 08:16

本文介绍Broadcom和海思两款机顶盒配置IP隧道的方法。首先是BCM7405。

1、内核配置修改:

支持IP隧道需要增加内核选项。
networking:
<*>   IP: tunneling
<*>   IP: GRE tunnels over IP
[*]     IP: broadcast GRE over IP  
<*>   IPv6: IPsec tunnel mode
<* >   IPv6: IPv6-in-IPv6 tunnel   
[*] Network packet filtering (replaces ipchains)  --->   
  [*]   Bridged IP/ARP packets filtering 
           Core Netfilter Configuration  ---> 
             <*> Netfilter Xtables support (required for ip_tables)  
             <*>   "tcpmss" match support  
           IP: Netfilter Configuration  ---> 
              <*> Connection tracking (required for masq/NAT)   
              <*> IP tables support (required for filtering/masq/NAT) 
               <*>   Packet filtering                                           
<*>     REJECT target support             
<*>   Full NAT          
<*>     MASQUERADE target support
<*>     REDIRECT target support           
          IPv6: Netfilter Configuration (EXPERIMENTAL)  ---> 
                 <*> IP6 tables support (required for filtering/masq/NAT)  
                 <*>   Packet filtering 
                 <*>     REJECT target support  
device drivers: network device support:

<*> Universal TUN/TAP device driver support 


因为bcm97405b0-smp_initrd_defconfig的Networking options部分缺大量选项。尝试用bcm97405b0-smp_defconfig的menuconfig来增加配置,对比更改的项目,将更改项加入bcm97405b0-smp_initrd_defconfig。


2、ip命令模块
类似地,在uclinux-rootfs下make menuconfig,产生的修改保存到uclinux-rootfs/config/.config。默认配置文件位于uclinux-rootfs/vendors/Broadcom/97405b0-smp/config.vendor-2.6.x 。
(1)配置config
修改config.vendor-2.6.x会产生ip编译错误。在这里把它绕开了,采用busybox中的ip工具。
uclinux-rootfs/user/busybox下make menuconfig,产生.config文件,拷贝至uclinux-rootfs/vendors/Broadcom/97405b0-smp/config.busybox即可。注意对应的平台!注意勾选Networking Utilities里的ip工具和Build Options里的Build BusyBox as a static binary (no shared libs)。不选这个的话,切换平台的之后,ip有时候编不进去。
或者直接修改文件,即uclinux-rootfs/vendors/Broadcom/97405b0-smp/config.busybox 中CONFIG_IP 及IP相关项。
CONFIG_IP=y
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                 }

  加开机自启动:

  cp rc.user uclinux-rootfs/romfs/root

  重新编译内核,
  cp img/vmlinuz-initrd-7405b0-smp /tftpboot/vmlinuz-initrd-7405b0-smp-boot
  flash -noheader 192.168.200.232:vmlinuz-initrd-7405b0-smp-boot flash0.kernel

  setenv -p STARTUP "boot -z -elf flash0.kernel:"


以下是Hi3716M的方法。Hi3716C缺省加入了ip, iptables,因此只需要在内核中添加TUN/TAP device driver的支持即可。

全勾,为M方式->运行iptables时自动加载
则boot时不会起以下modules,虽然ip_tables(kernel module)并没能加载。
IPv4 over IPv4 tunneling driver
GRE over IPv4 tunneling driver
ip_tables: (C) 2000-2006 Netfilter Core Team
arp_tables: (C) 2002 David S. Miller
TCP cubic registered
NET: Registered protocol family 10
ip6_tables: (C) 2000-2006 Netfilter Core Team
IPv6 over IPv4 tunneling driver
NET: Registered protocol family 17

make hi3716m_defconfig
make menuconfig
make uImage
make modules 
make modules_install INSTALL_MOD_PATH=~/Hi3716MV100R001C00SPC050/pub/rootbox/


static编入内核看起来不行。(iptables -L,lsmod)
make modules_install #拷贝.ko模块文件到/lib/modules/<新内核版本号>/下 并运行depmod生成modules.dep内核模块的依赖关系配置文件。insmod,modprobe需要用它去加载内核所需的驱动。
对于fs,network方面的module, kernel是可以自动动态装载的(通过kerneld, 要用时自动insmod),而对于与硬件相关的module(如网卡,SCSI卡等), 则需自己手工加入.

config iptables:
//  ./configure --enable-static --prefix=/usr/local  --host=arm-hisiv200-linux
./configure --enable-static --host=arm-hisiv200-linux
make
make install

rootbox:
cp libexec /usr/local

一个deprecated提示,不影响使用:
nf_conntrack version 0.5.0 (1446 buckets, 5784 max)
CONFIG_NF_CT_ACCT is deprecated and will be removed soon. Please use
nf_conntrack.acct=1 kernel parameter, acct=1 nf_conntrack module option or
sysctl net.netfilter.nf_conntrack_acct=1 to enable it.