您的位置:首页 > 其它

iptables学习笔记:使用NAT实现简单的无线AP

2017-08-02 19:20 621 查看
之前使用的是无线路由让手机上网。学习了iptables后,尝试在非openwrt系统的Linux上实现相同功能。本文简单记录一下。
手上有块X86的板子,上面安装了linux系统。几个月前研究了WIFI并实现了一个无线AP,最近又重新拾起了iptables,于是顺便让这个AP真正实现上网功能。文章《iptables学习笔记:端口转发之“内网访问外网”》的标题有“端口”二字,是因为其应用场合特殊,除了IP地址要转换外,还要指定端口号,但本文简化了应用场合,只需要进行地址转换即可正常上网。

一、Linux系统网络参数

首先要正确设置Linux系统的IP信息。设置默认网关(仅做示例):

[cpp] view
plain copy

route add default gw 172.18.18.18  

并且要设置好服务器DNS。添加(或修改)/etc/resolv.conf文件,内容示例如下:

[cpp] view
plain copy

domain latelee.com.cn  

search latelee.com.cn  

nameserver 172.18.18.10  

当然,如果是使用DHCP的话,上述操作自动完成,无须用户关注。

二、iptables地址转换

在Linux上使能转发,命令如下:

[cpp] view
plain copy

echo "1" > /proc/sys/net/ipv4/ip_forward  

地址转换NAT:

[cpp] view
plain copy

iptables -t nat -A POSTROUTING -j MASQUERADE  

注意,这里的命令不再指定具体地址,也不指定具体网络设备。
iptables表如下:

[cpp] view
plain copy

# iptables -t nat -L  

Chain PREROUTING (policy ACCEPT)  

target     prot opt source               destination           

  

Chain INPUT (policy ACCEPT)  

target     prot opt source               destination           

  

Chain OUTPUT (policy ACCEPT)  

target     prot opt source               destination           

  

Chain POSTROUTING (policy ACCEPT)  

target     prot opt source               destination           

MASQUERADE  all  --  anywhere             anywhere   

三、无线AP

Linux系统可以使用dnsmasq实现DNS和DHCP功能。这样,当有PC或设备连接时则会自动分配IP地址。

dnsmasp配置文件如下(/tmp/ap/dnsmasq.conf):

[cpp] view
plain copy

# Bind to only one interface  

bind-interfaces  

# Choose interface for binding  

interface=wlan0  

# Specify range of IP addresses for DHCP leases  

dhcp-range=192.168.250.1,192.168.250.200,255.255.255.0,12h  

#INTERFACE_NET=wlan0  

在上述配置文件中,指定的网口为wlan0,这里WIFI的接口,如果是其它的则根据实际情况修改。执行命令示例如下:

[cpp] view
plain copy

dnsmasq -C /tmp/ap/dnsmasq.conf -x /tmp/ap/dnsmasq.pid -l /tmp/ap/dnsmasq.leases  

无线AP使用hostapd提供WIFI热点服务,可以参考笔者文章《Ubuntu14.04系统hostapd编译及使用》。
下面给出hostapd配置文件如下(/tmp/ap/hostapd.conf):

[cpp] view
plain copy

beacon_int=100  

interface=wlan0 # 网口  

driver=nl80211  

ssid=wifitest # WIFI名称  

channel=0  

max_num_sta=2 # 客户最大连接数  

macaddr_acl=0  

auth_algs=1  

ignore_broadcast_ssid=1 # 隐藏SSID  

wpa=2  

wpa_passphrase=12345678910 # 密码  

wpa_key_mgmt=WPA-PSK  

wpa_pairwise=TKIP  

rsn_pairwise=CCMP  

country_code=CN  

ieee80211d=1  

ieee80211h=1  

hw_mode=g  

ieee80211n=1  

ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40]  

wmm_enabled=1  

force_40mhz=1 # powered by Late Lee  

执行命令示例:

[cpp] view
plain copy

hostapd -B /tmp/ap/hostapd.conf -f /tmp/ap/hostapd.log   

完成上述步骤后,即可以使用手机连接wifitest这个热点了,由于配置文件中隐藏了SSID,需要在手机“设置”页面中手动输出SSID和密码。

四、其它

连接WIFI热点后,在手机执行cat /etc/resolv.conf 提示没有该文件,执行ifconfig也没信息输出,由于对Android不熟悉,就不深究了。
不过在单独测试dnsmasq,在一台设备上连接并用dhclient获取IP,发现/etc/resolv.conf内容如下:

[cpp] view
plain copy

# cat /etc/resolv.conf   

nameserver 192.168.250.1  

DNS服务器IP已经变成为运行dnsmasq所在的Linux系统了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: