首页 > Linux, OpenWrt > Gargoyle(石像鬼)路由器设置Guest SSID功能

Gargoyle(石像鬼)路由器设置Guest SSID功能

2015年2月22日 LTNS     访问次数 246 发表评论 阅读评论

之前折腾过 OpenWrt路由器通过LuCI界面实现Guest SSID功能,现在把手上的 Netgear WNDR4300 无线路由器刷上 Gargoyle石像鬼固件,继续设置一下 Guest SSID功能。

Gargoyle作为 OpenWrt 的Web前端之一,相比 LuCI 等其他前端,其界面更简单易用,而且还拥有非常强大的 QoS带宽管理功能。不过通过 Gargoyle管理页面设置的访客网络和路由器主网络仍处于同一网段,尽管可以设置为相互隔离但感觉不是很安全,而且 MAC地址过滤功能无法区别对待 主SSID和 Guest SSID(即,一旦路由器设置了 MAC地址过滤则对 Guest SSID亦会生效),所以只能放弃,改用手工配置。

Gargoyle官网下载页面 提供了对应 WNDR4300的固件,基于 OpenWrt Barrier Breaker 14.07,默认的登录密码是 password,首次登陆Web管理页面后会提示修改密码,还可以进入插件管理页面下载并安装中文界面语言包和其他插件。

 
设置Guest SSID

设置 Guest SSID功能需要修改四个文件(请用比如 WinSCP 软件登录路由器进行修改),以下分别一一说明。

1. guest网络需设置为一个独立的网段比如192.168.11.0/24,为此请在配置文件 /etc/config/network 的末尾添加如下内容

config interface 'guest'   #名称可自定义,但后面的interface和network参数须保持一致
	option ifname 'wlan0-1'
	option proto 'static'
	option ipaddr '192.168.11.1'   #必须和路由器主网段不一致
	option netmask '255.255.255.0'

注:绑定的虚拟无线网卡可能不是 wlan0-1,请在步骤4完成后执行 ifconfig命令检查并在这里修正。
 
2. 设置guest网络的dhcp server的参数,须在 /etc/config/dhcp 文件末尾添加

config dhcp 'guest'
	option interface 'guest'
	option leasetime '12h'
	option start '110'
	option limit '40'

 
3. 配置guest网络的防火墙,在 /etc/config/firewall 文件末尾添加

config zone
	option name 'guest'     #名称可自定义,但后面的src参数须保持一致
	option forward 'REJECT'
	option output 'ACCEPT'
	option network 'guest'
	option input 'REJECT'   #禁止guest网络对路由器本身的访问,优先级低于后面的规则

config forwarding
	option dest 'wan'
	option src 'guest'

config rule
	option target 'ACCEPT'
	option proto 'tcp udp'
	option dest_port '53'
	option name 'Guest DNS'
	option src 'guest'

config rule
	option target 'ACCEPT'
	option proto 'udp'
	option dest_port '67-68'
	option name 'Guest DHCP'
	option src 'guest'

注:路由器本身只有TCP/UDP 53、UDP 67-68这几个端口可供guest网络访问,另,允许guest网络访问互联网。
 
4. 增加一个虚拟SSID,在 /etc/config/wireless 文件末尾添加

config wifi-iface 'ap_gs'     #名称可自定义
	option device 'radio0'
	option mode 'ap'
	option network 'guest'
	option disassoc_low_ack '0'
	option encryption 'psk2'
	option key 'abcdefgh'   #无线安全密码,至少要8位
	option ssid 'guest'     #可自定义SSID名

注:disassoc_low_ack参数是针对 openwrt可能的bug的临时性措施,详见 这个帖子

 
重启路由器后,来访客人应该就可以通过单独的 Guest SSID无线上网了(且不受路由器 MAC地址过滤的影响),同时无法访问路由器本身(除了步骤3防火墙规则允许的端口)和路由器原有的内网,这样就实现了原有的内网和guest网络之间的安全隔离。

如果来访客人无法上网,可用比如 Putty 登录路由器后运行 ifconfig命令(或在 Gargoyle的插件 WebShell里面运行),检查一下新增的虚拟无线网卡是否和步骤1设置的一致,若不一致请修改 /etc/config/network 文件。

 
关于 Guest SSID丢失的问题

实际使用中发现一个问题,即,每次在 Connection > Basic 页面点击 “Save Changes” 按钮后,通过如上的步骤4在 /etc/config/wireless 文件中添加的Guest SSID部分就会丢失(其他三个配置文件没有类似问题)。

可以新建一个脚本文件如 /root/gsw.sh,内容如下

#!/bin/sh

grep -q 'ap_gs' /etc/config/wireless
if [ $? != 0 ]
then
	cat /etc/config/wireless.user >> /etc/config/wireless
#	wifi   #重启无线服务,如在/sbin/wifi中运行本脚本,则需注释掉或删掉这一行以免死循环
#else
#	echo "Guest SSID already exists in 'wireles'."
fi

 
以及相应的自定义配置文件,比如 /etc/config/wireless.user

config wifi-iface 'ap_gs'
	option device 'radio0'
	option mode 'ap'
	option network 'guest'
	option disassoc_low_ack '0'
	option encryption 'psk2'
	option key 'abcdefgh'
	option ssid 'guest'

 
