树莓派上的科学上网

树莓派上不论是raspbian的安装/更新,还是conda/pip的安装/更新,都因为科学原因不太稳定,因此可以先准备科学安装/更新环境。

1 系统安装及配置

1.1 Headless下的WiFi及ssh配置

因为要将树莓派当做网关用,所以用命令行就可以了,下载lite镜像。
按树莓派官方说明在SD卡上写入镜像,然后进行Headless配置:

配置WIFI,需要在SD卡根目录下新建一个名为wpa_supplicant.conf的文件:

1
touch /Volumes/boot/wpa_supplicant.conf

写入WIFI配置:

1
2
3
4
5
6
7
8
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="<YOUR-NETWORK-NAME>"
psk="<YOUR-NETWORK-PASSWORD>"
}

开启SSH,只需在SD卡根目录下新建一个名为ssh的空文件即可:

1
touch /Volumes/boot/ssh

配置完成后正常启动树莓派即可自动连接WIFI,SSH可以正常登录。
注:如果不知道设备IP,可以使用ping raspberry.local查找。

如果这个IP上曾经还有过其他树莓派前辈,那么要先删除本机上的ssh信任主机,比如我的树莓派一直用固定IP配在108上:

1
ssh-keygen -R 192.168.1.108

第一次用pi登录后默认密码为raspberry,应使用sudo raspi-config通过树莓派管理工具修改密码、主机名等信息,或是直接使用passwd修改密码。

1.2 换国内镜像源

解决升级慢或Cannot initiate the connection to mirrors.opencas.cn问题:

1
sudo vi /etc/apt/sources.list

修改sources.list,注释第一行,在最后添加国内镜像站:

1
2
deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contrib
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contrib

同样的:

1
sudo vi /etc/apt/sources.list.d/raspi.list

修改raspi.list,注释第一行,在最后添加:

1
deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main ui

也可以使用其他镜像站,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 中国科学技术大学
Raspbian http://mirrors.ustc.edu.cn/raspbian/raspbian/
# 阿里云
Raspbian http://mirrors.aliyun.com/raspbian/raspbian/
# 清华大学
Raspbian http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/
# 华中科技大学
Raspbian http://mirrors.hustunique.com/raspbian/raspbian/
Arch Linux ARM http://mirrors.hustunique.com/archlinuxarm/
# 华南农业大学(华南用户)
Raspbian http://mirrors.scau.edu.cn/raspbian/
# 大连东软信息学院源(北方用户)
Raspbian http://mirrors.neusoft.edu.cn/raspbian/raspbian/
# 重庆大学源(中西部用户)
Raspbian http://mirrors.cqu.edu.cn/Raspbian/raspbian/
# 中山大学 已跳转至中国科学技术大学源
Raspbian http://mirror.sysu.edu.cn/raspbian/raspbian/
# 新加坡国立大学
Raspbian http://mirror.nus.edu.sg/raspbian/raspbian

固件升级,谨慎操作,可能会踩到奇怪的编译坑

1
sudo rpi-update && sudo reboot -h now

软件包升级:

1
sudo apt-get update && time sudo apt-get upgrade && time sudo apt-get dist-upgrade

软件包清理,顺便装个vim:

1
2
sudo apt-get clean
sudo apt-get install -y vim

解决树莓派的locale警告:

1
sudo dpkg-reconfigure locales

选择生成en_GB.UTF-8en_US.UTF-8zh_CN.UTF-8

为空项设置值:

1
2
sudo update-locale LANGUAGE="en_GB.UTF-8"
sudo update-locale LC_ALL="en_GB.UTF-8"

2 搭建科学工具

2.1 安装SS

安装shadowsocks命令行客户端:

1
2
3
4
5
6
7
pip install shadowsocks
sudo apt-get install -y shadowsocks-libev
# 更新CPAN
sudo cpan install CPAN
# 重载CPAN
sudo cpan reload CPAN
sudo cpan Net::Shadowsocks

2.2 配置防火墙

安装UFW以方便调整防火墙策略,其实是我不会用iptables

1
sudo apt-get install ufw

更新防火墙策略:

