使用树莓派打造翻墙路由器:从开始到放弃

之前买了一块树莓派一直闲置着,本着折腾不浪费的精神,遂决定把它改造成一个可以科学上网的无线路由器。

准备清单:

  1. 树莓派一枚
  2. 无线网卡一枚,型号:EP-N8508GS,芯片是 Realtek RTL8188CUS
  3. micro SD 卡一枚,至少4G
  4. 树莓派官方系统Raspbian镜像
  5. 电脑若干
  6. USB电源线和网线各一条

这里需要注意的是我使用的无线网卡,芯片因为是 Realtek RTL8188CUS ,需要特殊处理,所以一开始花费了好多时间处理处理。为什么使用该芯片呢?首先,便宜;其次,很早以前就买好了。当然如果你是土豪,类似下面这位,你可以买一个兼容的芯片。

刷机

刷机使用的是Windows电脑,Linux电脑也是能够刷机的,之前刷OpenWRT系统的时候使用过,Mac系统还没试过。

从树莓派官方网站下载最新版本的 Raspbian 系统镜像,这里用的版本是 RASPBIAN JESSIE 完全版。

电脑上下载 Win32DiskImager ,用来把镜像写入SD卡中。

Raspbian系统配置

raspi-confing

在终端中输入命令,会弹出上图的配置窗口。

1
sudo raspi-config

主要配置以下几项:

  • 1 Expand Filesystem
  • 2 Change User Password
  • 5 Internationalisation Options
    • I1 Change Locale
    • I2 Change Timezone
    • I3 Change Keyboard Layout
    • I4 Change Wi-fi Country
  • 9 Advanced Options
    • A3 Memory Split:如果只是当做路由器使用,可以把GPU的内存改小点。我这里的设置是32.
    • A0 Update:这一步需要系统联网

重启电脑:

1
sudo shutdown -r now

安装并配置 hostapd

hostapd 可以让无线网卡变成信号发射器,如果你的芯片是官方支持的,可以直接从软件源中安装:

1
sudo apt-get install hostapd

我这边使用的无线网卡的芯片是官方不支持的,所以得自己安装。

1
2
3
4
5
6
7
8
9
10
11
12
wget https://codeload.github.com/jenssegers/RTL8188-hostapd/zip/v2.0
tar -zxvf v2.0.tar.gz
cd RTL8188-hostapd-2.0/hostapd
sudo make
sudo make install
# 启动命令
sudo service hostapd restart

打开 hostapd 的配置文件,配置 ssid(Wi-fi名称)、wpa_passphrase(Wi-fi密码)

1
sudo nano /etc/hostapd/hostapd.conf

以下是我的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Basic configuration
interface=wlan0
ssid=CIL-F2E
channel=1
#bridge=br0
# WPA and WPA2 configuration
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=*********
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
# Hardware configuration
driver=rtl871xdrv
ieee80211n=1
hw_mode=g
device_name=RTL8192CU
manufacturer=Realtek

重启 hostapd 服务,并设置开机启动

1
2
sudo service hostapd restart
sudo update-rc.d hostapd defaults

安装并配置 udhcpd

udhcpd 可以让链接到Wi-fi设备的客户端通过DHCP获取到IP地址。

1
sudo apt-get install udhcpd

修改 udhcpd 的配置文件 /etc/udhcpd.conf

  • start 和 end: DHCP 分配的 IP 段的起始和结束 IP
  • interface:修改成上一步配置的interface
  • opt dns: DNS
  • option subnet:子网掩码
  • opt router:路由器 IP

以下是我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Sample udhcpd configuration file (/etc/udhcpd.conf)
# The start and end of the IP lease block
start 192.168.37.1 #default: 192.168.0.20
end 192.168.37.254 #default: 192.168.0.254
# The interface that udhcpd will use
interface wlan0 #default: eth0
#Examles
opt dns 114.114.114.114
option subnet 255.255.255.0
opt router 192.168.37.1
#opt wins 192.168.37.10
option dns 8.8.8.8 # appened to above DNS servers for a total of 3
#option domain local
option lease 864000 # 10 days of seconds

接着修改 /etc/default/udhcpd,注释掉 DHCPD_ENABLED="no" 这一行。

重启 udhcpd 服务,并设置开机启动

1
2
sudo service udhcpd restart
sudo update-rc.d udhcpd defaults

配置 iptables 和网络接口

打开网络接口配置文件 /etc/network/interfaces ,设置 wlan0 为静态IP:

1
2
3
4
5
6
7
8
9
10
11
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.37.1
netmask 255.255.255.0
# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

注意上面的 wlan0 配置,请勿加上 gateway 192.168.x.x 的配置,否则会导致其它设备连接得上树莓派,但是DNS解析不了的问题。

使生效:

1
2
sudo ifdown wlan0
sudo ifup wlan0

接着配置 iptables 。修改 /etc/sysctl.conf ,打开内核IP转发,在末尾添加:

1
net.ipv4.ip_forward=1

然后,添加 iptables 规则,将 wlan0 的包通过 eth0 转发,在命令行中输入下列命令

1
2
3
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

由于 iptables 设置重启后将消失,常用的方法是先保存下来,然后在启动的时候加载规则

1
2
# 备份 iptables规则
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

编辑 /etc/network/interfaces,添加下面这一行

1
2
# 启动的时候加载
up iptables-restore < /etc/iptables.ipv4.nat

以上,设置Wi-fi热点的配置就完成了,重启树莓派,用其它设备连接应该就能够上网了。

安装shadowsocks服务

shadowsocks 是科学上网的一种非常有用的工具。以下内容的前提是需要有一个shadowsocks账号。

1
2
3
4
#安装pip管理python包
sudo apt-get install python-pip python-m2crypto
#安装python版shadowsocks
sudo pip install shadowsocks

创建shadowsocks的配置文件,可以在任意目录。以下以 /etc/shadowsocks/config.json 为例。编辑如下内容

1
2
3
4
5
6
7
8
9
{
"server": "58.***.**.*",
"server_port": 8390,
"password": "********",
"method": "aes-256-cfb",
"local_address": "192.168.37.1",
"local_port": 1080,
"timeout": 60
}

设置开机启动。编辑 /etc/rc.local。在exit前添加以下代码:

1
/usr/local/bin/sslocal -c /etc/shadowsocks/config.json &

放弃

改造后的树莓派路由器服务并不稳定,经常会出现连接不了网络,需要重新启动才能继续上网。
另外本来打算将改造后的路由器放在公司使用,但是因为公司网络策略升级,不允许随意搭建私人路由器,所以也就放弃继续改造下去。

参考

  1. 树莓派raspbian安装配置
  2. 将树莓派打造成无线路由器
  3. Realtek RTL8188 based access point on Raspberry Pi
  4. shadowsocks树莓派翻墙
  5. deploy-shadowsocks-chinadns-redsocks-raspberry-pi
  6. securing-dns-traffic-in-china
  7. SSH隧道与端口转发及内网穿透