一台嵌入式的设备,有两个网卡,一个是eth0,可以连接外网,另一个eth1,连接内部网络设备,比如网络摄像机。想通过eth0直接访问到网络摄像机,比如访问摄像机的主页,或者rtsp
网络推视频流。
如下图所示
查阅了资料,知道是用netfilter
这个实现的。基本上要做以下的事情:
netfilter
组件之所以写这篇文章,是因为虽然试验成功了,但是不清楚原理,很容易就会遗忘,因此先记录下来,看以后是不是有机会能理解原理。
netfilter
组件Networking support
-> Networking options
-> Network packet filtering framework (Netfilter)
这里不熟悉,不了解哪些选项可以不选,因此把下图中标红的全部选上 了。
Core Netfilter Configuration
和IP: Netfilter Configuration
下一级菜单还有很多组件,我不熟悉,因此全部选上。
编译后得到新的内核文件烧到嵌入式设备中。
下载最新的iptables
源码,是iptables-1.8.3.tar.bz2
。
解压后,.configure
配置,make
和make install
得到最后的执行文件。
./configure --host=arm-hisiv600-linux --enable-static --disable-shared --prefix=your_install_dir --disable-ipv6 --disable-largefile
# your_install_dir根据自己安装到哪写,我一般用`pwd`/install,即安装到源目录的install中
make
make install
最后在your_install_dir
中得到结果,如图
我们要的只是your_install_dir/sbin
中的iptables
,iptables-restore
,iptables-save
,xtables-legacy-multi
这四个文件。复制到嵌入式设备的/usr/sbin
中。
规则到现在我都没搞清楚,参考了很多别人的文章,没有完全照着做能行的。之后一边参考别人的做法,一遍尝试自己修改,虽然成功了,但是规则目前我没完全明白为什么这样可以,如果有清楚的请留言给我解释一下。规则如下:
首先开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
然后执行规则让外网电脑访问eth0的端口6123的能访问到摄像机的主页,即通过http://192.168.0.172:6123就能访问到http://172.16.0.60:80,规则如下
iptables -t nat -I PREROUTING -d 192.168.0.172 -p tcp --dport 6123 -j DNAT --to-destination 172.16.0.60:80
iptables -t nat -I POSTROUTING -d 172.16.0.60 -p tcp --dport 80 -j SNAT --to 172.16.0.55
再增加一个规则,让外网电脑通过视频播放网络流rtsp://192.168.0.172:6124/1
就能访问到摄像机的rtsp
流rtsp://172.16.0.60/1
。rtsp
用的端口是554。规则如下:
iptables -t nat -I PREROUTING -d 192.168.0.172 -p tcp --dport 6124 -j DNAT --to-destination 172.16.0.60:554
iptables -t nat -I POSTROUTING -d 172.16.0.60 -p tcp --dport 554 -j SNAT --to 172.16.0.55
那主页访问这个来说,第一条规则,我的理解是进入嵌入式设备eth0
的规则是PREROUTING
这个,如果匹配这个条件:目标IP是192.168.0.172,而且协议是TCP,端口是6123。那么就执行DNAT动作,即把目标替换成172.16.0.60:80。
第二条规则,里面的--to
我搜索了,搜索不到什么意思,只查到有--to-destination
和--to-source
,谁知道第二条规则的意义请告知。这里我暂时理解成:从嵌入式机器出去的规则是POSTROUTING
这个,如果匹配这个条件:目标IP是172.16.0.60,而且协议是TCP,端口是80,就把源地址替换成172.16.0.55。
有两个问题没搞清楚,谁知道麻烦留言告知。
最后,推荐一个博客,写的很好。虽然我学习完后还是不理解这里的转发规则意义,以及为什么能实现转发,不过文章写得很清晰详细,值得学习。
朱双印个人日志里面的IPtables文章