本文介绍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
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.