armLinux的iptables转发,实现路由器功能
iptables的转发实现ip地址实际访问地址的转发。
路由器功能,看做将一个网卡作为wan口,一个网卡作为lan口。wan口配置到外网,实现互联网的接入。lan口重新分配本地ip段,实现本地连接。
再将lan口的ip通过iptables转发到wan口,实现lan口接入互联网。
1. iptables功能的内核支持:
第一步,选中Networking support (按Y)
第二步,回车进入Networking support ,再进入Networking options
第三步,选中下面的选项(按Y)
第四步,按回车进入到core Netfilter configuration (按Y)
第五步,core Netfilter configuration选择如下选项:
第六步,进入到 IP:Netfilter Configuration
第七步,选择IP:Netfilter Configuration 的如下选项:
注意:千万不要将这些选项一股脑全部勾选,有些功能用不到,而且选多了会造成内核不稳定,突然就跑飞了的情况。亲历过那种找问题的过程。
到此内配置完毕,需要重新编译内核移植到开发板。
2. 下载iptables命令源码,移植一个iptables指令。
我下载的是1.4.7版本。
编译之后,iptables指令是连接到iptables-multi的,直接拷贝iptables-multi指令,作为iptables使用。
3. 板端的实际配置和应用。
两个wlan设备,wlan0和wlan1 。
我这里wlan1 作为wan口,配置其连接到外网,从外网端分配的IP地址为192.168.0.133
waln0作为lan口,hostapd起AP模式,udhcpd配置自动分配IP。
可以看到wan口,lan口的ip完全不在同一个网段。
配置lan口能上网,此时需要运行如下两条指令:
#开启ip_forward转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#lan口ip转发到wan口
/apps/iptables -t nat -A POSTROUTING -s 172.16.11.0/24 -j SNAT --to 192.168.0.133
到此可以ping通wan口网关,192.168.0.1
但是还是不能上网。
需要配置DNS服务器:我配置的是如下两个,可以配置到udhcpd.conf文件里面,自动给接入lan口的设备,分配DNS
114.114.114.114
8.8.8.8
到此接入lan口的设备可以通过arm板访问外网。板也实现了一个简单的路由功能。
错误log信息,解决方法:
# iptables -t nat -nL 提示
iptables v1.3.5: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
解决方法: 编译内核时加入以下模块
Linux Kernel Configuration
-> Networking support
-> Networking options
-> Network packet filtering framework(netfilter)
-> Core netfilter configuration
-> Netfilter connection tracking support
-> Netbios name service protocal support(new)
-> Netfilter Xtables support (required for ip_tables)
Linux Kernel Configuration
-> Networking support
-> Networking options
-> Network packet filtering framework(netfilter)
-> IP: Netfilter Configuration
-> IPv4 connection tracking support (require for NAT)
-> IP tables support (required for filtering/masq/NAT)
-> Full NAT
-> MASQUERADE target support
-> REDIRECT target support