1
2
3
4
5
sudo ufw allow proto tcp to 0.0.0.0/0 port 22 comment "sshd listen port"
sudo ufw allow proto tcp to 0.0.0.0/0 port 5900 comment "vnc server listen port"
sudo ufw allow proto tcp to 0.0.0.0/0 port 1080 comment "Shadowsocks server listen port"
sudo ufw default deny
sudo ufw enable

2.3 socks5代理

/etc/shadowsocks-libev/xxx.json下配置科学上网服务器:

1
2
3
4
5
6
7
8
9
{
"server": "<your-remote-server>",
"server_port": <your-remote-server-port>,
"timeout": 60,
"password": "<your-password>",
"method": "aes-256-cfb",
"local_address": "0.0.0.0",
"local_port": 1080
}

检查默认端口占用,通常SS安装完成后会自动使用默认配置(/etc/shadowsocks-libev/config.json)启动ss-server进程,因此8388端口通常会被占用。
而我们在树莓派上使用SS仅仅是为了加速,因此不需要启动ss-server:

1
sudo netstat -nap | grep 8388

停止默认ss服务端:

1
2
3
4
5
6
# 检查ss默认系统服务
systemctl list-unit-files # 或 systemctl -a
systemctl status shadowsocks-libev.service
sudo systemctl stop shadowsocks-libev.service
sudo systemctl disable shadowsocks-libev.service
systemctl status shadowsocks-libev.service

启动ss客户端:

1
2
3
4
# 后台
nohup ss-local -v -c /etc/shadowsocks-libev/xxx.json &
# 或前台
ss-local -v -s <your-remote-server> -p <your-remote-server-port> -l 1080 -k <your-password> -m aes-256-cfb

测试ss客户端的socks5是否正常:

1
curl -I --socks5 localhost:1080 google.com

停止ss客户端:

1
sudo kill -TERM 5914 && rm nohup.out

编写快捷脚本:

启动脚本ss-s

1
2
sudo touch /usr/local/bin/ss-s
sudo chmod +x /usr/local/bin/ss-s

1
2
3
4
#!/bin/bash

nohup ss-local -v -c /etc/shadowsocks-libev/xxx.json > ~/nohup.log 2>&1 &
echo $! > ~/ss-pid.txt

停止ss-t

1
2
sudo touch /usr/local/bin/ss-t
sudo chmod +x /usr/local/bin/ss-t

1
2
3
4
#!/bin/bash

kill -s TERM `cat ~/ss-pid.txt`
rm ~/ss-pid.txt

2.4 proxychains-ng

ProxyChains是一个使用方便的代理工具,它只会代理指定的程序,下载:

1
git clone https://github.com/rofl0r/proxychains-ng

安装:

1
2
3
4
5
cd proxychains-ng/
./configure --prefix=/usr --sysconfdir=/etc
make
sudo make install
sudo make install-config

配置/etc/proxychains.conf,将最后一行修改为shadowsocks的端口:

1
socks5 127.0.0.1 1080

测试wget,返回网页源码:

1
proxychains4 wget -qO- https://www.google.com

2.5 http代理

有些程序并不像curl那样能够直接支持socks5代理,有时,按照情况需要配置http代理。
安装privoxy,开启全局http代理,其默认代理地址为http://127.0.0.1:8118

1
2
3
4
5
6
7
8
9
sudo apt-get install privoxy
sudo -s
echo 'forward-socks5 / 127.0.0.1:1080 .' >>/etc/privoxy/config
^D
systemctl status privoxy.service
#systemctl enable privoxy.service
#systemctl start privoxy.service
#systemctl restart privoxy.service
systemctl status privoxy.service

测试http代理:

1
wget -qO- -e use_proxy=yes -e http_proxy=127.0.0.1:8118 http://google.com

conda可能存在科学安装问题,因此可以临时设置代理环境变量:

1
2
export HTTP_PROXY="http://127.0.0.1:8118" && conda install -y scikit-image
unset HTTP_PROXY

或是配置.condarc的代理:

1
2
proxy_servers:
http: http://127.0.0.1:8118

3 云科学(要钱)

3.1 在AWS上部署Streisand

