一、配置內核,支持iptables、forward和nat
二、交叉編譯iptables
a.源碼下載:
ftp://ftp.netfilter.org/pub/iptables/
b.交叉編譯iptables
tar -xvf iptables-1.8.4.tar.bz2 cd iptables-1.8.4 mkdir build ./configure --prefix=$PWD/build --host=arm-linux
這時報如下錯誤:
checking for libmnl... no *** Error: No suitable libmnl found. *** Please install the 'libmnl' package Or consider --disable-nftables to skip iptables-compat over nftables support.
加上--disable-nftables重新配置:
./configure --prefix=$PWD/build --host=arm-linux --disable-nftables
配置成功,執行make進行編譯,編譯完成后執行make install進行安裝,會安裝在build目錄下。
root@machine:~/wifi/iptables-1.8.4# ls build bin include lib sbin share
把build/lib build/sbin build/bin目錄里的內容全部拷貝到開發板的/usr/lib /usr/sbin/ /usr/bin目錄下,這里需要注意的是拷貝的時候使用“cp -rf”,連同軟鏈接也一起拷貝。
三、測試
a. 啟用內核轉發
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf #如果開發板文件系統本身不存在/etc/sysctl.conf文件,使用'>',否則使用'>>'(添加到文件尾)。 sysctl -p
或者
echo "1" > /proc/sys/net/ipv4/ip_forward
b.開發板上執行配置 iptables
iptables -F iptables -t nat -F iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
這時報如下錯誤:
/root # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables v1.8.4 (legacy): Couldn't load target `MASQUERADE':No such file or directory Try `iptables -h' or 'iptables --help' for more information.
解決辦法:
export XTABLES_LIBDIR=/usr/lib/xtables:$XTABLES_LIBDIR
然后就可以成功執行“iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE”了,這時連接到熱點的設備即可通過eth0去訪問互聯網了。
eth0可以設置靜態IP地址也可以使用dhclient動態獲取IP地址,建議使用dhclient動態獲取,dhclient會自動配置好網關和DNS。
手動設置靜態IP的話需要自己去配置網關和DNS,方法如下:
ifconfig eth0 192.168.0.102 #路由器的LAN口IP為192.168.0.1這里需要和路由器LAN口在同一個網段 route add default gw 192.168.0.1 dev eth0 #設置eth0網關
修改/etc/resolv.conf添加DNS:
nameserver 192.168.0.1 #192.168.0.1是路由器的LAN口IP地址 nameserver 8.8.8.8 #google域名服務器 nameserver 8.8.4.4 #google域名服務器
設置完成后可以查看一下網關是否設置正確:
route -n
或者
netstat -r
四、寫一個腳本開機自動執行
#! /bin/sh export XTABLES_LIBDIR=/usr/lib/xtables:$XTABLES_LIBDIR hostapd -B /etc/myhostapd.conf ifconfig wlan0 192.168.3.1 dhcpd -cf /etc/dhcpd.conf wlan0 echo "1" > /proc/sys/net/ipv4/ip_forward #echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf #sysctl -p iptables -F iptables -t nat -F iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE