最近为客户写应用程序来测试网卡,客户要求ping自己来检查是否通路,发现ping开发板自己IP时不管插不插自回环网线都能ping通,而我写的测试程序其实就是对ping命令进行的字符串分析,因此这样是不能检测出网卡的通路与否。后来知道ping自己ip时会路由到本地环回的虚网口,数据包根本没有到物理层从网卡发出。因此不管网卡好坏都可以ping通。组长跟我说用iptables命令来做NAT转换ip,可以实现这个功能。
根文件系统中没有iptables这个命令,因此需要交叉编译下iptables命令:
下载源码包
#apt-get source iptables
解压进入源码包,交叉编译源码的步骤基本都一样,先configure,指定安装目录以及交叉编译目标,然后make make install
注意这里指定安装目录的时候最好指定一个路径简单的目录,因为将生成的bin include以及lib放到rootfs中使用时出现一个问题就是运行iptables时找不到SNAT文件。用LD_LIBRARY_PATH指定也不行,后来用strace命令跟踪iptables命令,发现它在查找类似SNAT这些相关的库文件时是按照安装路径的目录来查找的,跟qtopia的安装目录也必须一致是一样的,所以最好安装在路径简单的目录,这样按照同样的路径放到rootfs中就可以使用了,当然,主要是lib下的文件依赖这个路径,bin以及sbin下的可执行程序可以直接放到rootfs下的bin下或者sbin下。
使用iptables内核还需要一些配置:
Networking —->
Networking options —->
[*] Network packet filtering (replaces ipchains) —>
Core Netfilter Configuration —>
<*> Netfilter Xtables support (required for ip_tables)
IP: Netfilter Configuration —>
<*> IPv4 connection tracking support (required for NAT)
<*> Connection tracking (required for masq/NAT)
<*> IP tables support (required for filtering/masq/NAT)
<*> IP range match support
<*> Packet filtering
<*> REJECT target support
<*> Full NAT
<*> MASQUERADE target support
<*> REDIRECT target support
重新编译烧写内核。
使用iptables命令实现NAT,命令如下:
iptables -t nat -A POSTROUTING -d 172.17.101.188 -j SNAT --to-source 172.17.101.12
iptables -t nat -A PREROUTING -d 172.17.101.188 -j DNAT --to-destination 172.17.101.25
ifconfig eth0 172.17.101.25
echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0 down hw ether 00:01:02:03:04:05 up
arp -s 172.17.101.12 00:01:02:03:04:05 dev eth0
arp -s 172.17.101.25 00:01:02:03:04:05 dev eth0
arp -s 172.17.101.188 00:01:02:03:04:05 dev eth0
这样ping我的原来ip在插网线的情况下可以ping通,而不插网线的情况下就ping不通了
来源:CSDN
作者:boyemachao
链接:https://blog.csdn.net/boyemachao/article/details/104675848