盒子
盒子
文章目录
  1. 树莓派折腾指南之使用 SSR 实现科学上网
    1. 编译 SSR 及基本配置
    2. 协议转换代理
    3. SSR 开机自启
    4. 设置 iptables 实现 nat 转发
    5. 开机自动加载规则
    6. 关闭全局代理
    7. 其他
  2. NEXT

树莓派折腾指南之使用 SSR 实现科学上网

树莓派折腾指南之使用 SSR 实现科学上网

p## 预备工作
首先确定你的 SSR 混淆加密方法,如果是 salsa20 或 chacha20 或 chacha20-ietf 就需要编译安装 libsodium 这个库。
其 github 地址是 libsodium ,编译安装的步骤如下:

首先安装 build-essential 软件包,其作用是提供编译程序必须软件包的列表信息,也即是,编译程序有了这个软件包它才能确定头文件在哪,才知道库函数在哪,还会下载依赖的软件包,最后才组成一个开发环境。
安装命令是:

1
sudo apt install build-essential

安装完成后,就是下载编译 libsodium 库了,首先你要去它的发布页,确定当前最新的发布版本,替代我下面的当前的 VERSION 。主要命令如下:

打开终端,首先定义两个变量,在命令行中输入:

1
2
VERSION='1.0.15'
CPUNUM=`cat /proc/cpuinfo | grep 'processor' | wc -l`

然后回到当前根目录,下载及解压源码包:

1
2
3
cd ~
wget -c "https://github.com/jedisct1/libsodium/releases/download/${VERSION}/libsodium-${VERSION}.tar.gz" # 慢慢等
tar xzf libsodium-${VERSION}.tar.gz

目录压栈,并进行编译安装,

1
2
3
4
5
pushd libsodium-${VERSION}
./configure
make -j${CPUNUM}
sudo make install
sudo ldconfig

出栈目录,并删除编译目录。

1
2
popd
rm -rf libsodium-${VERSION}*

关于 pushd,popd 等目录操作命令,具体可以参见 方便的目录切换——dirs、pushd、popd命令

编译 SSR 及基本配置

SSR 当前的 Python 版本的项目地址是 shadowsocksr

首先安装 m2crypto,git,supervisor 等相关依赖软件包:

1
sudo apt install m2crypto git supervisor libevent-dev

下载编译如下命令:

1
2
3
git clone -b manyuser https://github.com/shadowsocksr-backup/shadowsocksr
cd ~/shadowsocksr
bash initcfg.sh

等待完成之后,编辑配置文件,在命令行输入:

1
sudo nano user-config.json

具体参数的意义及作用,参照 config.json

local_address 和 local_port 不需要修改,其余的按照 Wiki 修改,基本上配置好: server 填服务器地址
server_port 填服务器端口
password 密码
method 加密方法
obfs 混淆插件
protocol 协议插件
等关键参数,具体看你的 SSR 服务端的设置。

编辑好后,运行一下命令测试一下是否能运行

1
python shadowsocks/local.py

没报错的话 Ctrl+C 结束继续下一步,如果有报错继续改配置文件。

协议转换代理

因为 SS 系的协议走的是 Socks5 协议,对于 Terminal 的 get,wget 等走 Http 协议的地方是无能为力的,所以需要转换成 Http 代理。
此时可以选择使用 redsocks 来实现。

下载编译的命令如下:

1
2
3
4
5
6
7
cd ~
git clone https://github.com/darkk/redsocks
pushd redsocks
make
cp redsocks.conf.example redsocks.conf
sed -i "s/ip = example.org/ip = 127.0.0.1/" redsocks.conf
popd

SSR 开机自启

首先新建一个用户专门用来运行 SSR 和 redsocks 的账号:

1
sudo useradd -M -s /sbin/nologin ss

然后使用 supervisor 守护进程和开机自启,直接将下面的命令全部粘贴进入命令行回车即可。

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
sudo bash -c "cat > /etc/supervisor/conf.d/ss.conf" <<EOF
[program:ss]
directory = /home/pi/shadowsocksr/shadowsocks
command = python /home/pi/shadowsocksr/shadowsocks/local.py
autostart = true
autorestart = true
startsecs = 10
startretries = 36
user = ss
redirect_stderr = true
stdout_logfile = /dev/null
EOF
sudo bash -c "cat > /etc/supervisor/conf.d/redsocks.conf" <<EOF
[program:redsocks]
directory = /home/pi/redsocks
command = /home/pi/redsocks/redsocks -c /home/pi/redsocks/redsocks.conf
autostart = true
autorestart = true
startsecs = 10
startretries = 36
user = ss
redirect_stderr = true
stdout_logfile = /dev/null
EOF
sudo supervisorctl update

上面的配置把 log 全部扔掉了,如果有需要的可以自己改 stdout_logfile 项。

设置 iptables 实现 nat 转发

主要步骤如下,
首先创建一个叫 REDSOCKS 的链

1
sudo iptables -t nat -N REDSOCKS

然后进行基本的规则定制,首先忽略服务器的地址,下面的 server_ip 填服务器 ip 或域名,这里和 SSR 配置文件里的 server 值要一样

1
sudo iptables -t nat -A REDSOCKS -d server_ip -j RETURN

然后忽略本地地址

1
2
3
4
5
6
7
8
sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN

除了除上面之外的所有流量都转发到 socks 的本地端口:

1
sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

之后应用上面的规则,将 OUTPUT 出去的 tcp 流量全部经过 REDSOCKS 链

1
sudo iptables -t nat -A OUTPUT -p tcp -j REDSOCKS

保存规则

1
sudo bash -c "iptables-save > /etc/iptables.up.rules"

开机自动加载规则

1
2
3
4
sudo bash -c "cat > /etc/network/if-pre-up.d/iptables" <<EOF
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
EOF

添加执行权限

1
sudo chmod +x /etc/network/if-pre-up.d/iptables

使用

1
curl myip.ipip.net

可以查看当前的ip,如果是你的服务器 IP 就表示可以了。
比如:

关闭全局代理

执行下面的命令

1
2
3
4
5
6
7
8
9
10
11
12
# 下面的server_ip填服务器ip或域名,和上面添加的值要一样
sudo iptables -t nat -D REDSOCKS -d server_ip -j RETURN
sudo iptables -t nat -D REDSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -D REDSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -D REDSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -D REDSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -D REDSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -D REDSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -D REDSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -D REDSOCKS -d 240.0.0.0/4 -j RETURN
sudo iptables -t nat -D REDSOCKS -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -D OUTPUT -p tcp -j REDSOCKS

其他

更多关 iptables 的学习可以去 iptables应用:NAT、数据报处理、清空iptables规则

NEXT

  1. 实现了科学上网之后,下一步就可以 Google Assistant 的安装和试用,把你的树莓派变身成为一个 Google Home
  2. 接入 HomeKit,连入小米家具全家桶,让树莓派变身成为你的智能家居中枢。
支持一下
扫一扫,支持我