sunzl1987

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

环境 arm7开发板, uclinux系统,kernel version: linux-2.4.x

arm芯片的单网卡双网口设备,eth0 WAN口 ipaddr 192.168.9.61

         eth0:0  LAN口 ipaddr 192.168.1.51

   情景: 该设备有2个网络接口,wan口和lan口 。 wan口连接PC A,A的ip192.168.9.55,lan口连接另一台PC B,B的ip为192.168.1.42;

   要求:实现PC A 能够访问PC B的80端口。

       实现路由转发功能原理简单,过程比较复杂。首先要把PC B的网关设置成192.168.1.51

1.iptables nat 转发原理

  使用iptables脚本实现网络地址转换。使用iptables-1.3.5.

从网上下载iptables-1.3.5.tar.bz2版本,解压。

下载补丁包 patch-o-matic-20041009.tar.bz2,解压。

通过menuconfig,增加iptables功能。

 

2.1 iptables移植到arm设备上

    (1)cd  iptables-1.3.5

  (2)vi Makefile

      需要做如下改动

       NO_SHARE_LIBS =1

      CC=arm-elf-gcc

      AR=arm-elf-ar

      KERNEL_DIR =/home/seen/pdb/uClinux-dist/linux-2.4.x

      PREFIX:=/usr/local/arm_tools

      BINDIR:=/$(PREFIX)/bin

     

                     lib1=:${PREFIX}/lib/gcc-lib/arm-elf/3.0

            lib=${PREFIX}/arm-elf/lib

     

           #COPT_FLAGS:=-O2

      CFLAGS:=  $(COPT_FLAGS)  –g3 –W1 –Wunused –elf2flt=’-s 1024’  -I$(KERNEL_DIR)/include –Iinclude/ -I/usr/local/arm_tools/arm-elf/inc/-D__uClinux__ -DNEW_KERNEL –D__USE_BSD=1 –D_Lvm_H_include –DEMBED –DIPTABLES_VERSION=\”(IPTABLES_VERSION)\”

        

         LDFLAGS=-L./ -L${lib}/ -L${lib}/lib –L${lib}/libc

 -L${lib1} –static

             LDLIBS= -lcrypt –lc -lgcc

保存,退出。

(3)vi Rules.make

      CC=arm-elf-gcc

      LD=arm-elf-ld

    

 Install: all $(EXTRA_INSTALLS)

    @if [-f  /usr/local/arm_tools/bin/iptables –a “$(BINDIR)” = “usr/local/arm_tools/bin”];\

 Then echo ‘Erasing iptables from old location (now /usr/local/arm_tools/bin).’;

\

 rm –f /usr/local/arm_tools/bin/iptables;\

fi

保存、退出。

(4)把iptalbes-1.3.5目录下的所有fork函数改成vfork

(5)运行make clean ;make; 生成iptables可执行文件。

 

2.2 menuconfig 配置iptables使能

   (1)打开kernel目录     输入make menucofnig

   (2)进入配置界面

        [*] customize kernel settings

        [*] customize vendor/user setting(new)

       打上*号后退出、保存。

    (3)进入Networking operantion -à

<*> netlink device emulation

[*] network packet filtering (replaces ipchains)

IP:netfilter Configuration -à

     <*>Connection tracking(required for masq/NAT)

   <*> FTP protocol support

   <*>IP tables support(required for filtering/masq/NAT)

   <*>limit match support

   <*> MAC address match support

   <*>netfilter MARK match support

   <*>multiple port match support

   <*>connection state match support

   <*>packet filtering

   <*>reject target support

   <*>REJECT target support

   <*> Full NAT

   <*>MASQUERADE target support

   <*> REDIRECT target support

   <*> packet mangling

   <*> TOS target support

   <*>MARK target support

   <*>LOG target support

    选*号后,退出、保存

       进入 Main Menu

            Network Applications -à

                  [*] iptables

                  选择*号后,退出、保存

   

 

2.3打补丁

    (1) cd  /home/seen/pdb/uClinux-dist/

      命令行运行一下操作:

      patch –p1 < pathc-o-matic-20041009/base/NETLINK.pathc

      patch –p1 < pathc-o-matic-20041009/base/NETMAP.patch

      patch –p1 < pathc-o-matic-20041009/base/ipv4options.pathc

      patch –p1 < pathc-o-matic-20041009/base/ipv4OTSSTRZP.pathc

      patch –p1 < pathc-o-matic-20041009/base/pool.patch

      patch –p1 < pathc-o-matic-20041009/base/nth.patch

      patch –p1 < pathc-o-matic-20041009/base/connlimit.patch

      patch –p1 < pathc-o-matic-20041009/base/psd.patch

      patch –p1 < pathc-o-matic-20041009/base/quota.patch

      patch –p1 < pathc-o-matic-20041009/base/random.pathc

      patch –p1 < pathc-o-matic-20041009/base/iprange.patch

      patch –p1 < pathc-o-matic-20041009/base/mport.patch

      patch –p1 < pathc-o-matic-20041009/base/TTL.patch

     打完补丁后,编译内核生成新的linux.zip,如果内核报错,则patch  -R –p1 < pathc-o-matic-20041009/base/xxx.patch 撤销之前打过的xxx.patch.

2.4烧写固件       

           将上面生成的romfs.zip和kernel.zip烧写到arm开发板中。

           开发板运行起来后,在串口终端运行     (1)/>iptbles -t nat -A PREROUTING -d 192.168.9.61 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.42

所有PC  A访问wan口22端口的包都被转发到内网PC B 的22端口上

 

  (2)/>iptbles -t nat -A PREROUTING -d 192.168.9.61 -p tcp --dport 8096 -j DNAT --to-destination 192.168.1.42:80 

所有PC A访问wan口8080端口的包都被转发到内网PC B 80端口上实现外网访问内网的http功能。

 

(

(4)/>iptbles -t nat -A PREROUTING -d 192.168.9.61-p tcp --dport 22,55,87 -j DNAT --to-destination 192.168.1.42 

所有PC A 访问wan口22,55,87 端口的包都被转发到内网PC B相应22,55,87 端口上。

 

 

使用iptables –L –n –t nat 命令可以看到以上命令是否配置成功。如下所示:

/> iptables -L -n -t nat

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination        

DNAT       tcp  --  0.0.0.0/0            192.168.9.61        multiport dports 22,55,87 to: 192.168.1.42 

DNAT       tcp  --  0.0.0.0/0            192.168.9.61                 tcp dpt:8096 to: 192.168.1.42:80

 

Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination       

(6)/proc/sys/net/ipv4/ip_forward  置“1”。

 至此,arm开发板网络地址转换功能完全实现。

这里有一个问题,总不能每次开发板启动后都手动在命令行上输入这些命令,这太不厚道。所以要实现路开发板开机后自动运行这些命令。

2.5  c程序实现iptables配置命令

     C程序模拟命令行输入,linux有个system()函数就能实现这个功能,good。即便这个函数自身存在一些问题。Linux环境下man system有介绍。

     函数实现流程:

                     //set ip_forward  as 1

IC_INT32 IC_IP_FORWARD(IC_VOID)

{

fd = Open(”ip_forward”);

write(1,fd);

}

                            //iptables 命令实现

               IC_INT32 IC_SEND_IPTABLES_CMD(IC_VOID)

               {

                                                  System(“iptbles -t nat -A PREROUTING -d WanPortIp -p tcp --dport 22,55,87 -j DNAT --to-destination PrinterIp”);

System(“iptbles -t nat -A PREROUTING -d WanPortIp -p tcp --dport 8096 -j DNAT --to-destination WanPortIp :80”);

}

     编译后,生成roms.zip固件烧写到arm开发板。开机运行

     通过IE浏览器地址栏输入192.168.9.61:8096就可以访问打印机80端口。

posted on 2014-06-23 15:19  Sanz  阅读(1260)  评论(0编辑  收藏  举报