Setup Raspberry Pi 2 as Wireless Router
垂涎于Raspberry Pi 2 Model B的四核性能及低廉的价格,待其跌到200RMB左右时,终于还是入手了一个。
装完Raspbian,立马试了XMBC/Kodi媒体中心。效果还是跟以前一样,不尽人意。无它的,就是视频和音频的编码支持不完善,导致很多视频格式都不支持。(为了解决电视机播放手机视频的问题,入手了Chromecast。但Chromecast也不是个省油的灯,后面再说吧。)于是Pi只能放在后台,作为路由和服务器来使用了。
需求:增强无线网络覆盖范围,即作为桥接的无线路由,手机和Chromecast可以通过其上网,特别Chromecast要可以访问Google。
硬件准备:
1)Raspberry Pi 2 Model B,1台。
2)16GB的TF卡,1个,刷上Raspbian。
3)无线网卡,2个(磊科NW338和水星MW150UH),并且有一个(水星MW150UH)支持Ad-hoc功能,即能开启无线热点功能。
4)USB风扇,1个,用于扇热。温度过高的话,会导致硬件性能下降,就是网络传输速度会变慢。
软件安装及设置:
1)初始化准备
参考以下文章,设置好无线网卡的接口名称。否则每次开机,每个无线网卡的接口名称都可能会改变。
Setting Network Interface Name on Raspbian
http://www.foxail.org/blog/index.php/archives/532/
我设置了“磊科 NW338”为wlan0,“水星 MW150UH”为wlan1,。wlan0用于连接无线路由,wlan1用于开启无线热点。
2)配置无线网卡
MW150UH 可能还需要第三方驱动,这里是已编译好的驱动文件:
(UPDATE) Drivers for TL-WN725N V2 - 3.6.11+ -> 4.1.xx+
https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=62371
确定网卡可以运行后,修改 /etc/network/interfaces 为以下内容:
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet manual
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
auto wlan1
#allow-hotplug wlan1
iface wlan1 inet static
address 192.168.11.1
netmask 255.255.255.0
3)hostapd
安装命令:
sudo apt-get install hostapd
由于采用了 水星 MW150UH ,芯片为RTL8188EU,所以参考了以下文章,使用相关已编译的 hostapd 文件来替换原来的 /usr/sbin/hostapd 。
Access Point (AP) for TP-Link TL-WN725N V2
https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=54946
然后备份配置文件/etc/hostapd.conf,并改为如下内容:
interface=wlan1
driver=rtl871xdrv
ssid=rpi-ap
channel=1
hw_mode=g
auth_algs=1
wpa=2
wpa_passphrase=123456
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
#macaddr_acl=1
#accept_mac_file=/etc/hostapd/hostapd.accept
4)dnsmasq
安装命令:
sudo apt-get install dnsmasq
然后备份配置文件/etc/dnsmasq.conf,并改为如下内容:
interface=wlan1
bind-interfaces
#except-interface=lo
dhcp-range=192.168.11.100,192.168.11.150,255.255.255.0,6h
# chromecast bind ip
dhcp-host=aa:bb:cc:dd:ee:ff,my-chromecast,192.168.11.10
5)iptables
设置iptables,实现转发:
sudo iptables -F
sudo iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -s 192.168.11.0/24 -o wlan0 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.11.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -i wlan0 -j ACCEPT
保存iptables配置:
sudo iptables-save > /etc/iptables.rules
设置系统启动时自动加载iptables的配置。修改文件/etc/network/if-pre-up.d/iptables
为以下内容:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
保存该文件后,设置其权限:
sudo chmod +x /etc/network/if-pre-up.d/iptables
6)设置转发
修改文件 /etc/sysctl.conf ,找到net.ipv4.ip_forward
,改为:
net.ipv4.ip_forward=1
7)解决Chromecast连上google的问题
为解决这个问题,花了不少时间去探索和尝试。Chromecast就算ROOT了,也不能安装shadowsocks客户端。解决方法是,固定 Chromecast 的IP地址,该IP的所有连接走 Raspberry Pi 上 shadowsocks-libev 的客户端。由于国内支持 Chromecast 的应用几乎没有,所以没必要再考虑访问国内网站的问题。
具体部署步骤,shadowsocks-libev 的官方说明已经详细说明了:
https://github.com/shadowsocks/shadowsocks-libev#advanced-usage
简单记录一下我的操作:
a)安装shadowsocks-libev,主要用到 ss-redir 。直接去GitHub下载源码编译安装吧:
https://github.com/shadowsocks/shadowsocks-libev
b)设置iptables:
# 建立新的链路
sudo iptables -t nat -N SHADOWSOCKS
# 跳过Shadowsocks服务器IP,这里假设为123.123.123.123
sudo iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN
# 跳过内网IP地址
sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
# 其他IP跳转到 ss-redir 的代理端口
sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
# 设置 Chromecast 利用代理访问外网
sudo iptables -t nat -A PREROUTING -s 192.168.11.10/32 -p tcp -j SHADOWSOCKS
设置完,记得保存iptables配置:
sudo iptables-save > /etc/iptables.rules
c)配置并启动 ss-redir,记得本地端口要设置为与上面的一致。
ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid
最后,重启一下Raspberry Pi ,应该所有配置都会生效了。