在aws中新建用户administrator,放入新建组Administrators,附加超级管理员权限AdministratorAccess
新建访问秘钥并下载,记住key id与key后删除秘钥。

aws启动Ubuntu 16.04实例,在安装pip时出现E: Unable to locate package python-pip

1
2
3
4
5
sudo apt-get install software-properties-common
sudo apt-add-repository universe
sudo apt-get update
sudo apt-get install python-pip
pip install --upgrade pip

软件包升级:sudo apt-get update && time sudo apt-get upgrade && time sudo apt-get dist-upgrade

查看系统地区设置locale,添加中文支持sudo locale-gen zh_CN.UTF-8
设置空项的值:

1
2
sudo update-locale LANGUAGE="en_US.UTF-8"
sudo update-locale LC_ALL="en_US.UTF-8"

在树莓派上安装Streisand的准备工作:
生成秘钥对:

1
ssh-keygen

安装git和vim:

1
2
sudo apt-get install git
sudo apt-get install vim

安装python编译依赖:

1
sudo apt install python-paramiko python-pip python-pycurl python-dev build-essential

安装ansible相关依赖:

1
sudo pip install ansible markupsafe

安装aws相关依赖:

1
sudo pip install boto boto3

下载Streisand源码并安装:

1
2
git clone https://github.com/StreisandEffect/streisand.git && cd streisand
./streisand

按要求填写aws的相关信息,等很久…部署完成…

拷贝generated-docs到一个能看HTML网页的机器上(我的树莓派是raspbian lite版本):

1
scp -r pi@<raspberrypi-ip>:streisand ~/Downloads

按照网页提示、按需求(iOS、Linux、Android等)一步一步操作。

在树莓派上,按streisand生成的generated-docs中的提示信息,填写shadowsocks的配置文件/etc/shadowsocks-libev/aws.json

1
2
3
4
5
6
7
8
9
{
"server":"<your-server-ip>",
"server_port":<your-server-port>,
"timeout":60,
"password":"<your-password>",
"method":"chacha20-ietf-poly1305",
"local_address":"0.0.0.0",
"local_port":1080
}

3.2 本机编译科学工具

由于树莓派上直接安装的shadowsocks不支持chacha20-ietf-poly1305加密算法,因此,需要从源码编译shadowsocks:

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
26
27
28
# Installation of basic build dependencies
sudo apt-get install --no-install-recommends gettext build-essential autoconf libtool libpcre3-dev asciidoc xmlto libev-dev libc-ares-dev automake libmbedtls-dev libsodium-dev

# Installation of Libsodium
export LIBSODIUM_VER=1.0.16
wget https://download.libsodium.org/libsodium/releases/libsodium-$LIBSODIUM_VER.tar.gz
tar xvf libsodium-$LIBSODIUM_VER.tar.gz
pushd libsodium-$LIBSODIUM_VER
./configure --prefix=/usr && make
sudo make install
popd
sudo ldconfig

# Installation of MbedTLS
export MBEDTLS_VER=2.12.0
wget https://tls.mbed.org/download/mbedtls-$MBEDTLS_VER-gpl.tgz
tar xvf mbedtls-$MBEDTLS_VER-gpl.tgz
pushd mbedtls-$MBEDTLS_VER
make SHARED=1 CFLAGS=-fPIC
sudo make DESTDIR=/usr install
popd
sudo ldconfig

# Start building
git submodule update --init --recursive
# ref: https://github.com/shadowsocks/shadowsocks-libev/issues/1177#issuecomment-319032195
./autogen.sh && ./configure --with-sodium-include=/usr/include --with-sodium-lib=/usr/local/lib --with-mbedtls-include=/usr/include --with-mbedtls-lib=/usr/lib && make
sudo make install

现在使用ss-local --help会发现加密算法支持chacha20-ietf-poly1305
使用

1
2
3
4
5
# 启动aws
nohup ss-local -v -c /etc/shadowsocks-libev/aws.json&
# 测试连接
curl -I --socks5 localhost:1080 google.com
# 返回301,成功

关于要钱:最便宜的EC2即可,一个月不到8刀吧……

分享到