基于嵌入式linux路由转发功能的实现
环境 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.
2
从网上下载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路由转发功能的实现的更多相关文章
- 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试
一. 引言 千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准.采用和10M以太网相似的帧格式.网络协议和布线系统,基于光纤和短距离同轴电缆的物理层介质,更适用于 ...
- CentOS 6.9搭建的网关服务器不经过静态路由表的问题解决(没有开启路由转发功能)
场景: 1.使用CentOS 6.9搭建的网关服务器,下面的机器都设置用这个网关,搭建参考:http://www.cnblogs.com/EasonJim/p/8289618.html 2.配置了静态 ...
- 【miscellaneous】【ARM-Linux开发】ARM平台基于嵌入式Linux Gstreamer 使用
1). 简介 随着ARM平台性能的日益强大和嵌入式设备的发展,对于多媒体处理如音视频播放,摄像头,流媒体处理等需求也日益增多,本文就通过几个基于嵌入式Linux下多媒体应用的示例来简单展示下使用Gst ...
- 后渗透阶段之基于MSF的路由转发
目录 反弹MSF类型的Shell 添加内网路由 MSF的跳板功能是MSF框架中自带的一个路由转发功能,其实现过程就是MSF框架在已经获取的Meterpreter Shell的基础上添加一条去往“内网” ...
- (转)Linux开启路由转发功能
原文:https://www.linuxidc.com/Linux/2016-12/138661.htm 标记一下,今天想让一台Red Hat Enterprise Linux 7开通iptables ...
- Linux 开启路由转发功能
想让一台Red Hat Enterprise Linux 7开通iptables的nat转发功能 A服务器:192.168.30.20/24 B服务器:192.168.30.1/24,eth0; 19 ...
- 如何启用linux的路由转发功能
如何使用iptables的NAT功能把红帽企业版Linux作为一台路由器使用? 方法: 提示: 以下方法只适用于红帽企业版Linux 3 以上. 1.打开包转发功能: echo "1&quo ...
- 7、基于嵌入式Linux的视频采集系统---UVC驱动模型介绍
UVC 即 usb video class.USB协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些C ...
- 手把手带你基于嵌入式Linux移植samba服务
摘要:Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 本文分享自华为云社区<嵌入式Linux下移植samba服务--<基于北斗和4G ca ...
随机推荐
- javap反汇编的使用
javap可以查看class文件信息,灵活的运用javap,让你更好的理解class类文件结构信息等 方法/步骤 javap -help查看命令帮助 javap -package Te ...
- WPF popup自动关闭
var tileMore = new Tile { Height = , Width = , Background = , , )), Title = "更多...", }; ti ...
- DevOps 开源工具
1. 开发工具 版本控制&协作开发 版本控制系统 Git Git 是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.开源中国 Git 代码托管平台:http:/ ...
- echarts绘制k线图为什么写candlestick类型就报错
错误提示:echarts-en.common.js:11713 Uncaught Error: Component series.candlestick not exists. Load it fir ...
- jupyter 中markdown使用
jupyter使用还是很方便的,尤其是喜欢MarkDown功能,在安装插件后可以非常清晰的看到整个文档的基本结构,下面介绍下MarkDownd的使用: 1.MarkDown必须是在命令模式是下使用的, ...
- iOS代码块block使用
代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值. 脱字符是代码块的语法标记.下图表示代码块的 ...
- 监测NGINX服务的shell脚本
Nginx 虽然处理并发量比 apache 确实要强点,但它这种 php-cgi 模式不是太稳定,这点网上也有朋友总结了,我在实现项目中也感受到了. 偶尔会出现以下情况的:php-cgi 进程突然消失 ...
- ubuntu apt 安装 mpv
安装 curl -s https://non-gnu.uvt.nl/debian/uvt_key.gpg | sudo apt-key add - sudo add-apt-repository &q ...
- Java并发编程75道面试题及答案
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- CentOS7装好了开始装wrf了
1. 安装PGI编译器 下载地址:https://www.pgroup.com/products/community.htm(pgi官网社区版) 下载完将其复制到虚拟机内: 补充一下 我是在home ...