该脚本用于检查 /etc/config/wireless 文件中是否存在 Guest SSID部分,若不存在则自动在文件末尾添加,可测试一下脚本是否管用

cd ~
chmod +x gsw.sh   #第一次运行需添加脚本的可执行属性
./gsw.sh       #运行脚本

测试正常后就可以把该脚本加入到 /etc/rc.local文件中以实现开机后自动运行,或者定时任务中以定期运行脚本,但这些方式都不够完美。

经试验,发现在 Connection > Basic 页面点击 “Save Changes” 按钮后,是由 /sbin/wifi 文件中的 wifi_updown函数来重启无线服务的,因此可在该函数的开头位置插入运行gsw.sh脚本的命令

...
wifi_updown() {
/root/gsw.sh
	cmd=down
	[ enable = "$1" ] && {
		_wifi_updown disable "$2"
		ubus_wifi_cmd "$cmd" "$2"
		scan_wifi
		cmd=up
	}
	ubus_wifi_cmd "$cmd" "$2"
	_wifi_updown "$@"
}
...

 

 
补充1:
后来发现其他三个配置文件偶尔也丢失过添加的Guest SSID部分(原因未知),于是新建一个检查用的脚本 /root/gs.sh

#!/bin/sh

grep -q "interface 'guest'" /etc/config/network
if [ $? != 0 ]
then
	cat /etc/config/network.user >> /etc/config/network
	/etc/init.d/network restart
#else
#	echo "Guest SSID already exists in 'network'."
fi

grep -q "dhcp 'guest'" /etc/config/dhcp
if [ $? != 0 ]
then
	cat /etc/config/dhcp.user >> /etc/config/dhcp
	/etc/init.d/dnsmasq restart
#else
#	echo "Guest SSID already exists in 'dhcp'."
fi

grep -q "src 'guest'" /etc/config/firewall
if [ $? != 0 ]
then
	cat /etc/config/firewall.user >> /etc/config/firewall
	/etc/init.d/firewall restart
#else
#	echo "Guest SSID already exists in 'firewall'."
fi

grep -q "wifi-iface 'ap_gs'" /etc/config/wireless
if [ $? != 0 ]
then
	cat /etc/config/wireless.user >> /etc/config/wireless
	/sbin/wifi
#else
#	echo "Guest SSID already exists in 'wireless'"
fi

注:同样需要建立 network.user、dhcp.user和firewall.user这三个自定义配置文件,像前面一样

同样测试一下

cd ~
chmod +x gs.sh
./gs.sh

然后把该脚本加入到 /etc/rc.local文件中以实现开机后自动运行,还可以再把脚本添加到定时任务 /etc/crontabs/root

...
1 */2 * * * /root/gs.sh     #每两小时检查一次

 
 
补充2:
发现位于 /etc/config/wireless 文件末尾的 Guest SSID部分偶尔会跑到前面去(原因未知),比如

...
config wifi-iface 'ap_gs'    #添加的Guest SSID部分,本应在文件末尾
	option device 'radio0'
	...
	option ssid 'guest'

config wifi-iface 'ap_g'     #原有的无线2.4G
	option device 'radio0'
	...
	option ssid 'Gargoyle'

config wifi-iface 'ap_a'     #原有的无线5G
	option device 'radio1'
	...
	option ssid 'Gargoyle'

 
Connection > Basic 页面只会从 /etc/config/wireless 文件中依次读取导致显示的参数错误,如下图所示
Gargoyle_Connections- Basic_error

当然这只是显示错误,不影响实际的使用,但如果这时再点击 “Save Changes” 按钮的话就会使错误的无线设置生效。为避免这种显示参数错误的情形,需修改前面创建的脚本文件 /root/gs.sh 的末尾部分,以实现路由器开机时以及定期自动检查并调整。

...
apg=`grep -n "wifi-iface 'ap_g'" /etc/config/wireless | cut -d ":" -f 1`
apgs=`grep -n "wifi-iface 'ap_gs'" /etc/config/wireless | cut -d ":" -f 1`
num=`cat /etc/config/wireless.user | wc -l`
num=$((${apgs}+${num}))
grep -q "wifi-iface 'ap_gs'" /etc/config/wireless
if [ $? != 0 ]
then
	cat /etc/config/wireless.user >> /etc/config/wireless
	/sbin/wifi
#else
#	echo "Guest SSID already exists in 'wireless'"
elif [ "$apg" -gt "$apgs" ]
then
	sed -i ''$apgs','$num'd' /etc/config/wireless
	cat /etc/config/wireless.user >> /etc/config/wireless
fi

注:前面创建的 /etc/config/wireless.user 这个自定义配置文件,其末尾一行须有且只能有一个回车符,否则脚本根据计算出来的行数去调整文件 /etc/config/wireless 会漏删或多删。

 

15.02.25更新
Gargoyle官网 的 WNDR4300固件未用足 128M Nand Flash,另外,也缺少一些内核模块,因此还需要动手重新编译 Gargoyle固件,详见 后文

 
 

参考文章
http://wiki.openwrt.org/doc/recipes/guest-wlan

 

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
9 + 5 = (必填)