环境 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端口。

基于嵌入式linux路由转发功能的实现的更多相关文章

  1. 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

    一. 引言 千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准.采用和10M以太网相似的帧格式.网络协议和布线系统,基于光纤和短距离同轴电缆的物理层介质,更适用于 ...

  2. CentOS 6.9搭建的网关服务器不经过静态路由表的问题解决(没有开启路由转发功能)

    场景: 1.使用CentOS 6.9搭建的网关服务器,下面的机器都设置用这个网关,搭建参考:http://www.cnblogs.com/EasonJim/p/8289618.html 2.配置了静态 ...

  3. 【miscellaneous】【ARM-Linux开发】ARM平台基于嵌入式Linux Gstreamer 使用

    1). 简介 随着ARM平台性能的日益强大和嵌入式设备的发展,对于多媒体处理如音视频播放,摄像头,流媒体处理等需求也日益增多,本文就通过几个基于嵌入式Linux下多媒体应用的示例来简单展示下使用Gst ...

  4. 后渗透阶段之基于MSF的路由转发

    目录 反弹MSF类型的Shell 添加内网路由 MSF的跳板功能是MSF框架中自带的一个路由转发功能,其实现过程就是MSF框架在已经获取的Meterpreter Shell的基础上添加一条去往“内网” ...

  5. (转)Linux开启路由转发功能

    原文:https://www.linuxidc.com/Linux/2016-12/138661.htm 标记一下,今天想让一台Red Hat Enterprise Linux 7开通iptables ...

  6. Linux 开启路由转发功能

    想让一台Red Hat Enterprise Linux 7开通iptables的nat转发功能 A服务器:192.168.30.20/24 B服务器:192.168.30.1/24,eth0; 19 ...

  7. 如何启用linux的路由转发功能

    如何使用iptables的NAT功能把红帽企业版Linux作为一台路由器使用? 方法: 提示: 以下方法只适用于红帽企业版Linux 3 以上. 1.打开包转发功能: echo "1&quo ...

  8. 7、基于嵌入式Linux的视频采集系统---UVC驱动模型介绍

    UVC 即 usb video class.USB协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些C ...

  9. 手把手带你基于嵌入式Linux移植samba服务

    摘要:Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 本文分享自华为云社区<嵌入式Linux下移植samba服务--<基于北斗和4G ca ...

随机推荐

  1. python基础15下_迭代器_生成器

    print(dir([])) #告诉我列表拥有的所有方法 # 双下方法 # print([1].__add__([2])) print([1]+[2]) ret = set(dir([]))& ...

  2. sql server存储过程,常用的格式

    BEGINSET NOCOUNT ON;if @_MODE NOT IN ('A','M','D') begin raiserror('参数错误!',16,3); return; end; decla ...

  3. python(pygame)滑稽大战(类似飞机大战) 教程

    成品已录制视频投稿B站(本文目前实现了基础的游戏功能),点击观看项目稽忽悠不(github)地址:https://github.com/BigShuang/From-simple-to-Huaji 本 ...

  4. 帝国cms中下拉框select的绑定

    在修改数据模型中,将下拉框的表示代码换成下: 将id换成自己的id地址.数据库查询中的classid换成自己创建栏目的id. <select name="diqu" id=& ...

  5. django(channel)到 ubuntu

    1.准备工作 删除各app/migrations/下的以数字开头的数据库同步日志文件: 假设你使用的是Pycharm,我们要生成环境包: pip freeze > requirements.tx ...

  6. 如何才能在python的路上走得更远

    刚开始了新的课程,现在又没有什么心情学习了,不知点解就是提不起兴趣去学习,为什么呢?学习python如何才能提起劲,有什么方法可以提上劲学习?

  7. 完美解决win10家庭版本系统无法远程连接问题

    版权声明:本文转载.原文: https://blog.csdn.net/rainmaple20186/article/details/80913191 近期接入同一局域网的服务器,发现在连接的时候,报 ...

  8. 【oracle】ORA-02289: sequence does not exist

    select * from user_sequences where sequence_name = 'NLDP_LGIR_BASE_SEQUENCE'; 通过该指令查看SEQUENCE是否存在

  9. 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...

  10. Java中switch对整型/字符型/字符串型具体实现细节

    转自:http://www.hollischuang.com/archives/61 Java7中switch中支持的数据类型有: byte short int char String类型 其实swi ...